From 4dae9e3ed964bdf72a2987d218c23d9b21284b50 Mon Sep 17 00:00:00 2001 From: ianfab Date: Sun, 1 Jul 2018 14:39:44 +0200 Subject: [PATCH] EuroShogi WIP Promotion rules, pawn drop restrictions, and perpetuals not implemented yet. --- src/bitboard.cpp | 30 ++++++++++++++++++++++++++++++ src/psqt.cpp | 6 ++++-- src/types.h | 7 ++++++- src/variant.cpp | 18 ++++++++++++++++++ 4 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/bitboard.cpp b/src/bitboard.cpp index ae617c8..4dbb34a 100644 --- a/src/bitboard.cpp +++ b/src/bitboard.cpp @@ -160,6 +160,11 @@ void Bitboards::init() { { -17, -15, -10, -6, 6, 10, 15, 17 }, // amazon {}, // knibis { -17, -15, -10, -6, 6, 10, 15, 17 }, // biskni + { 8 }, // shogi pawn + {}, // lance + { 15, 17 }, // shogi knight + { -1, 1, 15, 17 }, // euroshogi knight + { -8, -1, 1, 7, 8, 9 }, // gold { -9, -8, -7, -1, 1, 7, 8, 9 } // king }; int stepsQuiet[][13] = { @@ -176,6 +181,11 @@ void Bitboards::init() { { -17, -15, -10, -6, 6, 10, 15, 17 }, // amazon { -17, -15, -10, -6, 6, 10, 15, 17 }, // knibis {}, // biskni + { 8 }, // shogi pawn + {}, // lance + { 15, 17 }, // shogi knight + { -1, 1, 15, 17 }, // euroshogi knight + { -8, -1, 1, 7, 8, 9 }, // gold { -9, -8, -7, -1, 1, 7, 8, 9 } // king }; Direction sliderCapture[][9] = { @@ -192,6 +202,11 @@ void Bitboards::init() { { NORTH, EAST, SOUTH, WEST, NORTH_EAST, SOUTH_EAST, SOUTH_WEST, NORTH_WEST }, // amazon { NORTH_EAST, SOUTH_EAST, SOUTH_WEST, NORTH_WEST }, // knibis {}, // biskni + {}, // shogi pawn + { NORTH }, // lance + {}, // shogi knight + {}, // euroshogi knight + {}, // gold {} // king }; Direction sliderQuiet[][9] = { @@ -208,6 +223,11 @@ void Bitboards::init() { { NORTH, EAST, SOUTH, WEST, NORTH_EAST, SOUTH_EAST, SOUTH_WEST, NORTH_WEST }, // amazon {}, // knibis { NORTH_EAST, SOUTH_EAST, SOUTH_WEST, NORTH_WEST }, // biskni + {}, // shogi pawn + { NORTH }, // lance + {}, // shogi knight + {}, // euroshogi knight + {}, // gold {} // king }; int sliderDistCapture[] = { @@ -224,6 +244,11 @@ void Bitboards::init() { 7, // amazon 7, // knibis 0, // biskni + 0, // shogi pawn + 7, // lance + 0, // shogi knight + 0, // euroshogi knight + 0, // gold 0 // king }; int sliderDistQuiet[] = { @@ -240,6 +265,11 @@ void Bitboards::init() { 7, // amazon 0, // knibis 7, // biskni + 0, // shogi pawn + 7, // lance + 0, // shogi knight + 0, // euroshogi knight + 0, // gold 0 // king }; diff --git a/src/psqt.cpp b/src/psqt.cpp index c921636..a743157 100644 --- a/src/psqt.cpp +++ b/src/psqt.cpp @@ -24,9 +24,11 @@ Value PieceValue[PHASE_NB][PIECE_NB] = { { VALUE_ZERO, PawnValueMg, KnightValueMg, BishopValueMg, RookValueMg, QueenValueMg, - FersValueMg, AlfilValueMg, SilverValueMg, AiwokValueMg, AmazonValueMg, KnibisValueMg, BiskniValueMg }, + FersValueMg, AlfilValueMg, SilverValueMg, AiwokValueMg, AmazonValueMg, KnibisValueMg, BiskniValueMg, + ShogiPawnValueMg, LanceValueMg, ShogiKnightValueMg, EuroShogiKnightValueMg, GoldValueMg }, { VALUE_ZERO, PawnValueEg, KnightValueEg, BishopValueEg, RookValueEg, QueenValueEg, - FersValueEg, AlfilValueEg, SilverValueEg, AiwokValueEg, AmazonValueEg, KnibisValueMg, BiskniValueMg } + FersValueEg, AlfilValueEg, SilverValueEg, AiwokValueEg, AmazonValueEg, KnibisValueMg, BiskniValueMg, + ShogiPawnValueEg, LanceValueEg, ShogiKnightValueEg, EuroShogiKnightValueEg, GoldValueEg } }; namespace PSQT { diff --git a/src/types.h b/src/types.h index 074da9c..9165fb0 100644 --- a/src/types.h +++ b/src/types.h @@ -202,6 +202,11 @@ enum Value : int { AmazonValueMg = 3000, AmazonValueEg = 3000, KnibisValueMg = 800, KnibisValueEg = 800, BiskniValueMg = 800, BiskniValueEg = 800, + ShogiPawnValueMg = 100, ShogiPawnValueEg = 100, + LanceValueMg = 300, LanceValueEg = 300, + ShogiKnightValueMg = 300, ShogiKnightValueEg = 300, + EuroShogiKnightValueMg = 400, EuroShogiKnightValueEg = 400, + GoldValueMg = 600, GoldValueEg = 600, MidgameLimit = 15258, EndgameLimit = 3915 }; @@ -211,7 +216,7 @@ const int PIECE_TYPE_BITS = 5; // PIECE_TYPE_NB = pow(2, PIECE_TYPE_BITS) enum PieceType { NO_PIECE_TYPE, PAWN, KNIGHT, BISHOP, ROOK, QUEEN, FERS, MET = FERS, ALFIL, SILVER, KHON = SILVER, AIWOK, - AMAZON, KNIBIS, BISKNI, KING, + AMAZON, KNIBIS, BISKNI, SHOGI_PAWN, LANCE, SHOGI_KNIGHT, EUROSHOGI_KNIGHT, GOLD, KING, ALL_PIECES = 0, PIECE_TYPE_NB = 1 << PIECE_TYPE_BITS diff --git a/src/variant.cpp b/src/variant.cpp index 6fa79fc..dc6209a 100644 --- a/src/variant.cpp +++ b/src/variant.cpp @@ -164,6 +164,23 @@ void VariantMap::init() { v->dropLoop = true; return v; } (); + const Variant* euroshogi = [&]{ + Variant* v = new Variant(); + v->reset_pieces(); + v->set_piece(SHOGI_PAWN, 'p'); + v->set_piece(EUROSHOGI_KNIGHT, 'n'); + v->set_piece(GOLD, 'g'); + v->set_piece(BISHOP, 'b'); + v->set_piece(ROOK, 'r'); + v->set_piece(KING, 'k'); + v->startFen = "1nbgkgn1/1r4b1/pppppppp/8/8/PPPPPPPP/1B4R1/1NGKGBN1[-] w 0 1"; + v->pieceDrops = true; + v->promotionPieceTypes = {}; + v->doubleStep = false; + v->castling = false; + // TODO: piece promotions, illegal pawn drops + return v; + } (); insert(std::pair(std::string("chess"), chess)); insert(std::pair(std::string("makruk"), makruk)); insert(std::pair(std::string("asean"), asean)); @@ -178,6 +195,7 @@ void VariantMap::init() { insert(std::pair(std::string("5check"), fivecheck)); insert(std::pair(std::string("crazyhouse"), crazyhouse)); insert(std::pair(std::string("loop"), loop)); + insert(std::pair(std::string("euroshogi"), euroshogi)); } void VariantMap::clear_all() { -- 1.7.0.4