Ajuda com jogo da velha

1 resposta
C

ola galera, eu estou tentando fazer um jogo da velha jogado contra o computador no console. Esse código roda mas depois fica parado, alquem pode me ajudar? obrigado

import java.util.Random;
import java.util.Scanner;

public class Jogo {

private static char[][] mat = new char[3][3];
private static Random r = new Random();
private static Scanner input = new Scanner(System.in);
private static int contaJogos;

//construtor, inicializa a matriz com -
public Jogo(){
	System.out.println("   *** JOGO DA VELHA ***   ");
	reinicia();
}

public static void main(String[] args){
	Jogo jogo = new Jogo();
	if((contaJogos % 2) == 0){
			for(byte j = 0; j < 5; j++){
				jogo.mostraJogo();
				System.out.println("----------------");
				jogo.jogarHumano();
				jogo.mostraJogo();
				if(j == 9)
					break;
				System.out.println("----------------");
				jogo.jogarComp();
			}
	}
	else {
			for(byte j = 0; j < 5; j++){
				jogo.mostraJogo();
				System.out.println("----------------");
				jogo.jogarComp();
				jogo.mostraJogo();
				if(j == 9)
					break;
				System.out.println("----------------");
				jogo.jogarHumano();
				
				
			}
	}
		
}

//jogada do computador
private void jogarComp(){
	boolean loop = true;
	while(loop){
		int x = r.nextInt(2);
		int y = r.nextInt(2);
		
		if((mat[x][y]) == '-'){
			mat[x][y] = 'X';
			loop = false;
		}
	}
	
}//fim do método JogarComp

//jogada do jogador humano
private void jogarHumano(){
	boolean loop = true;
	while(loop){
		System.out.println("Sua vez.\nDigite a linha(de 0 a 2):");
		int x = input.nextInt();
		while((x > 2)||(x < 0)){
			System.out.println("Valor inválido.\nDigite a linha(de 0 a 2):");
			x = input.nextInt();
		}//fim do while interno
		
		System.out.println("Digite a coluna(de 0 a 2):");
		int y = input.nextInt();
		while((y > 2)||(y < 0)){
			System.out.println("Valor inválido.\nDigite a coluna(de 0 a 2):");
			y = input.nextInt();
		}//fim do while interno
		
		if((mat[x][y]) == '-'){
			mat[x][y] = 'O';
			loop = false;
		}//fim do while interno
	}//fim do while externo
}//fim do método jogarHumano

//mostra como esta o jogo
private void mostraJogo(){
	int cont = 0;
	for(char[] a : mat)
		for(char b : a){
			System.out.printf("[ %c ] ", b);
			cont++;
			if((cont % a.length) == 0)
				System.out.println();
		}
}

private void reinicia(){
	System.out.println("   !!! NOVO JOGO !!!");
	for(byte i = 0; i < mat.length; i++)
		for(byte j = 0; j < mat[i].length; j++)
			mat[i][j] = '-';
}

}

1 Resposta

S
Cloudx testei seu código e debugando vi o seguinte problema
private void jogarComp() {
		boolean loop = true;
		while (loop) {
			int x = r.nextInt(2);
			int y = r.nextInt(2);

			if ((mat[x][y]) == '-') {
				mat[x][y] = 'X';
				loop = false;
			}
		}
Nesse método quando você chama o r.nextInt(2) ele acaba sempre dando 0 ou 1 então ele entra em loop infinito aqui e trava. Testei dessa maneira e ele joga
// jogada do computador
	private void jogarComp() {
		boolean loop = true;
		while (loop) {
		
			int x = ( int ) Math.ceil( ( Math.random() * 10 ));
			int y = ( int ) Math.ceil( ( Math.random() * 10 ));
			
			if(x <= 2 && y <= 2){
				if ((mat[x][y]) == '-') {
					mat[x][y] = 'X';
					loop = false;
				}
			}
		}

	}// fim do método JogarComp
O outro problema que eu vi é que ele não termina o jogo mesmo depois de alguem ganhar. Depois você dá uma olhada nos seus controles.
Criado 5 de janeiro de 2008
Ultima resposta 7 de jan. de 2008
Respostas 1
Participantes 2