TicTacToe ou Jogo da Velha

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

Considerando que você tem um vencedor quando uma linha, coluna ou diagonal está preenchida com valores iguais, creio que a validação realizada não esteja cobrindo todos os casos.

Acredito que tive todos os casos em conta. Se não estou enganado os casos de vitória são 8, 3 linhas + 3 colunas + 2 diagonais, e estão representados no array winCombos do método winner

Lógica confusa.
Por que usar o array? E parte obrigatória da execução?
Esse exercício tem qual finalidade? A fixação de qual conteúdo?

O exercício é para criar o jogo TicTacToe com 2 jogadores e o uso do array para os casos de vitória não é obrigatório, foi a solução que encontrei. O exercício está no tópico sobre classes e objectos do livro “Java como programar 10 edição”. Se houver uma lógica melhor agradecia a dica.

Consegui resolver todos os bugs. Fiz alteracoes no metodo winner.
Aqui vai o novo codigo:

public class TicTacToe
{
private enum Status {X, O, EMPTY};
private Status[][] board = new Status[3][3];
private boolean win = false;

public TicTacToe()
{
	for(int i = 0; i < board.length; i++)
	{
		for(int j = 0; j < board[i].length; j++)
		{
			board[i][j] = Status.EMPTY;
		}
	}
}


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;
				}
			}
		}
	}
}


private void winner(Status[][] board)
{
	final String[] winCombos = {"000102", "101112", "202122", "001020", "011121", "021222", "001122", "021120"};
	String defaultCombo = null;
	String comboX = "";
	String comboO = "";
	int yesX = 0;
	int yesO = 0;
	int countX = 0;
	int countO = 0;
	String subDefault = "";
	String subCombo = "";
	
	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)
				{
					System.out.println(comboX);
					
					for(int k = 0; k < 8; k++)
					{
						yesX = 0;
						defaultCombo = winCombos[k];
						
						for(int l = 0; l < defaultCombo.length(); l += 2)
						{
							subDefault = (String) defaultCombo.subSequence(l, l+2);
								
							for(int m = 0; m < comboX.length(); m += 2)
							{
								subCombo = (String) comboX.subSequence(m, m+2);
								
								if(subDefault.equalsIgnoreCase(subCombo))
								{
									yesX++;
									break;
								}
							}
							
							if(yesX == 3)
							{
								printBoard();
								
								System.out.println("O jogador 1 é o vencedor!");
								win = true;
								break;
							}
						}
						
						if(yesX == 3)
						{
							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 < defaultCombo.length(); l += 2)
						{
							subDefault = (String) defaultCombo.subSequence(l, l+2);

							for(int m = 0; m < comboO.length(); m += 2)
							{
								subCombo = (String) comboO.subSequence(m, m+2);
								
								if(subDefault.equalsIgnoreCase(subCombo))
								{
									yesO++;
									break;
								}
							}
							
							if(yesO == 3)
							{
								printBoard();
								
								System.out.println("O jogador 2 é o vencedor!");
								win = true;
								break;
							}
						}
						
						if(yesO == 3)
						{
							break;
						}
					}
				}
			}
			
			if(yesX == 3 || yesO == 3)
			{
				break;
			}
		}
		
		if(yesX == 3 || yesO == 3)
		{
			break;
		}
	}
}


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;
		
		do
		{
			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();
			
			if(!board[line][column].equals(Status.EMPTY))
			{
				printBoard();
				System.out.println();

				System.out.println("A posição está ocupada! Jogue em uma posição vazia.");
				System.out.println();
			}
		}while(!board[line][column].equals(Status.EMPTY));	
		
		setBoard(player, line, column);
		
		count++;
		
		if(count != 10)
		{
			winner(board);
			
			if(win)
			{
				break;
			}
		}
		else
		{
			printBoard();
			
			System.out.println("O jogo está empatado!");
			break;
		}
	}while(count < 10);
}


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();
	}
}

}