Beispiel #1
0
        public Texture GetTexture(int piece)
        {
            switch (Piece.GetPieceType(piece))
            {
            case Piece.pawn:
                return(pawnSprite[Piece.GetPieceColor(piece) == Piece.white ? 0 : 1]);

            case Piece.rook:
                return(rookSprite[Piece.GetPieceColor(piece) == Piece.white ? 0 : 1]);

            case Piece.bishop:
                return(bishopSprite[Piece.GetPieceColor(piece) == Piece.white ? 0 : 1]);

            case Piece.knight:
                return(knightSprite[Piece.GetPieceColor(piece) == Piece.white ? 0 : 1]);

            case Piece.queen:
                return(queenSprite[Piece.GetPieceColor(piece) == Piece.white ? 0 : 1]);

            case Piece.king:
                return(kingSprite[Piece.GetPieceColor(piece) == Piece.white ? 0 : 1]);

            default:
                return(null);
            }
        }
Beispiel #2
0
        public static List <Move> GeneratePieceMoves(Board board, int sourceSquare)
        {
            List <Move> pseudoLegalMoves = new List <Move>();

            int piece = board.pieces[sourceSquare];

            switch (Piece.GetPieceType(piece))
            {
            case Piece.pawn:
                GeneratePawnMoves(board, sourceSquare, pseudoLegalMoves);
                break;

            case Piece.knight:
                GenerateKnightMoves(board, sourceSquare, pseudoLegalMoves);
                break;

            case Piece.bishop:
                GenerateSlidingMoves(board, sourceSquare, pseudoLegalMoves);
                break;

            case Piece.queen:
                GenerateSlidingMoves(board, sourceSquare, pseudoLegalMoves);
                break;

            case Piece.rook:
                GenerateSlidingMoves(board, sourceSquare, pseudoLegalMoves);
                break;

            case Piece.king:
                GenerateKingMoves(board, sourceSquare, pseudoLegalMoves);
                break;
            }

            return(pseudoLegalMoves);
        }
Beispiel #3
0
        private int GetPieceValue(int piece)
        {
            switch (Piece.GetPieceType(piece))
            {
            case Piece.pawn:
                return(pawnValue);

            case Piece.rook:
                return(rookValue);

            case Piece.bishop:
                return(bishopValue);

            case Piece.knight:
                return(knightValue);

            case Piece.queen:
                return(queenValue);

            case Piece.king:
                return(kingValue);
            }

            return(0);
        }
Beispiel #4
0
        /*********************************************************************
        * IsCheckMate
        * Loop through the board and for each piece we check if they can kill
        * the king if they can we end and return true.
        *********************************************************************/
        public bool IsCheckMate()
        {
            for (int r = 0; r < 8; r++)
            {
                for (int c = 0; c < 8; c++)
                {
                    Piece piece = board[r, c].GetPiece();
                    if (piece != null && piece.GetTeam() != turn && piece.GetPieceType() == "King")
                    {
                        Piece king   = board[r, c].GetPiece();
                        Piece killer = null;
                        king.CalcPossMoves(board);
                        bool Check            = false;
                        int  checkCount       = 0;
                        int  vulnerableChecks = 0;
                        if (IsCheck(r, c, ref killer))
                        {
                            Check = true;
                            checkCount++;
                            if (IsKillable(killer.GetRow(), killer.GetColumn(), turn))
                            {
                                vulnerableChecks++;
                            }
                        }
                        if (Check)
                        {
                            for (int i = 0; i < king.GetPossMoves().Count; i++)
                            {
                                if (IsCheck(king.GetPossMoves()[i].row, king.GetPossMoves()[i].col, ref killer))
                                {
                                    checkCount++;
                                    if (IsKillable(killer.GetRow(), killer.GetColumn(), turn))
                                    {
                                        vulnerableChecks++;
                                    }
                                }
                            }
                        }
                        if (checkCount > 0 && checkCount == king.GetPossMoves().Count)
                        {
                            checkText.Text = "CHECKMATE";
                            return(true);
                        }
                        else if (checkCount == 0 || checkCount == vulnerableChecks)
                        {
                            checkText.Text = "";
                        }
                        else if (Check)
                        {
                            MessageBox.Show("king is checked");
                            checkText.Text = "CHECK";
                        }
                    }
                }
            }

            return(false);
        }
