Exemplo n.º 1
0
        //Выводи находящиеся на доске фигуры
        public void PrintBoard()
        {
            string strStroka = "   " + new string('-', 32);

            Console.WriteLine(strStroka);
            for (int i = _board.GetLength(0) - 1; i >= 0; i--)
            {
                Console.Write("{0} !", i + 1);
                for (int j = 0; j < _board.GetLength(1); j++)
                {
                    string strFigure = "";
                    if (_board[i, j] == null)
                    {
                        strFigure = " ";
                    }
                    else
                    {
                        strFigure = ((Figure)_board[i, j]).Symbol.ToString();
                    }

                    Console.Write(" {0} !", strFigure);
                }

                Console.WriteLine();
                Console.WriteLine(strStroka);
            }

            Console.Write("   ");
            for (int i = 0; i < 8; i++)
            {
                Console.Write(" {0}  ", (Horizontal )i);
            }

            Console.WriteLine();
        }
Exemplo n.º 2
0
 //Проверяем выход за границы игрового поля
 private bool IsMoveInBounds(int x, int y, ref Figure[,] board)
 {
     if (x < 0 || x > board.GetLength(1) - 1 || y < 0 || y > board.GetLength(0) - 1)
     {
         return(false);
     }
     return(true);
 }
Exemplo n.º 3
0
 public void Clear()
 {
     for (int i = 0; i < table.GetLength(0); i++)
     {
         for (int f = 0; f < table.GetLength(1); f++)
         {
             table[i, f] = null;
         }
     }
 }
Exemplo n.º 4
0
        private static double CalcFullSquare(Figure[,] arrFigures)
        {
            double sSquare = 0;

            for (var i = 0; i < arrFigures.GetLength(0); i++)
            {
                for (var j = 0; j < arrFigures.GetLength(1); j++)
                {
                    sSquare += arrFigures[i, j].Square();
                }
            }

            return(sSquare);
        }
Exemplo n.º 5
0
 public void Undo()
 {
     if (sizeHistory > 1)
     {
         figures = new Figure[8, 8];
         for (int i = 0; i < figures.GetLength(0); i++)
         {
             for (int j = 0; j < figures.GetLength(1); j++)
             {
                 figures[i, j] = history[sizeHistory - 2][i, j];
             }
         }
         sizeHistory--;
         size--;
     }
 }
Exemplo n.º 6
0
    //Методы

    public void Move(MoveTobit move, ref Figure[,] board)
    {
        board[move.row, move.col] = this;
        board[row, col]           = null;
        col = move.col;
        row = move.row;
        if (move.haveKill)
        {
            board[move.delRow, move.delCol] = null;
        }
        if (Type == FigureType.SUPER)
        {
            return;
        }
        int rows = board.GetLength(0) - 1;

        if (Color == FigureColor.WHITE && row == rows)
        {
            Type = FigureType.SUPER;
        }
        if (Color == FigureColor.BLACK && row == 0)
        {
            Type = FigureType.SUPER;
        }
    }
Exemplo n.º 7
0
    private void CopyBoard(BoardTobit boardMover, Figure[,] newboard)
    {
        Figure[,] oldBoard = boardMover.board;
        int rows = board.GetLength(0);
        int cols = board.GetLength(1);

        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                if (oldBoard[i, j] != null)
                {
                    newboard[i, j] = new Figure(oldBoard[i, j]);
                }
            }
        }
    }
Exemplo n.º 8
0
    //Возвращаем массив всех фигур на поле
    private List <Figure> GetListFigures(Figure[,] board)
    {
        List <Figure> activeFiguresOnBoard = new List <Figure>();
        int           rows = board.GetLength(0);
        int           cols = board.GetLength(1);

        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                Figure f = board[i, j];
                if (f == null)
                {
                    continue;
                }
                else
                {
                    activeFiguresOnBoard.Add(f);
                }
            }
        }

        return(activeFiguresOnBoard);
    }
