예제 #1
0
        //Обновить инф. о положении фигур на доске (массивы фигур,клеток и взятых фигур)
        internal void UpdatePiecesOnDesk(PieceMove pieceMove, Color inGameColor)
        {
            curKilledPieceSquare = "none";
            Square kingSq = FindKing(inGameColor);
            King   k      = (King)kingSq.ownedPiece;

            if (pieceMove.name != " 0-0 " && pieceMove.name != "0-0-0")
            {
                int fromX = pieceMove.fromX; int fromY = pieceMove.fromY;
                int toX = pieceMove.toX; int toY = pieceMove.toY;

                //перемещение фигуры
                if (pieces[toX, toY] != Piece.nullPiece)
                {
                    pieces[toX, toY].movesVector.status = "delete";
                    curKilledPieceSquare = pieceMove.to;
                    deadPieces.Add((char)pieces[toX, toY].pieceKey);
                }
                pieces[toX, toY] = pieces[fromX, fromY];
                pieces[toX, toY].movesVector.status        = "recalculate";
                pieces[toX, toY].movesVector.startPosition = pieceMove.to;
                pieces[fromX, fromY] = Piece.nullPiece;

                //взятие на проходе
                if ((pieceMove.pieceKey == blackPawn || pieceMove.pieceKey == whitePawn) && notation.EnPassant == deskSquares[toX, toY].Name)
                {
                    pieces[toX, fromY].movesVector.status = "delete";
                    curKilledPieceSquare = deskSquares[toX, fromY].Name;
                    deadPieces.Add((char)pieces[toX, fromY].pieceKey);
                    pieces[toX, fromY] = Piece.nullPiece;
                }


                //определяем был ли совершен ход пешкой на две клетки
                if (Math.Abs(toY - fromY) == 2 && (pieceMove.pieceKey == blackPawn || pieceMove.pieceKey == whitePawn))
                {
                    notation.EnPassant = deskSquares[(toX + fromX) / 2, (toY + fromY) / 2].Name;
                }
                else
                {
                    notation.EnPassant = "-";
                }

                //превращение пешки (Pe7e8N,Pa7b8Q и т.д.). Превращение фиксируется на 6-ом знаке(если оно есть)
                if (pieceMove.promotion)
                {
                    Piece piece = ParseToPiece(pieceMove.promotionCharKey);
                    pieces[toX, toY] = piece;
                }

                //право рокировки навсегда теряется при ходе короля
                if ((k.shortCastling || k.longCastling) && pieceMove.pieceKey == k.pieceKey)
                {
                    k.shortCastling = false; k.longCastling = false;
                }

                //право рокировки с ладьей навсегда теряется при ходе этой ладьи или ее взятии
                if (k.shortCastling && k.pieceKey == whiteKing && pieces[7, 0].pieceKey != whiteRook)
                {
                    k.shortCastling = false;
                }
                if (k.longCastling && k.pieceKey == whiteKing && pieces[0, 0].pieceKey != whiteRook)
                {
                    k.longCastling = false;
                }
                if (k.shortCastling && k.pieceKey == blackKing && pieces[7, 7].pieceKey != blackRook)
                {
                    k.shortCastling = false;
                }
                if (k.longCastling && k.pieceKey == blackKing && pieces[0, 7].pieceKey != blackRook)
                {
                    k.longCastling = false;
                }
            }
            else
            {
                MakeCastling(k, pieceMove);
            }

            UpdateDeskSquares();
        }