Beispiel #5
0
        private int Evaluate(Board board)
        {
            int totalValueBlack = 0;
            int totalValueWhite = 0;

            for (int i = 0; i < 64; i++)
            {
                int piece = board.pieces[i];

                if (!Piece.IsPieceType(piece, Piece.none))
                {
                    int pieceColor = Piece.GetPieceColor(piece);
                    int pieceValue = 0;
                    int index      = (pieceColor == Piece.black) ? 63 - i : i;

                    switch (Piece.GetPieceType(board.pieces[i]))
                    {
                    case Piece.pawn:
                        pieceValue = pawnValue + bestPawnPositions[index];
                        break;

                    case Piece.knight:
                        pieceValue = knightValue + bestKnightPositions[index];
                        break;

                    case Piece.bishop:
                        pieceValue = bishopValue + bestBishopPositions[index];
                        break;

                    case Piece.rook:
                        pieceValue = rookValue + bestRookPositions[index];
                        break;

                    case Piece.queen:
                        pieceValue = queenValue + bestQueenPositions[index];
                        break;

                    case Piece.king:
                        pieceValue = kingValue + bestKingPositions[index];
                        break;
                    }

                    if (pieceColor == Piece.white)
                    {
                        totalValueWhite += pieceValue;
                    }
                    else
                    {
                        totalValueBlack += pieceValue;
                    }
                }
            }

            return(totalValueBlack - totalValueWhite);
        }
Beispiel #6
0
        public static bool ParseLine(String line, out String message)
        {
            string placingPattern    = "^([KQBNRP])([ld])([a-h, A-H][1-8])$";
            string movingPattern     = "^([a-h,A-H][1-8])\\s([a-h,A-H][1-8])$";
            string doubleMovePattern = "^([a-h,A-H][1-8])\\s([a-h,A-H][1-8])\\s([a-h,A-H][1-8])\\s([a-h,A-H][1-8])$";

            message = "";
            if (Regex.IsMatch(line, placingPattern))
            {
                char  piece = line.ElementAt(0);
                char  color = line.ElementAt(1);
                char  rank  = line.ElementAt(2);
                char  file  = line.ElementAt(3);
                Piece p     = new Piece(piece, color);
                message = string.Concat("Place the ", p.GetColor(), " ", p.GetPieceType(), " at ", rank, file, "\n");
                validPlacements.Add(line);
                return(true);
            }
            else if (Regex.IsMatch(line, movingPattern))
            {
                char startingRank = line.ElementAt(0);
                char startingFile = line.ElementAt(1);
                char endingRank   = line.ElementAt(3);
                char endingFile   = line.ElementAt(4);
                message = string.Concat("Move the piece at ", startingRank, startingFile, " to ", endingRank, endingFile, "\n");
                validMoves.Add(line);
                return(true);
            }
            else if (Regex.IsMatch(line, doubleMovePattern))
            {
                char firstStartingRank  = line.ElementAt(0);
                char firstStartingFile  = line.ElementAt(1);
                char firstEndingRank    = line.ElementAt(3);
                char firstEndingFile    = line.ElementAt(4);
                char secondStartingRank = line.ElementAt(6);
                char secondStartingFile = line.ElementAt(7);
                char secondEndingRank   = line.ElementAt(9);
                char secondEndingFile   = line.ElementAt(10);
                message = string.Concat("Move the piece at ", firstStartingRank, firstStartingFile, " to ", firstEndingRank, firstEndingFile, " and the piece at ", secondStartingRank, secondStartingFile, " to ", secondEndingRank, secondEndingFile, "\n");
                validMoves.Add(line);
                return(true);
            }
            else if (!Regex.IsMatch(line, "^($)"))
            {
                PrintInfo(line, "This line is invalid input.");
                return(false);
            }
            return(false);
        }
