Jogo da velha

Olá, esta é minha resolução de um trabalho de escola.
Eu deveria criar um jogo da velha, simples assim, ou quase simples assim…

    
    import java.util.Scanner;

    public class JogoDaVelha {
	private int x, y, cont, fim;
	private Scanner t;
	private String jogador1, jogador2, ganhador;
	private static String velha[][];

	public void jogoDaVelha() {
		cont = fim = 0;
		t = new Scanner(System.in);
		jogador1 = "";
		while (true) {
			System.out.println("Escolha X ou O");
			jogador1 = t.nextLine();
			if (jogador1.equals("X") || jogador1.equals("O")) {
				break;
			}
		}
		System.out.println("Jogador 1 fica com " + jogador1);
		if (jogador1.equals("X")) {
			jogador2 = "O";
			System.out.println("Jogador 2 fica com O");
		} else {
			jogador2 = "X";
			System.out.println("Jogador 2 fica com X");
		}
		velha = new String[3][3];
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				velha[i][j] = " ";
			}
		}
		while (true) {
			if (cont % 2 == 0) {
				System.out.println("Vez do jogador 1");
			} else {
				System.out.println("Vez do jogador 2");
			}
			while (true) {
				desenhar();
				x = 3;
				y = 3;
				while (x > 2) {
					System.out.println("Linha:");
					x = t.nextInt();
				}
				while (y > 2) {
					System.out.println("Coluna:");
					y = t.nextInt();
				}
				if (cont % 2 == 0) {
					if (velha[y][x].equals(" ")) {
						velha[y][x] = jogador1;
						break;
					} else {
						System.out.println("Posição já marcada. Marque outra posição");
					}
				} else {
					if (velha[y][x].equals(" ")) {
						velha[y][x] = jogador2;
						break;
					} else {
						System.out.println("Posição já marcada. Marque outra posição");
					}
				}
			}
			cont++;
			fim++;
			if (("X".equals(velha[0][2]) && "X".equals(velha[1][1]) && "X".equals(velha[2][1]))
					|| ("X".equals(velha[0][0]) && "X".equals(velha[1][1]) && "X".equals(velha[2][2]))
					|| ("X".equals(velha[0][0]) && "X".equals(velha[0][1]) && "X".equals(velha[0][2]))
					|| ("X".equals(velha[1][0]) && "X".equals(velha[1][1]) && "X".equals(velha[1][2]))
					|| ("X".equals(velha[2][0]) && "X".equals(velha[2][1]) && "X".equals(velha[2][2]))
					|| ("X".equals(velha[0][0]) && "X".equals(velha[1][0]) && "X".equals(velha[2][0]))
					|| ("X".equals(velha[0][1]) && "X".equals(velha[1][1]) && "X".equals(velha[2][1]))
					|| ("X".equals(velha[0][2]) && "X".equals(velha[1][2]) && "X".equals(velha[2][2]))) {
				ganhador = "X";
				break;
			} else if (("O".equals(velha[0][2]) && "O".equals(velha[1][1]) && "O".equals(velha[2][1]))
					|| ("O".equals(velha[0][0]) && "O".equals(velha[1][1]) && "O".equals(velha[2][2]))
					|| ("O".equals(velha[0][0]) && "O".equals(velha[0][1]) && "O".equals(velha[0][2]))
					|| ("O".equals(velha[1][0]) && "O".equals(velha[1][1]) && "O".equals(velha[1][2]))
					|| ("O".equals(velha[2][0]) && "O".equals(velha[2][1]) && "O".equals(velha[2][2]))
					|| ("O".equals(velha[0][0]) && "O".equals(velha[1][0]) && "O".equals(velha[2][0]))
					|| ("O".equals(velha[0][1]) && "O".equals(velha[1][1]) && "O".equals(velha[2][1]))
					|| ("O".equals(velha[0][2]) && "O".equals(velha[1][2]) && "O".equals(velha[2][2]))) {
				ganhador = "O";
				break;
			} else if (fim == 9) {
				break;
			}
		}
		if (jogador1.equals(ganhador)) {
			System.out.println("Jogador 1 ganhou!");
		} else if (jogador2.equals(ganhador)) {
			System.out.println("Jogador 2 ganhou");
		} else {
			System.out.println("Velha");
		}
		desenhar();
	}

	public static void desenhar() {
		System.out.println("   0   1   2");
		for (int i = 0; i < 3; i++) {
			System.out.print(i + " ");
			for (int j = 0; j < 3; j++) {
				if (j != 2) {
					System.out.print(" " + velha[i][j] + " |");
				} else {
					System.out.print(" " + velha[i][j]);
				}
			}
			if (i != 2) {
				System.out.println("\n  –––––––––––");
			} else {
				System.out.println("");
			}
		}
	}
}

vamos la

se um tabuleiro de jogo da velha é 3x3, vc tem 9 posições. na pior hipotese, os jogadores vão preencher todo o grid. isso significa q quem começa tem no maximo 5 jogadas, enquanto que o jogador que começou depois tem no maximo 4. 5+ 4 = 9 então faz sentido.

dessa forma, perceba que o seu primeiro loop não é exatamente um while(true) mas é um laço for, que vai executar por 9 passos no maximo.

como vc interrompe um loop? break.

por que vc interromperia? pq alguem ganhou.

como descobrir que alguem ganhou? se alguem completou uma linha.

aqui entra algumas mutretas.

por exemplo, se X esta jogando, então vc não precisa verificar se O completou. Se O completou, isso teria interrompido o jogo. então vc precisa de algo como

if ( completou( "X", velha ) ) { ... }
ou
if ( completou( "O", velha ) ) { ... }

completou recebe a letra e a tabela. então vc tem as seguintes verificações para fazer:

  1. verificar as linhas diagonais. (0,0) - (1,1) - (2,2) e (0,2) - (1,1) - (2,0)

  2. verificar as linhas horizontais e verticais. aqui cabe um loop

for( int i=0; i< 2; i++) {
  boolean linha  = letra.equals( velha[i][0] ) &&letra.equals( velha[i][1] ) && letra.equals( velha[i][2] );
  if ( linha ) { 
     // ganhou ...
    return true;
  }
}
for( int j=0; j< 2; j++) {
  boolean coluna  = letra.equals( velha[0][j] ) &&letra.equals( velha[1][j] ) && letra.equals( velha[2][j] );
  // ...
}

esse codigo pode ser simplificado de varias formas.

por exemplo isso:
boolean linha = letra.equals( velha[i][0] ) &&letra.equals( velha[i][1] ) && letra.equals( velha[i][2] );

vira

 boolean linha  = true;
for( int j =0; j < 2; j++ ){
   linha = linha &&  letra.equals( velha[i][j] ) 
}

a minha sugestão é vc fazer a tabela verdade em uma folha de papel e verificar cada afirmação minha.

1 curtida