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…