From 938edbd9528ec078d488f1bc4dc45f124900aef6 Mon Sep 17 00:00:00 2001 From: Fabian Fichter Date: Sat, 9 May 2020 23:36:31 +0200 Subject: [PATCH] Change default Shogi notation Introduce Hodges notation with number-number format (gbtami/pychess-variants#239). --- src/pyffish.cpp | 12 ++++++++---- test.py | 10 ++++++++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/pyffish.cpp b/src/pyffish.cpp index 9d555ab..f4bab02 100644 --- a/src/pyffish.cpp +++ b/src/pyffish.cpp @@ -35,6 +35,7 @@ enum Notation { // https://en.wikipedia.org/wiki/Shogi_notation#Western_notation NOTATION_SHOGI_HOSKING, // Examples: P76, S’34 NOTATION_SHOGI_HODGES, // Examples: P-7f, S*3d + NOTATION_SHOGI_HODGES_NUMBER, // Examples: P-76, S*34 // http://www.janggi.pl/janggi-notation/ NOTATION_JANGGI, // https://en.wikipedia.org/wiki/Xiangqi#Notation @@ -43,7 +44,7 @@ enum Notation { Notation default_notation(const Variant* v) { if (v->variantTemplate == "shogi") - return NOTATION_SHOGI_HODGES; + return NOTATION_SHOGI_HODGES_NUMBER; return NOTATION_SAN; } @@ -55,7 +56,7 @@ enum Disambiguation { }; bool is_shogi(Notation n) { - return n == NOTATION_SHOGI_HOSKING || n == NOTATION_SHOGI_HODGES; + return n == NOTATION_SHOGI_HOSKING || n == NOTATION_SHOGI_HODGES || n == NOTATION_SHOGI_HODGES_NUMBER; } std::string piece(const Position& pos, Move m, Notation n) { @@ -85,6 +86,7 @@ std::string file(const Position& pos, Square s, Notation n) { switch (n) { case NOTATION_SHOGI_HOSKING: case NOTATION_SHOGI_HODGES: + case NOTATION_SHOGI_HODGES_NUMBER: return std::to_string(pos.max_file() - file_of(s) + 1); case NOTATION_JANGGI: return std::to_string(file_of(s) + 1); @@ -98,6 +100,7 @@ std::string file(const Position& pos, Square s, Notation n) { std::string rank(const Position& pos, Square s, Notation n) { switch (n) { case NOTATION_SHOGI_HOSKING: + case NOTATION_SHOGI_HODGES_NUMBER: return std::to_string(pos.max_rank() - rank_of(s) + 1); case NOTATION_SHOGI_HODGES: return std::string(1, char('a' + pos.max_rank() - rank_of(s))); @@ -234,7 +237,7 @@ const std::string move_to_san(Position& pos, Move m, Notation n) { // Separator/Operator if (type_of(m) == DROP) - san += (n == NOTATION_SHOGI_HODGES ? '*' : n == NOTATION_SHOGI_HOSKING ? '\'' : '@'); + san += n == NOTATION_SHOGI_HOSKING ? '\'' : is_shogi(n) ? '*' : '@'; else if (n == NOTATION_XIANGQI_WXF) { if (rank_of(from) == rank_of(to)) @@ -246,7 +249,7 @@ const std::string move_to_san(Position& pos, Move m, Notation n) { } else if (pos.capture(m)) san += 'x'; - else if (n == NOTATION_LAN || n == NOTATION_SHOGI_HODGES || (n == NOTATION_SHOGI_HOSKING && d == SQUARE_DISAMBIGUATION) || n == NOTATION_JANGGI) + else if (n == NOTATION_LAN || (is_shogi(n) && (n != NOTATION_SHOGI_HOSKING || d == SQUARE_DISAMBIGUATION)) || n == NOTATION_JANGGI) san += '-'; // Destination square @@ -632,6 +635,7 @@ PyMODINIT_FUNC PyInit_pyffish() { PyModule_AddObject(module, "NOTATION_LAN", PyLong_FromLong(NOTATION_LAN)); PyModule_AddObject(module, "NOTATION_SHOGI_HOSKING", PyLong_FromLong(NOTATION_SHOGI_HOSKING)); PyModule_AddObject(module, "NOTATION_SHOGI_HODGES", PyLong_FromLong(NOTATION_SHOGI_HODGES)); + PyModule_AddObject(module, "NOTATION_SHOGI_HODGES_NUMBER", PyLong_FromLong(NOTATION_SHOGI_HODGES_NUMBER)); PyModule_AddObject(module, "NOTATION_JANGGI", PyLong_FromLong(NOTATION_JANGGI)); PyModule_AddObject(module, "NOTATION_XIANGQI_WXF", PyLong_FromLong(NOTATION_XIANGQI_WXF)); diff --git a/test.py b/test.py index 2611232..97a3f62 100644 --- a/test.py +++ b/test.py @@ -314,13 +314,17 @@ class TestPyffish(unittest.TestCase): self.assertEqual(result, "e5f6=F") result = sf.get_san("shogi", SHOGI, "i3i4") - self.assertEqual(result, "P-1f") + self.assertEqual(result, "P-16") result = sf.get_san("shogi", SHOGI, "i3i4", False, sf.NOTATION_SHOGI_HOSKING) self.assertEqual(result, "P16") + result = sf.get_san("shogi", SHOGI, "f1e2", False, sf.NOTATION_SHOGI_HOSKING) + self.assertEqual(result, "G49-58") result = sf.get_san("shogi", SHOGI, "f1e2", False, sf.NOTATION_SHOGI_HODGES) self.assertEqual(result, "G4i-5h") + result = sf.get_san("shogi", SHOGI, "f1e2", False, sf.NOTATION_SHOGI_HODGES_NUMBER) + self.assertEqual(result, "G49-58") fen = "lnsgkgsnl/1r5b1/pppppp1pp/6p2/9/2P6/PP1PPPPPP/1B5R1/LNSGKGSNL w -" result = sf.get_san("shogi", fen, "b2h8", False, sf.NOTATION_SHOGI_HODGES) @@ -331,6 +335,8 @@ class TestPyffish(unittest.TestCase): fen = "lnsgkg1nl/1r5s1/pppppp1pp/6p2/9/2P6/PP1PPPPPP/7R1/LNSGKGSNL[Bb] w " result = sf.get_san("shogi", fen, "B@g7", False, sf.NOTATION_SHOGI_HODGES) self.assertEqual(result, "B*3c") + result = sf.get_san("shogi", fen, "B@g7", False, sf.NOTATION_SHOGI_HODGES_NUMBER) + self.assertEqual(result, "B*33") fen = "lnsgkg1nl/1r4s+B1/pppppp1pp/6p2/9/2P6/PP1PPPPPP/7R1/LNSGKGSNL[B] w " result = sf.get_san("shogi", fen, "h8g7", False, sf.NOTATION_SHOGI_HODGES) @@ -429,7 +435,7 @@ class TestPyffish(unittest.TestCase): self.assertEqual(result, SAN_moves) UCI_moves = ["c3c4", "g7g6", "b2h8"] - SAN_moves = ["P-7f", "P-3d", "Bx2b="] + SAN_moves = ["P-76", "P-34", "Bx22="] result = sf.get_san_moves("shogi", SHOGI, UCI_moves) self.assertEqual(result, SAN_moves) -- 1.7.0.4