コード例 #1
0
 public ChessGame()
 {
     Board             = new ChessBoard();
     WhitePlayer       = new ChessPlayer(Color.WHITE, Board);
     BlackPlayer       = new ChessPlayer(Color.BLACK, Board);
     Result            = Result.UNFINISHED;
     CurrentMoveNumber = 1;
     CurrentPlayer     = WhitePlayer;
 }
コード例 #2
0
 public void ChangePlayer()
 {
     if (CurrentPlayer == WhitePlayer)
     {
         CurrentPlayer = BlackPlayer;
     }
     else
     {
         CurrentMoveNumber++;
         CurrentPlayer = WhitePlayer;
     }
 }
コード例 #3
0
        public bool Check()
        {
            ChessPlayer enemy          = CurrentPlayer == WhitePlayer ? BlackPlayer : WhitePlayer;
            Color       enemyColor     = CurrentPlayer == WhitePlayer ? Color.BLACK : Color.WHITE;
            ChessKing   enemyKing      = enemy.Figures.OfType <ChessKing>().First();
            ChessField  enemyKingField = enemyKing.CurrentField;

            if (IsFieldUnderAttack(enemyColor, enemyKingField.Row, enemyKingField.Column))
            {
                return(true);
            }
            return(false);
        }
コード例 #4
0
        public bool IsFieldUnderAttack(Color playerColor, int row, char column)
        {
            ChessPlayer attackingPlayer = playerColor == Color.WHITE ? BlackPlayer : WhitePlayer;

            foreach (ChessFigure figure in attackingPlayer.Figures)
            {
                foreach (ChessField field in figure.FieldsToMove)
                {
                    if (field.Row == row && field.Column == column)
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
コード例 #5
0
ファイル: ChessFigure.cs プロジェクト: TretiakovOA/Chess
        public virtual void Move(ChessField field, ChessPlayer enemy, ChessBoard board, int moveNumber, ChessFigure[] otherFigures)
        {
            FieldStatus enemyStatus =
                Color == Color.WHITE ? FieldStatus.OCCUPIED_WITH_BLACK : FieldStatus.OCCUPIED_WITH_WHITE;
            ChessFigure killedFigure = null;

            if (field.Status == enemyStatus)
            {
                foreach (ChessFigure enemyFigure in enemy.Figures)
                {
                    if (enemyFigure.CurrentField == field)
                    {
                        enemyFigure.FigureKilled();
                        killedFigure = enemyFigure;
                        break;
                    }

                    if (enemyFigure is ChessPawn && ((ChessPawn)enemyFigure).EnPassant &&
                        enemyFigure.CurrentField.Column == field.Column)
                    {
                        if ((Color == Color.WHITE && field.Row == 6 && ((ChessPawn)enemyFigure).EnPassantMove == moveNumber - 1) ||
                            (Color == Color.BLACK && field.Row == 3 && ((ChessPawn)enemyFigure).EnPassantMove == moveNumber))
                        {
                            enemyFigure.FigureKilled();
                            killedFigure = enemyFigure;
                            break;
                        }
                    }
                }
            }
            ChessMove move = new ChessMove(Color, moveNumber, this, killedFigure, CurrentField, field);

            PreviousMoves.Add(move);
            board.EmptyField(CurrentField);
            board.OccupyField(field.Row, field.Column, Color);
            CurrentField = field;
            FindFieldsToMove(board);
        }
コード例 #6
0
ファイル: ChessPawn.cs プロジェクト: TretiakovOA/Chess
        public override void Move(ChessField field, ChessPlayer enemy, ChessBoard board, int moveNumber, ChessFigure[] otherFigures)
        {
            if (PreviousMoves.Count == 0)
            {
                if ((Color == Color.WHITE && field.Row == 4) || (Color == Color.BLACK && field.Row == 5))
                {
                    EnPassant     = true;
                    EnPassantMove = moveNumber;
                }
            }
            else
            {
                EnPassant = false;
            }

            base.Move(field, enemy, board, moveNumber, otherFigures);
            if ((Color == Color.WHITE && field.Row == 8) || (Color == Color.BLACK && field.Row == 1))
            {
                int pawnIndex = 16;
                for (var i = 0; i < otherFigures.Length; i++)
                {
                    var figure = otherFigures[i];
                    if (this == figure)
                    {
                        pawnIndex = i;
                    }
                }

                ChessFigure  newFigure;
                DialogResult result = MessageBox.Show("Do you want to turn into Queen?", "Pawn To Queen",
                                                      MessageBoxButtons.YesNo);
                if (result == DialogResult.Yes)
                {
                    newFigure = new ChessQueen(Color, board);
                }
                else
                {
                    result = MessageBox.Show("Do you want to turn into Rook?", "Pawn To Rook",
                                             MessageBoxButtons.YesNo);
                    if (result == DialogResult.Yes)
                    {
                        newFigure = new ChessRook(Color, board, false);
                    }
                    else
                    {
                        result = MessageBox.Show("Do you want to turn into Knight?", "Pawn To Knight",
                                                 MessageBoxButtons.YesNo);
                        if (result == DialogResult.Yes)
                        {
                            newFigure = new ChessKnight(Color, board, false);
                        }
                        else
                        {
                            newFigure = new ChessBishop(Color, board, false);
                        }
                    }
                }
                newFigure.CurrentField  = field;
                newFigure.PreviousMoves = PreviousMoves;
                newFigure.FindFieldsToMove(board);
                otherFigures[pawnIndex] = newFigure;
            }
        }
コード例 #7
0
        public bool CheckMate()
        {
            bool        isMate         = false;
            ChessPlayer enemy          = CurrentPlayer == WhitePlayer ? BlackPlayer : WhitePlayer;
            Color       enemyColor     = CurrentPlayer == WhitePlayer ? Color.BLACK : Color.WHITE;
            ChessKing   enemyKing      = enemy.Figures.OfType <ChessKing>().First();
            ChessField  enemyKingField = enemyKing.CurrentField;

            if (IsFieldUnderAttack(enemyColor, enemyKingField.Row, enemyKingField.Column))
            {
                isMate = true;
                //1. King can move to other field
                List <ChessField> kingToMoveFields = enemyKing.FieldsToMove;
                foreach (ChessField field in kingToMoveFields)
                {
                    if (!IsFieldUnderAttack(enemyColor, field.Row, field.Column))
                    {
                        isMate = false;
                        break;
                    }
                }

                //2. Attacking figures can be killed
                List <ChessFigure> currentFigures   = CurrentPlayer.Figures.Where(f => !f.IsKilled).ToList();
                List <ChessFigure> attackingFigures = new List <ChessFigure>();
                foreach (ChessFigure figure in currentFigures)
                {
                    if (figure.FieldsToMove.Contains(enemyKingField))
                    {
                        attackingFigures.Add(figure);
                    }
                }

                List <ChessFigure> attackingToKill = new List <ChessFigure>();
                foreach (ChessFigure attackingFigure in attackingFigures)
                {
                    foreach (ChessFigure defendingFigure in enemy.Figures.Where(f => !f.IsKilled))
                    {
                        if (defendingFigure.FieldsToMove.Contains(attackingFigure.CurrentField))
                        {
                            attackingToKill.Add(attackingFigure);
                        }
                    }
                }

                foreach (ChessFigure figure in attackingToKill)
                {
                    attackingFigures.Remove(figure);
                }


                //3. It's possible to move figure between attacking figure and king
                foreach (ChessFigure attackingFigure in attackingFigures)
                {
                    List <ChessField> fieldsBetween = new List <ChessField>();
                    if (attackingFigure is ChessRook || attackingFigure is ChessQueen)
                    {
                        if (enemyKingField.Column == attackingFigure.CurrentField.Column)
                        {
                            int minRow = Math.Min(enemyKingField.Row, attackingFigure.CurrentField.Row);
                            int maxRow = Math.Max(enemyKingField.Row, attackingFigure.CurrentField.Row);
                            for (int i = minRow + 1; i < maxRow; i++)
                            {
                                fieldsBetween.Add(Board.GetField(i, enemyKingField.Column));
                            }
                        }
                        else if (enemyKingField.Row == attackingFigure.CurrentField.Row)
                        {
                            char minColumn = (char)Math.Min(enemyKingField.Column, attackingFigure.CurrentField.Column);
                            char maxColumn = (char)Math.Max(enemyKingField.Column, attackingFigure.CurrentField.Column);
                            for (int i = minColumn + 1; i < maxColumn; i++)
                            {
                                fieldsBetween.Add(Board.GetField(enemyKingField.Row, (char)i));
                            }
                        }
                    }
                    if (attackingFigure is ChessBishop || attackingFigure is ChessQueen)
                    {
                        int  minRow    = Math.Min(enemyKingField.Row, attackingFigure.CurrentField.Row);
                        int  maxRow    = Math.Max(enemyKingField.Row, attackingFigure.CurrentField.Row);
                        char minColumn = (char)Math.Min(enemyKingField.Column, attackingFigure.CurrentField.Column);
                        char maxColumn = (char)Math.Max(enemyKingField.Column, attackingFigure.CurrentField.Column);
                        if ((enemyKingField.Row < attackingFigure.CurrentField.Row &&
                             enemyKingField.Column < attackingFigure.CurrentField.Column) ||
                            (enemyKingField.Row > attackingFigure.CurrentField.Row &&
                             enemyKingField.Column > attackingFigure.CurrentField.Column))
                        {
                            for (int i = minRow + 1, j = minColumn + 1; i < maxRow && j < maxColumn; i++, j++)
                            {
                                fieldsBetween.Add(Board.GetField(i, (char)j));
                            }
                        }
                        else
                        {
                            for (int i = maxRow - 1, j = minColumn + 1; i > minRow && j < maxColumn; i--, j++)
                            {
                                fieldsBetween.Add(Board.GetField(i, (char)j));
                            }
                        }
                    }
                    List <ChessFigure> enemyFigures = enemy.Figures.Where(f => f != enemyKing).ToList();
                    foreach (ChessField field in fieldsBetween)
                    {
                        foreach (var figure in enemyFigures)
                        {
                            if (figure.FieldsToMove.Contains(field))
                            {
                                attackingFigures.Remove(attackingFigure);
                            }
                        }
                    }
                }
                if (attackingFigures.Count < 1)
                {
                    isMate = false;
                }
            }
            return(isMate);
        }