private static Lines GetConsecutiveLines(Connect4Board b, PieceColor color, int col, Connect4Column move) { int horizontal = 1, vertical = 1, mainDiagonal = 1, antiDiagonal = 1; int nextX, nextY; for (nextX = col + 1, nextY = move.LastDropRow; nextX < Connect4Board.COLUMNS && b.GetPiece(nextY, nextX) == color; nextX++) horizontal++; for (nextX = col - 1; nextX >= 0 && b.GetPiece(nextY, nextX) == color; nextX--) horizontal++; for (nextX = col, nextY = move.LastDropRow + 1; nextY < Connect4Board.ROWS && b.GetPiece(nextY, nextX) == color; nextY++) vertical++; for (nextX = col, nextY = move.LastDropRow - 1; nextY >= 0 && b.GetPiece(nextY, nextX) == color; nextY--) vertical++; for (nextX = col + 1, nextY = move.LastDropRow + 1; nextX < Connect4Board.COLUMNS && nextY < Connect4Board.ROWS && b.GetPiece(nextY, nextX) == color; nextX++, nextY++) mainDiagonal++; for (nextX = col - 1, nextY = move.LastDropRow - 1; nextX >= 0 && nextY >= 0 && b.GetPiece(nextY, nextX) == color; nextX--, nextY--) mainDiagonal++; for (nextX = col + 1, nextY = move.LastDropRow - 1; nextX < Connect4Board.COLUMNS && nextY >= 0 && b.GetPiece(nextY, nextX) == color; nextX++, nextY--) antiDiagonal++; for (nextX = col - 1, nextY = move.LastDropRow + 1; nextX >= 0 && nextY < Connect4Board.ROWS && b.GetPiece(nextY, nextX) == color; nextX--, nextY++) antiDiagonal++; return new Lines(horizontal, vertical, mainDiagonal, antiDiagonal); }
public Connect4Board() { columns = new Connect4Column[COLUMNS]; for (int i = 0; i < columns.Length; i++) columns[i] = new Connect4Column(); turn = Turn.NOT_IN_SESSION; }
internal static MoveResult CurrentStatus(Connect4Board b, Player p, int col, Connect4Column move) { Lines sucessive = GetConsecutiveLines(b, p.Color, col, move); if (sucessive.horizontal == 4 || sucessive.vertical == 4 || sucessive.mainDiagonal == 4 || sucessive.antiDiagonal == 4) return MoveResult.FOUR_IN_A_ROW; for (int i = 0; i < Connect4Board.ROWS; i++) for (int j = 0; j < Connect4Board.COLUMNS; j++) if (b.GetPiece(i, j) == PieceColor.EMPTY) return MoveResult.NORMAL; return MoveResult.BOARD_FILLED; }