#java #tic-tac-toe
Вопрос:
Я делаю n*n tictactoe, с помощью которого игрок может выбрать размер доски. Однако, когда я пытаюсь определить победителя методом checkWinner (), независимо от того, выигрывает игрок 1 или 2, всегда выводится, что победитель-игрок 1. Есть ли что-то не так с анализом playerTurn? Когда я пытаюсь напечатать номер игрока в методе CheckIfWinner, он выводит 2 строки Номер игрока: 1 и номер игрока : 2
private Matrix cells;
// '-' - not occupied,
// 'x' - taken up player 1,
// 'o' - taken up by player 2
char c = '-';
int n;
public TicTacToe() {
// prompt user to choose size of tictactoe
print("Please set the size of cells(e.g. 4 = 4x4 ): ");
Scanner sc = new Scanner(System.in);
String playerInput = sc.nextLine();
n = Integer.parseInt(playerInput);
println("n: " n);
cells = new Matrix(n);
}
public void executeGame() {
// should allow the player to set the cells to other size (e.g. 4x4 or 5x5)
int turn = 0;
int playerTurn = 1;
int winner = 0;
cells.set(n - 1, n - 1, c);
while (turn < n * n) {
// while turn is less than n*n
// print cells
cells.display();
// get and set tick from Player 1
askGetAndAskPlayerForTick(playerTurn);
println("player turn is : " playerTurn);
// check if there is a winner - if there is winner break from the while loop
winner = checkWinner();
if (winner != 0) {
break;
}
if (playerTurn == 1) {
playerTurn = 2;
} else {
playerTurn = 1;
}
turn ;
}
// display draw or the winner
cells.display();
if (winner != 0) {
println("The winner is : Player " winner);
} else {
println("There is no winner");
}
}
private void askGetAndAskPlayerForTick(int playerNumber) {
// should check if the cell is taken up
// set player 1 to 'x' and player 2 to 'o'
if (playerNumber == 1) {
c = 'x';
} else if (playerNumber == 2) {
c = 'o';
}
print("Player " playerNumber "(" c ")" ":");
Scanner keyboard = new Scanner(System.in);
String playerInput = keyboard.nextLine();
String[] inputs = playerInput.split(" ");
int row = Integer.parseInt(inputs[0]);
int col = Integer.parseInt(inputs[1]);
if (row - 1 < 0 || col - 1 < 0 || row >= n 1 || col >= n 1) {
println("The index is out of bounds of the matrix! Please enter a valid range!");
//askGetAndAskPlayerForTick(playerNumber);
} else if (cells.get(row - 1, col - 1) != '-') {
println("This position is filled! Please try again.");
//askGetAndAskPlayerForTick(playerNumber);
}
cells.set(row - 1, col - 1, c);
}
// 0 - no winner, 1 - player 1 is the winner, 2 - player 2 is the winner
private int checkWinner() {
int winner = 0;
// check for player 1
if (checkIfWinner(1)) {
winner = 1;
} else if (checkIfWinner(2)) {
winner = 2;
}
// check for player 2
return winner;
}
private boolean checkIfWinner(int playerNumber) {
boolean win = false;
println("player number is: " playerNumber);
// check for row win
for (int i = 0; i < n; i ) {
boolean row = true;
char value = (char) cells.get(i, 0);
// check for unfilled space in a row
if (value == '-') {
row = false;
} else {
for (int j = 0; j < n; j ) {
if (cells.get(i, j) != value) {
row = false;
break;
}
}
}
if (row) {
win = true;
}
}
return win;
}
Комментарии:
1. Я не проверял это, но в функции checkIfWinner вы отправляете номер игрока, но не проверяете персонажа игрока (x или o). Поэтому, когда вы вызываете
if(checkIfWinner(1))
его, он немедленно возвращает выигрыш 1, даже если строка заполнена буквами «о»