Boa tarde para todos
Estou a implementar o jogo da velha, mas estou com um erro na logica. Em certos casos o jogador vence mesmo sem ter alinhado devidamente as 3 jogadas.
Aqui vai o codigo:
import java.util.Scanner;
public class TicTacToe
{
private enum Status {X, O, EMPTY}; // O EMPTY representa espaco vazio no tabuleiro, X e O jogadas dos jogadores 1 e 2 respectivamente
private Status[][] board = new Status[3][3]; // Representa o tabuleiro do jogo
private boolean win = false; //E alterado para true caso um dos jogadores venca
// O constructor inicializa todos espacos do tabuleiro como "vazio"
public TicTacToe()
{
for(int i = 0; i < board.length; i++)
{
for(int j = 0; j < board[i].length; j++)
{
board[i][j] = Status.EMPTY;
}
}
}
// Marca, no tabuleiro, com X ou O na posicao desejada
private void setBoard(int player, int line, int column)
{
Status status = player == 1 ? Status.X : Status.O;
for(int i = 0; i < board.length; i++)
{
for(int j = 0; j < board[i].length; j++)
{
if(i == line && j == column)
{
if(board[i][j].equals(Status.EMPTY))
{
board[i][j] = status;
}
else
{
System.out.println("A posição está ocupada! Jogue em uma posição vazia.");
}
}
}
}
}
// Determina um vencedor
private void winner(Status[][] board)
{
final String[] winCombos = {"000102", "101112", "202122", "001020", "011121", "021222", "001122", "021120"};
String defaultCombo = null;
String comboX = "";
String comboO = "";
char defaultChar = 0;
int yesX = 0;
int yesO = 0;
int countX = 0;
int countO = 0;
for(int i = 0; i < board.length; i++)
{
for(int j = 0; j < board[i].length; j++)
{
if(board[i][j].equals(Status.X))
{
comboX += i+""+j;
countX++;
if(countX >= 3)
{
for(int k = 0; k < 8; k++)
{
yesX = 0;
defaultCombo = winCombos[k];
for(int l = 0; l < 6; l++)
{
defaultChar = defaultCombo.charAt(l);
for(int m = 0; m < countX*2; m++)
{
if(defaultChar == comboX.charAt(m))
{
yesX++;
break;
}
}
}
if(yesX == 6)
{
printBoard();
System.out.println("O jogador 1 é o vencedor!");
win = true;
break;
}
}
}
}
else if(board[i][j].equals(Status.O))
{
comboO += i+""+j;
countO++;
if(countO >= 3)
{
for(int k = 0; k < 8; k++)
{
yesO = 0;
defaultCombo = winCombos[k];
for(int l = 0; l < 6; l++)
{
defaultChar = defaultCombo.charAt(l);
for(int m = 0; m < countO*2; m++)
{
System.out.println(yesO+" p2");
if(defaultChar == comboO.charAt(m))
{
yesO++;
break;
}
}
}
if(yesO == 6)
{
printBoard();
System.out.println("O jogador 2 é o vencedor!");
win = true;
break;
}
}
}
}
if(yesX == 6 || yesO == 6)
{
break;
}
}
if(yesX == 6 || yesO == 6)
{
break;
}
}
}
// Junta-se os metodos aqui para criar o jogo
public void play()
{
int count = 1;
int player = 0;
int line = 0;
int column = 0;
Scanner input = new Scanner(System.in);
do
{
System.out.println("TABULEIRO");
System.out.println("_________");
System.out.println();
printBoard();
System.out.println();
player = count%2 != 0 ? 1 : 0;
System.out.printf("%s %d", "JOGADOR", player == 0 ? 2 : 1);
System.out.println();
System.out.print("Insira o número correspondente a linha da posição a jogar:");
line = input.nextInt();
System.out.println();
System.out.print("Insira o número correspondente a coluna da posição a jogar:");
column = input.nextInt();
System.out.println();
setBoard(player, line, column);
count++;
if(count != 9)
{
winner(board);
if(win)
{
break;
}
}
else
{
printBoard();
System.out.println("O jogo está empatado!");
break;
}
}while(count < 10);
}
// Imprime o tabuleiro
private void printBoard()
{
for(int i = 0; i < board.length; i++)
{
for(int j = 0; j < board[i].length; j++)
{
System.out.printf("%-8s", board[i][j]);
}
System.out.println();
System.out.println();
}
}
}
Agradeco desde ja qualquer ajuda