示例#1
0
        /// <summary>
        /// Проверка постановки шаха со стороны врага. На вход требуется ход одного игрока, далее метод определит будет ли
        /// осуществлен шах со стороны врага после данного нашего хода
        /// </summary>
        private bool BeatKingAfter(FigureMoving fm)
        {
            Board after = Move(fm);  //Нужна новая доска, которая примет на себя данный ход, что позволит просмотреть операцию шаха, не ломая данную использующуюся в игре доску

            after.ChangeColor(this); //Смена цвета доски для дальнейшей проверки осуществления шаха вражеским игроком

            return(after.CanBeatKing());
        }
示例#2
0
        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);
        }
示例#3
0
        public void GetCellsAndFigures(string move)//Получение хода на основе записи, вводимой игроком
        {
            if (IsValidParameter(move))
            {
                FigureMoving fm = GetFigureMovingUsingMove(move);

                if (IsValidFigureMoving(fm))
                {
                    SetupCurrentFigureMoving(fm);
                }
            }
        }
示例#4
0
        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;
            }
        }
示例#5
0
        /// <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);
        }
示例#6
0
        /// <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);
        }
示例#7
0
        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);
        }
示例#8
0
        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);
                        }
                    }
                }
            }
        }
示例#9
0
 private void SetupCurrentFigureMoving(FigureMoving fm)
 {
     this.From = fm.From;
     this.To   = fm.To;
 }
示例#10
0
 private void UpdateCurrentFigureMoving(FigureMoving fm)
 {
     this.fm = fm;
 }
示例#11
0
        public bool CanMove(FigureMoving fm)
        {
            UpdateCurrentFigureMoving(fm);

            return(AreFiguresEqual() && CanMoveFrom() && CanMoveTo() && CanFigureMove());
        }