Ajuda laço de repetição

Boa noite!!

Terminei um programa que verifica o status de um jogo da velha, porém, usei muito ifs e elses, poderiam me ajudar a diminuir esses comandos usando mais os laços for e while.

 static int verificaStatus(char[][] tabuleiro) {
int status = -1;
int vazio = 0;
int vencedor1 = 1;
int vencedor2 = 2;
int empate = 3;
int andamento = 4;

    // Checar tabuleiro vazio
    if ( tabuleiro[0][0]==' ' && tabuleiro[1][0]==' ' && tabuleiro[2][0]==' '
    && tabuleiro[0][1]==' ' && tabuleiro[1][1]==' ' && tabuleiro[2][1]==' '
    && tabuleiro[0][1]==' ' && tabuleiro[1][1]==' ' && tabuleiro[2][1]==' '){

status = vazio;
return status;
    }
    //Checar X verticalmente
    if(tabuleiro[0][0] == 'X' && tabuleiro[1][0] == 'X' && tabuleiro [2][0] == 'X'){
   status = vencedor1;
        return status;
    }
     else if(tabuleiro[0][1] == 'X' && tabuleiro[1][1] == 'X' && tabuleiro[2][1] == 'X'){
  status = vencedor1;
  return status;
     }
     else if(tabuleiro[0][2] == 'X' && tabuleiro[1][2] == 'X' && tabuleiro[2][2] == 'X'){
status = vencedor1;
        return  status;
    }

     //Checar X horizontalmente
     else if(tabuleiro[0][0] == 'X' && tabuleiro[0][1] == 'X' && tabuleiro[0][2] == 'X'){
    status = vencedor1;  
    return  status;
    }
    else if(tabuleiro[1][0] == 'X' && tabuleiro[1][1] == 'X' && tabuleiro[1][2] == 'X'){
    status = vencedor1;
    return status;
    }
    else if(tabuleiro[2][0] == 'X' && tabuleiro[2][1] == 'X' && tabuleiro[2][2] == 'X'){
    status = vencedor1;
    return status;
    }
    //Checar X diagonalmente
    else if(tabuleiro[0][0] == 'X' && tabuleiro[1][1] == 'X' && tabuleiro[2][2] == 'X'){
    status = vencedor1;
    return status;
    }
    else if(tabuleiro[0][2] == 'X' && tabuleiro[1][1] == 'X' && tabuleiro[2][0] == 'X'){
    status = vencedor1;
    return status;
    }
    //Checar O verticalmente
    if(tabuleiro[0][0] == 'O' && tabuleiro[1][0] == 'O' && tabuleiro [2][0] == 'O'){
    status = vencedor2;
    return status;
    }
    else if(tabuleiro[0][1] == 'O' && tabuleiro[1][1] == 'O' && tabuleiro[2][1] == 'O'){
    status = vencedor2;
    return status;
    }
    else if(tabuleiro[0][2] == 'O' && tabuleiro[1][2] == 'O' && tabuleiro[2][2] == 'O'){
    status = vencedor2;
    return status;
    }

    //Checar O horizontalmente
    if(tabuleiro[0][0] == 'O' && tabuleiro[0][1] == 'O' && tabuleiro[0][2] == 'O'){
    status = vencedor2;
    return status;
    }
    else if(tabuleiro[1][0] == 'O' && tabuleiro[1][1] == 'O' && tabuleiro[1][2] == 'O'){
    status = vencedor2;
    return status;
    }
    else if(tabuleiro[2][0] == 'O' && tabuleiro[2][1] == 'O' && tabuleiro[2][2] == 'O'){
    status = vencedor2; // Status está recebendo o valor do vencedor 2 que é a peça O.
    return status;
    }

    //Checar O diagonalmente
    if(tabuleiro[0][0] == 'O' && tabuleiro[1][1] == 'O' && tabuleiro[2][2] == 'O'){
    status = vencedor2; // Status está recebendo o valor do vencedor 2 que é a peça O.
    return status;
    }
    else if(tabuleiro[0][2] == 'O' && tabuleiro[1][1] == 'O' && tabuleiro[2][0] == 'O'){
    status = vencedor2; // Status está recebendo o valor do vencedor 2 que é a peça O.
    return status;
    }
    //verificar se tem empate
    if(tabuleiro[0][0]!=' ' && tabuleiro[1][0]!=' ' && tabuleiro[2][0]!=' '
    && tabuleiro[0][1]!=' ' && tabuleiro[1][1]!=' ' && tabuleiro[2][1]!=' '
    && tabuleiro[0][1]!=' ' && tabuleiro[1][1]!=' ' && tabuleiro[2][1]!=' '){
status = empate; // Status está recebendo o valor de empate.
return status;
}

{
status = andamento; // Nenhuma das opções anteriores retorne status em andamento.
return status;
}
}

Como é que você está chamando o método verificaStatus? É a cada jogada?

Tenho 5 tabuleiros declarados no meu método main e cada um pode representar partidas diferentes.

public static void main(String[] args) {

char[][] tab0 = {{' ',' ',' '},{' ',' ',' '},{' ',' ',' '}};
char[][] tab1 = {{'X','X','X'},{'O','O',' '},{' ',' ',' '}};
char[][] tab2 = {{'O','X','X'},{'X','O','O'},{' ',' ','O'}};
char[][] tab3 = {{'O','X','X'},{'X','O','O'},{'O','X','X'}};
char[][] tab4 = {{' ',' ',' '},{'X','O','X'},{' ',' ',' '}};

System.out.println("Status calculado: " + verificaStatus(tab0));
System.out.println("Status esperado para o tabuleiro0: 0\n");

System.out.println("Status calculado: " + verificaStatus(tab1));
System.out.println("Status esperado para o tabuleiro1: 1\n");

System.out.println("Status calculado: " + verificaStatus(tab2));
System.out.println("Status esperado para o tabuleiro2: 2\n");

System.out.println("Status calculado: " + verificaStatus(tab3));
System.out.println("Status esperado para o tabuleiro1: 3\n");

System.out.println("Status calculado: " + verificaStatus(tab4));
System.out.println("Status esperado para o tabuleiro4: 4\n");


}
}

