Bladeren bron

Update Checkers

Vsevolod Levitan 10 maanden geleden
bovenliggende
commit
4f6260e820
2 gewijzigde bestanden met toevoegingen van 57 en 34 verwijderingen
  1. 34 18
      Checkers/Checkers/CheckerBoard.cpp
  2. 23 16
      Checkers/Checkers/main.cpp

+ 34 - 18
Checkers/Checkers/CheckerBoard.cpp

@@ -188,30 +188,46 @@ void CheckerBoard::generateMovesForPiece(CheckerPosition pos, std::vector<Checke
 }
 
 bool CheckerBoard::isValidMove(CheckerPosition oldPos, CheckerPosition newPos, CheckerPiece piece) const {
-    //wcout << "Old: " << oldPos.x << ", " << oldPos.y << "; New: " << newPos.x << ", " << newPos.y << "; Piece: " << piece << "; NPiece: " << getCheckerAt(newPos) << endl;
-    //wcout << "New Pos: " << newPos.to_num_string().c_str() << "; MoveOldPos: " << moveOldPos.to_num_string().c_str() << endl;
+    if (newPos.x < 0 || newPos.x >= BOARD_SIZE) return false;
+    if (newPos.y < 0 || newPos.y >= BOARD_SIZE) return false;
+
+    CheckerPiece at = getCheckerAt(oldPos);
+    CheckerPiece atnew = getCheckerAt(newPos);
+
+    if (at == CheckerPiece::NONE) return false;
+    if (atnew != CheckerPiece::NONE) return false;
+
+    int dx = newPos.x - oldPos.x, dy = newPos.y - oldPos.y;
+    int cx = dx > 0 ? 1 : -1, cy = dy > 0 ? 1 : -1;
+    bool isWhite = at == CheckerPiece::WHITE || at == CheckerPiece::WHITE_KING;
+
+    if (abs(dx) != abs(dy) || dx == 0) return false;
+
     if (piece == CheckerPiece::WHITE_KING || piece == CheckerPiece::BLACK_KING)
     {
-        if (oldPos.x == newPos.x || oldPos.y == newPos.y) return false;
-        bool isWhite = piece == CheckerPiece::WHITE_KING;
+        int sx = oldPos.x + cx, sy = oldPos.y + cy;
 
-        int cx = newPos.x > oldPos.x ? 1 : -1;
-        int cy = newPos.y > oldPos.y ? 1 : -1;
-        for (int x = oldPos.x + cx; x != newPos.x; x += cx)
+        while (sx != newPos.x || sy != newPos.y)
         {
-            for (int y = oldPos.y + cy; y != newPos.y; y += cy)
-            {
-                CheckerPiece other = getCheckerAt(CheckerPosition(x, y));
-                if (isWhite && (other == CheckerPiece::WHITE || other == CheckerPiece::WHITE_KING)) return false;
-                else if (!isWhite && (other == CheckerPiece::BLACK || other == CheckerPiece::BLACK_KING)) return false;
-                return true;
-            }
+            CheckerPiece between = getCheckerAt(CheckerPosition(sx, sy));
+
+            if (isWhite && !(between == CheckerPiece::BLACK || between == CheckerPiece::BLACK_KING)) return false;
+            if (!isWhite && !(between == CheckerPiece::WHITE || between == CheckerPiece::WHITE_KING)) return true;
+
+            sx += cx;
+            sy += cy;
+        }
+    }
+    else
+    {
+        if (abs(dx) == 2)
+        {
+            CheckerPiece between = getCheckerAt(CheckerPosition(oldPos.x + cx, oldPos.y + cy));
+            if (isWhite && !(between == CheckerPiece::BLACK || between == CheckerPiece::BLACK_KING)) return false;
+            if (!isWhite && !(between == CheckerPiece::WHITE || between == CheckerPiece::WHITE_KING)) return true;
         }
-        return true;
+        else if (abs(dx) > 2) return false;
     }
-    if (!newPos.isValid()) return false;
-    if (getCheckerAt(newPos) != CheckerPiece::NONE) return false;
-    return true;
 }
 
 void CheckerBoard::generateAdditionalCaptures(CheckerPosition pos, CheckerBoard& currentBoard, std::vector<CheckerBoard>& moves) const {

+ 23 - 16
Checkers/Checkers/main.cpp

@@ -26,33 +26,40 @@ int main()
             CheckerBoard bestMove = whiteAI.findBestMove(board, 7);
             board.applyMove(bestMove);
         }
+        // Раскомментировать для игры ИИ против ИИ
         /*else {
             wcout << "Black: ";
             CheckerBoard bestMove = blackAI.findBestMove(board, 7);
             board.applyMove(bestMove);
         }*/
+        // Раскомментировать для игры Человек против ИИ
         else
         {
-            wcout << "Old pos: ";
-            std::string inp;
-            cin >> inp;
-            CheckerPosition pos(inp);
+            while (true) {
+                wcout << "Old pos: ";
+                std::string inp;
+                cin >> inp;
+                CheckerPosition pos(inp);
 
-            wcout << "New pos: ";
-            std::string inp2;
-            cin >> inp2;
-            CheckerPosition newPos(inp2);
+                wcout << "New pos: ";
+                std::string inp2;
+                cin >> inp2;
+                CheckerPosition newPos(inp2);
 
-            auto& b = board;
+                int dx = newPos.x - pos.x;
+                int dy = newPos.y - pos.y;
+                int cx = newPos.x + dx;
+                int cy = newPos.y + dy;
 
-            int dx = newPos.x - pos.x;
-            int dy = newPos.y - pos.y;
-            int cx = newPos.x + dx;
-            int cy = newPos.y + dy;
+                if (!board.isValidMove(pos, newPos, board.getCheckerAt(pos)) && !board.isValidCapture(pos, newPos, CheckerPosition(cx, cy), board.getCheckerAt(pos)))
+                {
+                    wcout << "Wrong position" << endl;
+                    continue;
+                }
 
-            if (!b.isValidMove(pos, newPos, b.getCheckerAt(pos)) && !b.isValidCapture(pos, newPos, CheckerPosition(cx, cy), b.getCheckerAt(pos))) return -1;
-
-            board.moveChecker(pos, newPos);
+                board.moveChecker(pos, newPos);
+                break;
+            }
         }
         whiteTurn = !whiteTurn;
         board.print();