/// <summary> /// Проверка постановки шаха со стороны врага. На вход требуется ход одного игрока, далее метод определит будет ли /// осуществлен шах со стороны врага после данного нашего хода /// </summary> private bool BeatKingAfter(FigureMoving fm) { Board after = Move(fm); //Нужна новая доска, которая примет на себя данный ход, что позволит просмотреть операцию шаха, не ломая данную использующуюся в игре доску after.ChangeColor(this); //Смена цвета доски для дальнейшей проверки осуществления шаха вражеским игроком return(after.CanBeatKing()); }
public Board Move(FigureMoving fm)//Получение новой доски (с перемещением), олицетворение процесса хода в игре { Board nextboard = new Board(Fen); nextboard.SetFigureAt(fm.From, Figure.None); //Уборка фигуры из стартовой позиции, осуществляется установкой на данной позиции фигуры "None" nextboard.SetFigureAt(fm.To, fm.From.Figure); nextboard.UpdateCurrentFen(); return(nextboard); }
public void GetCellsAndFigures(string move)//Получение хода на основе записи, вводимой игроком { if (IsValidParameter(move)) { FigureMoving fm = GetFigureMovingUsingMove(move); if (IsValidFigureMoving(fm)) { SetupCurrentFigureMoving(fm); } } }
public void Move(string move, string movecolor) { if (IsValidMoveArguments(move, movecolor)) { FigureMoving fm = new FigureMoving(this.Board); fm.GetCellsAndFigures(move); Board nextBoard = Board.Move(fm); nextBoard.MoveColor = movecolor; this.Board = nextBoard; } }
/// <summary> /// Приведение строки хода, которую вводит пользователь к структурированному виду (клетки: "Откуда ход"; "Куда ход"; /// фигуры на данных клетках. /// </summary> private FigureMoving GetFigureMovingUsingMove(string move) { Cell from = new Cell(move.Substring(1, 2)); from.Figure = (Figure)move[0]; Cell to = new Cell(move.Substring(3, 2)); to.Figure = board.GetFigureAt(to); FigureMoving fm = new FigureMoving(from, to); return(fm); }
/// <summary> /// Поиск шаха происходит по принципу, что каждая фигура текущего цвета атаковать вражеского короля /// </summary> private bool CanBeatKing() { Cell cellking = FindEnemyKing(); Moves moves = new Moves(this); foreach (Cell cell in YieldCellsAndFiguresOfMoveColor()) { FigureMoving fm = new FigureMoving(cell, cellking); if (moves.CanMove(fm)) { return(true); } } return(false); }
private bool IsValidFigureMoving(FigureMoving figureMoving) { if (figureMoving.From.Figure != board.GetFigureAt(figureMoving.From)) { throw new ArgumentException("На выбранной клетке не соответствует написанная фигура"); } if (new Cell(figureMoving.From.X, figureMoving.From.Y).OnBoard() == false) { throw new ArgumentException("Строка имеет несуществующую координату"); } if (new Cell(figureMoving.To.X, figureMoving.To.Y).OnBoard() == false) { throw new ArgumentException("Строка имеет несуществующую координату"); } return(true); }
private void FindAllMoves() { allMoves = new List <FigureMoving>(); Moves moves = new Moves(this); foreach (Cell from in YieldCellsAndFiguresOfMoveColor()) { foreach (Cell to in Cell.YieldAllCells())//Перебор всех клеток игры, пробуем попасть в каждую клетку доски { FigureMoving fm = new FigureMoving(from, to); if (moves.CanMove(fm)) { if (!BeatKingAfter(fm))//Для добавления в список разрешенных ходов текущего игрока требуется отсутствие шаха со стороны врага после совершения хода { allMoves.Add(fm); } } } } }
private void SetupCurrentFigureMoving(FigureMoving fm) { this.From = fm.From; this.To = fm.To; }
private void UpdateCurrentFigureMoving(FigureMoving fm) { this.fm = fm; }
public bool CanMove(FigureMoving fm) { UpdateCurrentFigureMoving(fm); return(AreFiguresEqual() && CanMoveFrom() && CanMoveTo() && CanFigureMove()); }