예제 #1
0
        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);
        }
예제 #2
0
        //Обновление списков векторов
        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);
                }
            }
        }
예제 #3
0
        //просчет всех возможных ходов фигуры
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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");
                    }
                }
            }
        }
예제 #6
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);
        }