EuroShogi WIP
authorianfab <ianfab@users.noreply.github.com>
Sun, 1 Jul 2018 12:39:44 +0000 (14:39 +0200)
committerianfab <ianfab@users.noreply.github.com>
Sun, 1 Jul 2018 12:49:01 +0000 (14:49 +0200)
Promotion rules, pawn drop restrictions, and perpetuals not implemented yet.

src/bitboard.cpp
src/psqt.cpp
src/types.h
src/variant.cpp

index ae617c8..4dbb34a 100644 (file)
@@ -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
   };
 
index c921636..a743157 100644 (file)
 
 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 {
index 074da9c..9165fb0 100644 (file)
@@ -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
index 6fa79fc..dc6209a 100644 (file)
@@ -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, const Variant*>(std::string("chess"), chess));
     insert(std::pair<std::string, const Variant*>(std::string("makruk"), makruk));
     insert(std::pair<std::string, const Variant*>(std::string("asean"), asean));
@@ -178,6 +195,7 @@ void VariantMap::init() {
     insert(std::pair<std::string, const Variant*>(std::string("5check"), fivecheck));
     insert(std::pair<std::string, const Variant*>(std::string("crazyhouse"), crazyhouse));
     insert(std::pair<std::string, const Variant*>(std::string("loop"), loop));
+    insert(std::pair<std::string, const Variant*>(std::string("euroshogi"), euroshogi));
 }
 
 void VariantMap::clear_all() {