Exemple #1
0
        private bool TryMove(string start, string end, Func <Board, string, string, bool> checkMethod, Figure figure)
        {
            if (!checkMethod(this, start, end))
            {
                return(false);
            }

            // меняем позицию фигуры на доске
            MoveFigure(start, end, figure);
            return(true);
        }
Exemple #2
0
 private void MoveFigure(string start, string end, Figure figure)
 {
     board[start[0]][start[1]] = null;
     board[end[0]][end[1]]     = figure;
 }
Exemple #3
0
        public List <Option> GetOptions(Figure Figure)
        {
            List <Option> options = new List <Option>();

            int FigureX = (int)Figure.X;
            int FigureY = (int)Figure.Y;

            if (Figure.Name.Contains("Pawn"))
            {
                if (Figure.Color == GameColor.White)
                {
                    if (IsEmpty(FigureX, FigureY + 1))
                    {
                        options.Add(new Option(FigureX, FigureY + 1));
                    }

                    if (FigureY == 1)
                    {
                        if (IsEmpty(FigureX, 3))
                        {
                            options.Add(new Option(FigureX, 3));
                        }
                    }

                    using (Figure enemy = GetAliveFigureBy(FigureX + 1, FigureY + 1))
                    {
                        if (enemy != null)
                        {
                            if (enemy.Color != Figure.Color)
                            {
                                options.Add(new Option(enemy.X, enemy.Y));
                            }
                        }
                    }

                    using (Figure enemy = GetAliveFigureBy(FigureX - 1, FigureY + 1))
                    {
                        if (enemy != null)
                        {
                            if (enemy.Color != Figure.Color)
                            {
                                options.Add(new Option(enemy.X, enemy.Y));
                            }
                        }
                    }
                }
                else if (Figure.Color == GameColor.Black)
                {
                    if (IsEmpty(FigureX, FigureY - 1))
                    {
                        options.Add(new Option(FigureX, FigureY - 1));
                    }

                    if (FigureY == 6)
                    {
                        if (IsEmpty(FigureX, 4))
                        {
                            options.Add(new Option(FigureX, 4));
                        }
                    }

                    using (Figure enemy = GetAliveFigureBy(FigureX + 1, FigureY - 1))
                    {
                        if (enemy != null)
                        {
                            if (enemy.Color != Figure.Color)
                            {
                                options.Add(new Option(enemy.X, enemy.Y));
                            }
                        }
                    }

                    using (Figure enemy = GetAliveFigureBy(FigureX - 1, FigureY - 1))
                    {
                        if (enemy != null)
                        {
                            if (enemy.Color != Figure.Color)
                            {
                                options.Add(new Option(enemy.X, enemy.Y));
                            }
                        }
                    }
                }
            }
            else if (Figure.Name.Contains("Rook"))
            {
                // get random position for the piece
                // Incrementing X
                for (int x = FigureX + 1; x < 8; ++x)
                {
                    Option option   = new Option(FigureX + 1, FigureY);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null)
                    {
                        options.Add(option);
                    }
                    else
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                        break;
                    }
                }

                // Decrementing X
                for (int x = FigureX - 1; x >= 0; --x)
                {
                    Option option   = new Option(FigureX + 1, FigureY);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null)
                    {
                        options.Add(option);
                    }
                    else
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                        break;
                    }
                }

                // Incrementing Y
                for (int y = FigureY + 1; y < 8; ++y)
                {
                    Option option   = new Option(FigureX + 1, FigureY);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null)
                    {
                        options.Add(option);
                    }
                    else
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                        break;
                    }
                }

                // Decrementing Y
                for (int y = FigureY - 1; y >= 0; --y)
                {
                    Option option   = new Option(FigureX + 1, FigureY);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null)
                    {
                        options.Add(option);
                    }
                    else
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                        break;
                    }
                }
            }
            else if (Figure.Name.Contains("Knight"))
            {
                // get random position for the piece
                // X - 2
                for (int y = -1; true; y = 1)
                {
                    Option option   = new Option(FigureX - 2, FigureY + y);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null && !OutOfRange(option))
                    {
                        options.Add(option);
                    }
                    else if (!OutOfRange(option) && obstacle.Color != CurrentPlayer.Color)
                    {
                        options.Add(option);
                    }
                    if (y == 1)
                    {
                        break;
                    }
                }

                // X - 1
                for (int y = -2; true; y = 2)
                {
                    Option option   = new Option(FigureX - 1, FigureY + y);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null && !OutOfRange(option))
                    {
                        options.Add(option);
                    }
                    else if (!OutOfRange(option) && obstacle.Color != CurrentPlayer.Color)
                    {
                        options.Add(option);
                    }
                    if (y == 2)
                    {
                        break;
                    }
                }

                // X + 1
                for (int y = -2; true; y = 2)
                {
                    Option option   = new Option(FigureX + 1, FigureY + y);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null && !OutOfRange(option))
                    {
                        options.Add(option);
                    }
                    else if (!OutOfRange(option) && obstacle.Color != CurrentPlayer.Color)
                    {
                        options.Add(option);
                    }
                    if (y == 2)
                    {
                        break;
                    }
                }

                // X + 2
                for (int y = -1; true; y = 1)
                {
                    Option option   = new Option(FigureX + 2, FigureY + y);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null && !OutOfRange(option))
                    {
                        options.Add(option);
                    }
                    else if (!OutOfRange(option) && obstacle.Color != CurrentPlayer.Color)
                    {
                        options.Add(option);
                    }
                    if (y == 1)
                    {
                        break;
                    }
                }
            }
            else if (Figure.Name.Contains("Bishop"))
            {
                // get random position for the piece
                // X- Y-
                for (Option optionIterator = new Option(FigureX - 1, FigureY - 1);
                     optionIterator.X >= 0 && optionIterator.Y >= 0;
                     new Action(() => { optionIterator.X--; optionIterator.Y--; }).Invoke())
                {
                    Option option   = new Option(optionIterator.X, optionIterator.Y);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null && !OutOfRange(option))
                    {
                        options.Add(option);
                    }
                    else if (!OutOfRange(option))
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                        break;
                    }
                }

                // X- Y+
                for (Option optionIterator = new Option(FigureX - 1, FigureY + 1);
                     optionIterator.X >= 0 && optionIterator.Y < 8;
                     new Action(() => { optionIterator.X--; optionIterator.Y++; }).Invoke())
                {
                    Option option   = new Option(optionIterator.X, optionIterator.Y);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null && !OutOfRange(option))
                    {
                        options.Add(option);
                    }
                    else if (!OutOfRange(option))
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                        break;
                    }
                }

                // X+ Y-
                for (Option optionIterator = new Option(FigureX + 1, FigureY - 1);
                     optionIterator.X < 8 && optionIterator.Y >= 0;
                     new Action(() => { optionIterator.X++; optionIterator.Y--; }).Invoke())
                {
                    Option option   = new Option(optionIterator.X, optionIterator.Y);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null && !OutOfRange(option))
                    {
                        options.Add(option);
                    }
                    else if (!OutOfRange(option))
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                        break;
                    }
                }

                // X+ Y+
                for (Option optionIterator = new Option(FigureX + 1, FigureY + 1);
                     optionIterator.X < 8 && optionIterator.Y < 8;
                     new Action(() => { optionIterator.X++; optionIterator.Y++; }).Invoke())
                {
                    Option option   = new Option(optionIterator.X, optionIterator.Y);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null && !OutOfRange(option))
                    {
                        options.Add(option);
                    }
                    else if (!OutOfRange(option))
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                        break;
                    }
                }
            }
            else if (Figure.Name.Contains("Queen"))
            {
                // get random position for the piece
                #region Rook Ability

                // Incrementing X
                for (int x = FigureX + 1; x < 8; ++x)
                {
                    Option option   = new Option(FigureX + 1, FigureY);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null)
                    {
                        options.Add(option);
                    }
                    else
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                        break;
                    }
                }

                // Decrementing X
                for (int x = FigureX - 1; x >= 0; --x)
                {
                    Option option   = new Option(FigureX + 1, FigureY);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null)
                    {
                        options.Add(option);
                    }
                    else
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                        break;
                    }
                }

                // Incrementing Y
                for (int y = FigureY + 1; y < 8; ++y)
                {
                    Option option   = new Option(FigureX + 1, FigureY);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null)
                    {
                        options.Add(option);
                    }
                    else
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                        break;
                    }
                }

                // Decrementing Y
                for (int y = FigureY - 1; y >= 0; --y)
                {
                    Option option   = new Option(FigureX + 1, FigureY);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null)
                    {
                        options.Add(option);
                    }
                    else
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                        break;
                    }
                }

                #endregion

                #region Bishop Ability

                // X- Y-
                for (Option optionIterator = new Option(FigureX - 1, FigureY - 1);
                     optionIterator.X >= 0 && optionIterator.Y >= 0;
                     new Action(() => { optionIterator.X--; optionIterator.Y--; }).Invoke())
                {
                    Option option   = new Option(optionIterator.X, optionIterator.Y);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null && !OutOfRange(option))
                    {
                        options.Add(option);
                    }
                    else if (!OutOfRange(option))
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                        break;
                    }
                }

                // X- Y+
                for (Option optionIterator = new Option(FigureX - 1, FigureY + 1);
                     optionIterator.X >= 0 && optionIterator.Y < 8;
                     new Action(() => { optionIterator.X--; optionIterator.Y++; }).Invoke())
                {
                    Option option   = new Option(optionIterator.X, optionIterator.Y);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null && !OutOfRange(option))
                    {
                        options.Add(option);
                    }
                    else if (!OutOfRange(option))
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                        break;
                    }
                }

                // X+ Y-
                for (Option optionIterator = new Option(FigureX + 1, FigureY - 1);
                     optionIterator.X < 8 && optionIterator.Y >= 0;
                     new Action(() => { optionIterator.X++; optionIterator.Y--; }).Invoke())
                {
                    Option option   = new Option(optionIterator.X, optionIterator.Y);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null && !OutOfRange(option))
                    {
                        options.Add(option);
                    }
                    else if (!OutOfRange(option))
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                        break;
                    }
                }

                // X+ Y+
                for (Option optionIterator = new Option(FigureX + 1, FigureY + 1);
                     optionIterator.X < 8 && optionIterator.Y < 8;
                     new Action(() => { optionIterator.X++; optionIterator.Y++; }).Invoke())
                {
                    Option option   = new Option(optionIterator.X, optionIterator.Y);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null && !OutOfRange(option))
                    {
                        options.Add(option);
                    }
                    else if (!OutOfRange(option))
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                        break;
                    }
                }

                #endregion
            }
            else if (Figure.Name.Contains("King"))
            {
                // get random position for the piece
                #region Rook Ability

                // Incrementing X
                {
                    Option option   = new Option(FigureX + 1, FigureY);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null)
                    {
                        options.Add(option);
                    }
                    else
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                    }
                }

                // Decrementing X
                {
                    Option option   = new Option(FigureX - 1, FigureY);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null)
                    {
                        options.Add(option);
                    }
                    else
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                    }
                }

                // Incrementing Y
                {
                    Option option   = new Option(FigureX, FigureY + 1);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null)
                    {
                        options.Add(option);
                    }
                    else
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                    }
                }

                // Decrementing Y
                {
                    Option option   = new Option(FigureX, FigureY - 1);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null)
                    {
                        options.Add(option);
                    }
                    else
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                    }
                }

                #endregion

                #region Bishop Ability

                // X- Y-
                {
                    Option option   = new Option(FigureX - 1, FigureY - 1);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null && !OutOfRange(option))
                    {
                        options.Add(option);
                    }
                    else if (!OutOfRange(option))
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                    }
                }

                // X- Y+
                {
                    Option option   = new Option(FigureX - 1, FigureY + 1);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null && !OutOfRange(option))
                    {
                        options.Add(option);
                    }
                    else if (!OutOfRange(option))
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                    }
                }

                // X+ Y-
                {
                    Option option   = new Option(FigureX + 1, FigureY - 1);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null && !OutOfRange(option))
                    {
                        options.Add(option);
                    }
                    else if (!OutOfRange(option))
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                    }
                }

                // X+ Y+
                {
                    Option option   = new Option(FigureX + 1, FigureY + 1);
                    Figure obstacle = GetAliveFigureBy(option);
                    if (obstacle == null && !OutOfRange(option))
                    {
                        options.Add(option);
                    }
                    else if (!OutOfRange(option))
                    {
                        if (obstacle.Color != CurrentPlayer.Color)
                        {
                            options.Add(option);
                        }
                    }
                }

                #endregion
            }

            return(options);
        }