public bool IsMateAfterMove(string move, Vectors vector) { bool result; PieceMove pieceMove = new PieceMove(inGameColor, move); ForsythEdwardsNotation copyN = (ForsythEdwardsNotation)desk.notation.Clone(); Desk copyDesk = new Desk(copyN); Moves copyMoves = new Moves(copyDesk); copyDesk.UpdatePiecesOnDesk(pieceMove, inGameColor); ChessPlayer op = new Bot(inGameColor.FlipColor(), copyMoves, copyDesk); result = copyDesk.IsKingInDanger(copyMoves.GetPlayerMoves(op.playerColor), inGameColor); if (result && vector.status != "recalculate") { vector.status = "recalculate"; RecalculatedPiecesPosition.Add(pieceMove.from); } return(result); }
//Обновление списков векторов private void UpdateMovesLists(string from, string to, ref List <Vectors> activePlayerMoves, ref List <Vectors> waitingPlayerMoves) { for (int i = 0; i < activePlayerMoves.Count; i++) { Vectors vector = activePlayerMoves[i]; if (vector.status == "normal" && InvalidVector(vector, from, to)) { activePlayerMoves[i].status = "recalculate"; } } for (int i = 0; i < waitingPlayerMoves.Count; i++) { Vectors vector = waitingPlayerMoves[i]; if (vector.status == "normal" && InvalidVector(vector, from, to)) { waitingPlayerMoves[i].status = "recalculate"; } } for (int i = 0; i < activePlayerMoves.Count; i++) { Vectors vector = activePlayerMoves[i]; if (vector.status == "recalculate") { activePlayerMoves[i] = RecalculateVector(vector); } } for (int i = 0; i < waitingPlayerMoves.Count; i++) { Vectors vector = waitingPlayerMoves[i]; if (vector.status == "recalculate") { waitingPlayerMoves[i] = RecalculateVector(vector); } } }
//просчет всех возможных ходов фигуры internal Vectors GetPieceMoves(Desk desk, Square ownSquare) { Square[,] avaibleSquares = new Square[8, 8]; movesVector = new Vectors { startPosition = ownSquare.Name, vectorPieceKey = pieceKey }; for (int y = 7; y >= 0; y--) { for (int x = 0; x < 8; x++) { avaibleSquares[x, y] = new Square(x, y); } } avaibleSquares = CanFigureMove(avaibleSquares, desk, ownSquare); //добавляем ходы в список foreach (Square sq in avaibleSquares) { if (sq != Square.none) { string sqName = sq.Name; if ((pieceKey == whitePawn || pieceKey == blackPawn) && (sqName.Contains('1') || sqName.Contains('8')))//превращение пешки { string pawnTransfMoves = (pieceColor == Color.white) ? sqName + (char)whiteQueen + " " + sqName + (char)whiteKnight + " " + sqName + (char)whiteRook + " " + sqName + (char)whiteBishop : sqName + (char)blackQueen + " " + sqName + (char)blackKnight + " " + sqName + (char)blackRook + " " + sqName + (char)blackBishop; movesVector.avaibleSquares.AddRange(pawnTransfMoves.Split()); } else//обычные ходы { movesVector.avaibleSquares.Add(sqName); } } } return(movesVector); }
internal void UpdateMoves(PieceMove pieceMove = null) { RecalculatedPiecesPosition.Clear(); inGameColor = desk.notation.InGameColor; List <Vectors> activePlayerMoves = (inGameColor == Color.white) ? whiteMoves : blackMoves;; List <Vectors> waitingPlayerMoves = (inGameColor == Color.white) ? blackMoves : whiteMoves;; Vectors wKingVector = whiteMoves.Find(item => item.vectorPieceKey == whiteKing); Vectors bKingVector = blackMoves.Find(item => item.vectorPieceKey == blackKing); wKingVector.avaibleSquares.Remove("0-0-0"); wKingVector.avaibleSquares.Remove(" 0-0 "); bKingVector.avaibleSquares.Remove("0-0-0"); bKingVector.avaibleSquares.Remove(" 0-0 "); if (pieceMove.castling != "none") { CastlingMoveUpdate(pieceMove, ref activePlayerMoves, ref waitingPlayerMoves); } else { UsualMoveUpdate(pieceMove, ref activePlayerMoves, ref waitingPlayerMoves); } for (int i = 0; i < activePlayerMoves.Count; i++) { Vectors vector = activePlayerMoves[i]; vector.avaibleSquares.RemoveAll(item => IsMateAfterMove((char)vector.vectorPieceKey + vector.startPosition + item, vector)); } CheckCastling(inGameColor); CheckCastling(inGameColor.FlipColor()); movesStory.Add(pieceMove.name); }
public void CheckCastling(Color kingColor) { Square ksq = desk.FindKing(kingColor);; King k = (King)ksq.ownedPiece; Vectors kingVector = (kingColor == Color.white) ? whiteMoves.Find(item => item.vectorPieceKey == whiteKing) : blackMoves.Find(item => item.vectorPieceKey == blackKing); if (!IsCheck()) { if (k.CanMakeShortCastling(desk.deskSquares, ksq)) { if (k.pieceColor == Color.black && !IsMateAfterMove("ke8f8", kingVector) && !IsMateAfterMove("ke8g8", kingVector)) { kingVector.avaibleSquares.Add(" 0-0 "); } if (k.pieceColor == Color.white && !IsMateAfterMove("ke1f1", kingVector) && !IsMateAfterMove("ke1g1", kingVector)) { kingVector.avaibleSquares.Add(" 0-0 "); } } if (k.CanMakeLongCastling(desk.deskSquares, ksq)) { if (k.pieceColor == Color.black && !IsMateAfterMove("ke8d8", kingVector) && !IsMateAfterMove("ke8c8", kingVector)) { kingVector.avaibleSquares.Add("0-0-0"); } if (k.pieceColor == Color.white && !IsMateAfterMove("ke1d1", kingVector) && !IsMateAfterMove("ke1c1", kingVector)) { kingVector.avaibleSquares.Add("0-0-0"); } } } }
//Проверка на невалидность вектора internal bool InvalidVector(Vectors vector, string from, string to) { if (vector.occupiedSquares.Exists(item => item.Contains(from)) || vector.occupiedSquares.Exists(item => item.Contains(to)) || vector.avaibleSquares.Exists(item => item.Contains(from)) || vector.avaibleSquares.Exists(item => item.Contains(to))) { return(true); } if (desk.notation.EnPassant != "-" && vector.vectorPieceKey == (inGameColor == Color.white ? whitePawn : blackPawn) && vector.occupiedSquares.Exists(item => item == desk.notation.EnPassant)) { return(true); } string kSquareName = desk.curKilledPieceSquare; if (kSquareName != "none" && kSquareName != to && (vector.occupiedSquares.Exists(item => item.Contains(kSquareName)) || vector.avaibleSquares.Exists(item => item.Contains(kSquareName)))) { return(true); } return(false); }