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); }
private void MoveFigure(string start, string end, Figure figure) { board[start[0]][start[1]] = null; board[end[0]][end[1]] = figure; }
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); }