Você pode distribuir melhor o código em métodos. Exemplo:

public class JogoDaVelha {
	private final char[][] tabuleiro = {{'X', 'O', 'X'}, {'O', 'X', 'O'}, {'X', 'O', 'X'}};
	public static void main(String[] args){
		int resultado;
		JogoDaVelha jogo = new JogoDaVelha();
		
		for(short i = 0; i < jogo.tabuleiro.length; i++){
			for(short j = 0; j < jogo.tabuleiro[0].length; j++)
				System.out.print(jogo.tabuleiro[i][j] + " ");
			
			System.out.println(" ");
				
		}
		
		resultado = jogo.verificarStatus(jogo.tabuleiro);
		
		if(resultado != 3)
			System.out.println("\nO jogador " + resultado + " venceu!");
		else
			System.out.println("\nEmpate!");
		
	}
	
	public boolean tabuleiroVazio(char[][] tabuleiro){
		int contador = 0;
		
		for(short i = 0; i < tabuleiro.length; i++){
			for(short j = 0; j < tabuleiro[0].length; j++){
				if(tabuleiro[i][j] == ' '){
					contador++;
					status = andamento;
				}
			}
		}
		
		if(contador > 0)
			return false;
			
		return true;
	}
	
	public int verificarStatus(char[][] tabuleiro){
		int status = -1;
		int vazio = 0;
		int jogador1 = 1;
		int jogador2 = 2;
		int empate = 3;
		int andamento = 4;

		if(tabuleiroVazio(tabuleiro)){
			status = vazio;
		}
		
		if(checarHorizontalmente(tabuleiro) == 'X' 
			|| checarVerticalmente(tabuleiro) == 'X' 
			|| checarDiagonalPrincipal(tabuleiro) == 'X'
			|| checarDiagonalSecundaria(tabuleiro) == 'X')
			
			return jogador1;
			
		else if(checarHorizontalmente(tabuleiro) == 'O' 
			|| checarVerticalmente(tabuleiro) == 'O' 
			|| checarDiagonalPrincipal(tabuleiro) == 'O'
			|| checarDiagonalSecundaria(tabuleiro) == 'O')
			
			return jogador2;
			
		else
			return empate;
	}
	
	public char checarVerticalmente(char[][] tabuleiro){
		int contadorDeX = 1;
		int contadorDeO = 1;
		
		for(short i = 0; i < tabuleiro.length; i++){
			contadorDeX = 1;
			contadorDeO = 1;
			for(short j = 0; j < tabuleiro[0].length; j++){
				if(tabuleiro[j][i] == 'X')
					contadorDeX++;
					
				else if(tabuleiro[j][i] == 'O')
					contadorDeO++;
			}
		}
		
		System.out.println("\n\tChkV -> X = " + contadorDeX + " O: " + contadorDeO);
		
		if(contadorDeX == 3)
			return 'X';
		
		else if(contadorDeO == 3)
			return 'O';
			
		return 'N';
	}
	
	public char checarHorizontalmente(char[][] tabuleiro){
		int contadorDeX = 1;
		int contadorDeO = 1;
		
		for(short i = 0; i < tabuleiro.length; i++){
			for(short j = 0; j < tabuleiro[0].length; j++){
				if(tabuleiro[i][j] == 'X')
					contadorDeX++;
					
				if(tabuleiro[i][j] == 'O')
					contadorDeO++;
			}
		}
		System.out.println("\n\tChkH -> X = " + contadorDeX + " O: " + contadorDeO);
		if(contadorDeX == 3)
			return 'X';
		
		else if(contadorDeO == 3)
			return 'O';
			
		return 'N';
	}
	
	public char checarDiagonalPrincipal(char[][] tabuleiro){
		int contadorDeX = 1;
		int contadorDeO = 1;
		
		for(short i = 0; i < 3; i++){
			if(tabuleiro[i][i] == 'X')
				contadorDeX++;
					
			if(tabuleiro[i][i] == 'O')
				contadorDeO++;
		}
		System.out.println("\n\tChkDP -> X = " + contadorDeX + " O: " + contadorDeO);
		if(contadorDeX == 3)
			return 'X';
		
		else if(contadorDeO == 3)
			return 'O';
			
		return 'N';
	}
	
	public char checarDiagonalSecundaria(char[][] tabuleiro){
		int contadorDeX = 1;
		int contadorDeO = 1;
		
		for(short i = 0; i < 3; i++){
			for(short j = 2; j > 0; j--){
				if(tabuleiro[i][j] == 'X')
					contadorDeX++;
					
				if(tabuleiro[i][j] == 'O')
					contadorDeO++;
			}
		}
		System.out.println("\n\tChkDS -> X = " + contadorDeX + " O: " + contadorDeO);
		if(contadorDeX == 3)
			return 'X';
		
		else if(contadorDeO == 3)
			return 'O';
			
		return 'N';
	}
}

Eu não testei para ver se está funcionando a contento, mas creio que sirva como um norte…

Lohanne muito obrigado.

Testarei aqui.