Beispiel #7
0
        public bool Move(string movement)
        {
            //return to bool eventually

            /*
             * piece.move() pass x and y for new space
             */
            if (movement.Length == 5)
            {
                int currentFile = CharToInt(movement[0]);
                int currentRank = int.Parse(movement[1].ToString()) - 1;
                int newFile     = CharToInt(movement[3]);
                int newRank     = int.Parse(movement[4].ToString()) - 1;
                if (boardSpaces[currentRank, currentFile].HasPiece())
                {
                    Piece movingPiece = boardSpaces[currentRank, currentFile].GetPiece();
                    if (movingPiece.Move(movingPiece.GetPieceType(), currentRank, currentFile, newRank, newFile))
                    {
                        string pieceString = movingPiece.GetPieceString();
                        boardSpaces[newRank, newFile].AddPiece(pieceString[1], pieceString[0]);
                        boardSpaces[currentRank, currentFile].RemovePiece();
                        return(true);
                    }
                    else
                    {
                        Parser.PrintInfo(movement, "This is an invalid move.\n");
                        return(false);
                    }
                }
                else
                {
                    Parser.PrintInfo(movement, "The stating space does not contain a piece to move.\n");
                    return(false);
                }
            }
            else
            {
                string firstMove  = string.Concat(movement[0], movement[1], movement[3], movement[4]);
                string secondMove = string.Concat(movement[6], movement[7], movement[9], movement[10]);
                if (Move(firstMove) && Move(secondMove))
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
        }
Beispiel #8
0
        public static bool ParseLine(String line, out String message)
        {
            string placingPattern = "^([KQBNRP])([ld])([a-h, A-H][1-8])$";
            string movingPattern = "^([a-h,A-H][1-8])\\s([a-h,A-H][1-8])$";
            string doubleMovePattern = "^([a-h,A-H][1-8])\\s([a-h,A-H][1-8])\\s([a-h,A-H][1-8])\\s([a-h,A-H][1-8])$";

            message = "";
            if (Regex.IsMatch(line, placingPattern))
            {
                char piece = line.ElementAt(0);
                char color = line.ElementAt(1);
                char rank = line.ElementAt(2);
                char file = line.ElementAt(3);
                Piece p = new Piece(piece, color);
                message = string.Concat("Place the ", p.GetColor(), " ", p.GetPieceType(), " at ", rank, file, "\n");
                validPlacements.Add(line);
                return true;
            }
            else if (Regex.IsMatch(line, movingPattern))
            {
                char startingRank = line.ElementAt(0);
                char startingFile = line.ElementAt(1);
                char endingRank = line.ElementAt(3);
                char endingFile = line.ElementAt(4);
                message = string.Concat("Move the piece at ", startingRank, startingFile, " to ", endingRank, endingFile, "\n");
                validMoves.Add(line);
                return true;
            }
            else if (Regex.IsMatch(line, doubleMovePattern))
            {
                char firstStartingRank = line.ElementAt(0);
                char firstStartingFile = line.ElementAt(1);
                char firstEndingRank = line.ElementAt(3);
                char firstEndingFile = line.ElementAt(4);
                char secondStartingRank = line.ElementAt(6);
                char secondStartingFile = line.ElementAt(7);
                char secondEndingRank = line.ElementAt(9);
                char secondEndingFile = line.ElementAt(10);
                message = string.Concat("Move the piece at ", firstStartingRank, firstStartingFile, " to ", firstEndingRank, firstEndingFile, " and the piece at ", secondStartingRank, secondStartingFile, " to ", secondEndingRank, secondEndingFile,"\n");
                validMoves.Add(line);
                return true;
            }
            else if (!Regex.IsMatch(line, "^($)"))
            {
                PrintInfo(line, "This line is invalid input.");
                return false;
            }
            return false;
        }
Beispiel #9
0
 /*********************************************************************
 * SetPiece
 * Parameters
 *   piece - the piece that will now be on this space
 * Set the new piece for this space
 *********************************************************************/
 public void SetPiece(Piece piece)
 {
     this.piece = piece;
     if (piece != null)
     {
         BackColor = BackColor;
         ForeColor = piece.GetTextColor();
         image     = piece.GetImage();
         this.Text = piece.GetPieceType();
         piece.SetCol(col);
         piece.SetRow(row);
         ForeColor = piece.GetTextColor();
         isEmpty   = false;
     }
 }
Beispiel #10
0
        public static List <Move> GenerateAllMoves(Board board, int color)
        {
            List <Move> pseudoLegalMoves = new List <Move>();

            for (int i = 0; i < 64; i++)
            {
                int piece = board.pieces[i];

                if (!Piece.IsPieceType(piece, Piece.none))
                {
                    if (Piece.IsPieceColor(piece, color))
                    {
                        switch (Piece.GetPieceType(piece))
                        {
                        case Piece.pawn:
                            GeneratePawnMoves(board, i, pseudoLegalMoves);
                            break;

                        case Piece.knight:
                            GenerateKnightMoves(board, i, pseudoLegalMoves);
                            break;

                        case Piece.bishop:
                            GenerateSlidingMoves(board, i, pseudoLegalMoves);
                            break;

                        case Piece.queen:
                            GenerateSlidingMoves(board, i, pseudoLegalMoves);
                            break;

                        case Piece.rook:
                            GenerateSlidingMoves(board, i, pseudoLegalMoves);
                            break;

                        case Piece.king:
                            GenerateKingMoves(board, i, pseudoLegalMoves);
                            break;
                        }
                    }
                }
            }

            return(pseudoLegalMoves);
        }