Exemplo n.º 9
0
    /// <summary>
    /// Возвращаем все возомжные ходы для фигуры типа Super ("дамка")
    /// </summary>
    /// <param name="board">Текущее состояние игрового поле</param>
    /// <returns>Массив все доступных ходов</returns>
    private List <Move> GetMovesSuper(ref Figure[,] board)
    {
        List <Move> moves = new List <Move>();

        int[] moveX = new int[] { -1, 1 };
        int[] moveY = new int[] { -1, 1 };

        foreach (var mX in moveX)
        {
            if (row == 0 || row == board.GetLength(0) - 1) // если крайние строки, то нельзя ходить вправо или влево
            {
                break;
            }
            int       nextX    = col + mX;
            int       nextY    = row;
            MoveTobit killMove = new MoveTobit();           //Данные поедаемой фигуры, нам нужны координаты уничтожаемой с поля фигуры
            while (IsMoveInBounds(nextX, nextY, ref board)) //Идем по направляения пока не дойдем до края игрового поля
            {
                Figure p = board[nextY, nextX];
                if (p != null && p.Color == Color) // Проверка на возомжность хода
                {
                    break;
                }
                MoveTobit m = new MoveTobit();
                m.figure = this;
                if (p == null)
                {
                    m.col = nextX;
                    m.row = nextY;
                    if (killMove.haveKill) //Если имеется клетка для поедания, сохраним координаты для поедания фигуры
                    {
                        m.haveKill = killMove.haveKill;
                        m.delCol   = killMove.delCol;
                        m.delRow   = killMove.delRow;
                    }
                }
                else
                {
                    if (!killMove.haveKill)
                    {
                        int hopX = nextX + mX;
                        int hopY = nextY;
                        if (!IsMoveInBounds(hopX, hopY, ref board))
                        {
                            break;
                        }
                        if (board[hopY, hopX] != null)
                        {
                            break;
                        }
                        m.haveKill = true;
                        m.col      = hopX;
                        m.row      = hopY;
                        m.delCol   = nextX;
                        m.delRow   = nextY;
                        nextX      = hopX;
                        killMove   = m;
                    }
                    else // Если имеется клетка для поедания, выходим из цикла
                    {
                        break;
                    }
                }
                moves.Add(m);
                nextX += mX;
            }
        }
        foreach (var mY in moveY)
        {
            if (col == 0 || col == board.GetLength(1) - 1) // если крайние столбцы, то нельзя ходить вверж или вниз
            {
                break;
            }
            int       nextX    = col;
            int       nextY    = row + mY;
            MoveTobit killMove = new MoveTobit();//Данные поедаемой фигуры, нам нужны координаты уничтожаемой с поля фигуры
            while (IsMoveInBounds(nextX, nextY, ref board))
            {
                Figure p = board[nextY, nextX];
                if (p != null && p.Color == Color) // Проверка на возомжность хода
                {
                    break;
                }
                MoveTobit m = new MoveTobit();
                m.figure = this;
                if (p == null)
                {
                    m.col = nextX;
                    m.row = nextY;
                    if (killMove.haveKill) //Если имеется клетка для поедания, сохраним координаты для поедания фигуры
                    {
                        m.haveKill = killMove.haveKill;
                        m.delCol   = killMove.delCol;
                        m.delRow   = killMove.delRow;
                    }
                }
                else
                {
                    if (!killMove.haveKill)
                    {
                        int hopX = nextX;
                        int hopY = nextY + mY;
                        if (!IsMoveInBounds(hopX, hopY, ref board))
                        {
                            break;
                        }
                        if (board[hopY, hopX] != null)
                        {
                            break;
                        }
                        m.haveKill = true;
                        m.col      = hopX;
                        m.row      = hopY;
                        m.delCol   = nextX;
                        m.delRow   = nextY;
                        nextY      = hopY;
                        killMove   = m;
                    }
                    else // Если имеется клетка для поедания, выходим из цикла
                    {
                        break;
                    }
                }
                moves.Add(m);
                nextY += mY;
            }
        }
        if (moves.Exists(x => (x as MoveTobit).haveKill))
        {
            moves = moves.FindAll(x => (x as MoveTobit).haveKill);
        }
        return(moves);
    }
Exemplo n.º 10
0
    /// <summary>
    /// Возвращаем все возомжные ходы для фигуры типа Normal
    /// </summary>
    /// <param name="board">Текущее состояние игрового поле</param>
    /// <returns>Массив все доступных ходов</returns>
    private List <Move> GetMovesNormal(ref Figure[,] board)
    {
        List <Move> moves = new List <Move>();

        int[] moveX = new int[] { -1, 1 };
        int[] moveY = new int[] { 1, -1 };
        if (Color == FigureColor.BLACK)
        {
            moveY = new int[] { -1, 1 }
        }
        ;
        //Проверяем возможность ходить вправо и влево
        foreach (int mX in moveX)
        {
            if (row == 0 || row == board.GetLength(0) - 1) // если крайние строки, то нельзя ходить вправо или влево
            {
                break;
            }
            int nextX = col + mX;
            if (!IsMoveInBounds(nextX, row, ref board)) // проверяем край игрового поля для хода
            {
                continue;
            }

            Figure f = board[row, nextX];
            if (f != null && f.Color == Color) //проверяем находится ли на клетке фигура того же цвета
            {
                continue;
            }
            MoveTobit m = new MoveTobit();
            m.figure = this;
            if (f == null) // добавляем координаты для обычного хода
            {
                m.col = nextX;
                m.row = row;
            }
            else //добавляем координаты для хода с поеданием фигуры противника
            {
                int hopX = nextX + mX;
                if (!IsMoveInBounds(hopX, row, ref board))
                {
                    continue;
                }
                if (board[row, hopX] != null)
                {
                    continue;
                }
                m.col      = hopX;
                m.row      = row;
                m.haveKill = true;
                m.delCol   = nextX;
                m.delRow   = row;
            }
            moves.Add(m);
        }

        //Проверяем возможность ходить прямо или бить назад
        for (int i = 0; i < moveY.Length; i++)
        {
            if (col == 0 || col == board.GetLength(1) - 1) // если крайние столбцы, то нельзя ходить вправо или влево
            {
                break;
            }
            int nextY = row + moveY[i];
            if (!IsMoveInBounds(col, nextY, ref board)) // проверяем край игрового поля для хода
            {
                continue;
            }
            Figure f = board[nextY, col];
            if (f != null && f.Color == Color) //проверяем находится ли на клетке фигура того же цвета
            {
                continue;
            }
            MoveTobit m = new MoveTobit();
            m.figure = this;
            if (f == null)  // добавляем координаты для обычного хода
            {
                if (i == 0) // это ход вперед
                {
                    m.col = col;
                    m.row = nextY;
                }
                else                //назад ходить нельзя
                {
                    continue;
                }
            }
            else //добавляем координаты для хода с поеданием фигуры противника
            {
                int hopY = nextY + moveY[i];
                if (!IsMoveInBounds(col, hopY, ref board))
                {
                    continue;
                }
                if (board[hopY, col] != null)
                {
                    continue;
                }
                m.col      = col;
                m.row      = hopY;
                m.haveKill = true;
                m.delCol   = col;
                m.delRow   = nextY;
            }

            moves.Add(m);
        }
        if (moves.Exists(x => (x as MoveTobit).haveKill))
        {
            moves = moves.FindAll(x => (x as MoveTobit).haveKill);
        }
        return(moves);
    }