// 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
Notation default_notation(const Variant* v) {
if (v->variantTemplate == "shogi")
- return NOTATION_SHOGI_HODGES;
+ return NOTATION_SHOGI_HODGES_NUMBER;
return NOTATION_SAN;
}
};
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) {
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);
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)));
// 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))
}
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
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));
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)
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)
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)