//Выводи находящиеся на доске фигуры 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(); }
//Проверяем выход за границы игрового поля 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); }
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; } } }
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); }
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--; } }
//Методы 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; } }
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]); } } } }
//Возвращаем массив всех фигур на поле 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); }
/// <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); }
/// <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); }