Nicolas Winkler 7 年之前
父节点
当前提交
77a07232a7
共有 4 个文件被更改,包括 29 次插入12 次删除
  1. 6 0
      src/ChessGame.cpp
  2. 17 8
      src/Minimax.cpp
  3. 4 2
      src/MoveGeneration.cpp
  4. 2 2
      src/Search.h

+ 6 - 0
src/ChessGame.cpp

@@ -152,6 +152,12 @@ UndoInfo ChessGame::doMove(const MoveInfo& mi)
 {
     UndoInfo ui;
     ui.before = board;
+
+    if (mi.movedPiece == KING) {
+        canCastleKingSide[turn] = false;
+        canCastleQueenSide[turn] = true;
+    }
+
     board.move(mi.move);
     turn = otherSide(turn);
     moveCount++;

+ 17 - 8
src/Minimax.cpp

@@ -2,6 +2,8 @@
 #include "ChessGame.h"
 #include "Search.h"
 
+#include <iostream>
+
 #include <functional>
 #include <limits>
 
@@ -11,24 +13,31 @@ using namespace chessy;
 size_t Perft::search(void)
 {
     size_t result = 0;
-    auto searcher = [&result] (const MoveInfo& mi, ChessGame& cg, int depth) {
+    std::function<void(const MoveInfo&, ChessGame&, int, bool)> searcher;
+    searcher = [&result, &searcher] (const MoveInfo& mi, ChessGame& cg, int depth, bool print) {
         if (depth > 1) {
             UndoInfo ui = cg.doMove(mi);
-            Perft p{ depth - 1, cg };
-            result += p.search();
+            Search<decltype(searcher)&> search (searcher, cg);
+            size_t interRes = result;
+            if (cg.getTurn() == WHITE_SIDE)
+                search.iterateAll<WHITE_SIDE>(cg, depth - 1, false);
+            else 
+                search.iterateAll<BLACK_SIDE>(cg, depth - 1, false);
+            if (print)
+                std::cout << mi.move.asString() << ": " << (result - interRes) << std::endl;
+
             cg.undoMove(ui);
         }
         else {
             result++;
         }
     };
-
-    Search<decltype(searcher)> search (searcher, chessGame);
-
+    Search<decltype(searcher)&> search (searcher, chessGame);
     if (chessGame.getTurn() == WHITE_SIDE)
-        search.iterateAll<WHITE_SIDE>(chessGame, depth);
+        search.iterateAll<WHITE_SIDE>(chessGame, depth, true);
     else 
-        search.iterateAll<BLACK_SIDE>(chessGame, depth);
+        search.iterateAll<BLACK_SIDE>(chessGame, depth, true);
+
 
     return result;
 }

+ 4 - 2
src/MoveGeneration.cpp

@@ -63,8 +63,10 @@ typename PawnDoublePushGenerator<side>::MoveIterator
         movedPieces.moveNorth(2);
     else
         movedPieces.moveSouth(2);
-    
-    movedPieces &= ~board.getOccupied();
+
+    Bitboard occupied = board.getOccupied();
+    occupied |= side == WHITE_SIDE ? occupied.northOne() : occupied.southOne();
+    movedPieces &= ~occupied;
 
     return MoveIterator{ movedPieces };
 }

+ 2 - 2
src/Search.h

@@ -16,13 +16,13 @@ namespace chessy
 template<typename T>
 class chessy::Search
 {
-    T& handler;
+    T handler;
     ChessGame& game;
     Board& board;
     Bitboard whites;
     Bitboard blacks;
 public:
-    inline Search(T& handler, ChessGame& game) :
+    inline Search(T&& handler, ChessGame& game) :
         handler{ handler }, game{ game }, board{ game.getBoard() },
         whites{ board.getWhites() }, blacks{ board.getBlacks() } {}