Change default Shogi notation
authorFabian Fichter <ianfab@users.noreply.github.com>
Sat, 9 May 2020 21:36:31 +0000 (23:36 +0200)
committerFabian Fichter <ianfab@users.noreply.github.com>
Sat, 9 May 2020 21:36:31 +0000 (23:36 +0200)
Introduce Hodges notation with number-number format (gbtami/pychess-variants#239).

src/pyffish.cpp
test.py

index 9d555ab..f4bab02 100644 (file)
@@ -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 (file)
--- 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)