[RESOLVIDO]Ajuda no jogo da Forca

12 respostas
G

E aí pessoal, eu tinha que fazer um jogo da forca. Tá eu fiz ele, só que tem um erro que não tô conseguindo resolver, tipo: vamos supor que a palavra é casa. Se a pessoa digitar a letra “c” ele vê como toda palavra e já da fim de jogo, se a pessoa digitar a letra “a” ele vê como erro e diminui as chances. Já olhei meu código e tal, mas não consigo achar o erro. Queria uma ajuda nessa parte aí que é só o que falta pro jogo roda direitinho, obrigado.

12 Respostas

pmlm

Como acho que ninguém aqui tem bola de cristal, ninguém vai conseguir ajudar a ver onde está o problema senão conseguir ver o código…

G

Ah é, tinha esquecido de postar aqui rs.

Scanner scn = new Scanner(System.in);

int forca = 0, cntC = 6, x, cntL = 0;  //cntC para chances e cntL para as letras 
	String palavraDigitada = "";
	char letra; 
	
	System.out.println("JOGO DA FORCA!!" );
	System.out.println() ;
	System.out.println("Digite uma palavra: " );
	palavraDigitada = scn.nextLine();
	
	
	char[] palavraCompleta = new char [palavraDigitada.length()]; //vetor que vai receber cada letra ate formar a palavra
	char[] tracos = new char[palavraDigitada.length()]; // vetor dos tracos
	int tamanho = palavraDigitada.length(); //verifica tamanho da palavra
		
	
	for(x = 0; x < tamanho; x++){ //cria os tracos com o tamanho da palavra
		  tracos[x] = '_';
	}
	
	System.out.println("Voce tem " +cntC + " chances de acertar." );
	System.out.println("Boa sorte!" );
	
	for(x = 0; x < palavraDigitada.length(); x++){
		palavraCompleta[x] = palavraDigitada.charAt(x);
	}
	do{
		System.out.println("A palavra a ser adivinhada eh: " );
		for(x = 0; x < tamanho; x++){
			System.out.print(tracos[x] + " " );
		}
		System.out.println();
		System.out.print("Digite uma letra: " );
		letra = scn.next().charAt(0); // recebe a letra
		
	
		
		for(x = 0; x < palavraDigitada.length(); x++){ 
			if(palavraCompleta[x] == letra){ //compara pra ver se a letra digita tem na palavrava
				for(x = 0; x < tamanho; x++){ //tracos recebe a letra
					tracos[x] = letra;
				}
				System.out.println("Letra certa, voce ainda tem " +cntC + " chances. :)" );
				break;
			}else{
				System.out.println("Letra errada ):" );
				cntC--;
				System.out.println();
				System.out.println("Voce ainda tem " +cntC + " chances."  );
				break;
			}
		}
		for(x = 0; x < palavraDigitada.length(); x++){	//compara a palavra digitada com os tracos, caso seja igual fim de jogo
			if(palavraDigitada.charAt(x) == tracos[x]){
				System.out.println("PARABENS! Voce completou toda a palavra." );
				forca++;
			}
		}	
		if(cntC == 0){ //se as chances do jogador terminarem, fim de jogo
			System.out.println("GAME OVER!" );
			System.out.println();
			System.out.println("Suas chances de acertar a palavra terminaram. " );
			forca++;
		}	
			
	}while(forca == 0);
pmlm

Está a complicar o que deveria ser fácil. Tens de parar e pensar em vez de ir por tentativa/erro.

Achas que, por exemplo, é isto que queres fazer?

for(x = 0; x < palavraDigitada.length(); x++){
    if(palavraCompleta[x] == letra){ //compara pra ver se a letra digita tem na palavrava
        for(x = 0; x < tamanho; x++){ //tracos recebe a letra
            tracos[x] = letra;
        } 
(...)
G

Eu quero comparar a letra digitada com a palavra toda pra ver se a letra existe nessa palavra. Eu tinha usado uma outra forma antes, aí nesse trecho.

for(x = 0; x < palavraDigitada.length(); x++){

if(palavraDigitada.charAt(x) == letra){ //compara pra ver se a letra digita tem na palavrava

for(x = 0; x < tamanho; x++){ //tracos recebe a letra

tracos[x] = letra;

}

System.out.println("Letra certa, voce ainda tem " +cntC + " chances. " );
pmlm

Tu aí estás a substituir todas as posições de tracos pela letra

G

Verdade, não tinha observado isso… Então eu devo deixar o tracos[x] = letra; só dentro do if e daí tirar o for?

pmlm

Sim, se encontrares uma letra igual, tu queres substituir aquela letra, não toda a palavra. Já estás a percorrer a palavra pelo for anterior.

F

Tenta debugar seu código e ver o que está acontecendo. Por exemplo neste trecho:

for(x = 0; x < palavraDigitada.length(); x++){ if(palavraCompleta[x] == letra){ //compara pra ver se a letra digita tem na palavrava for(x = 0; x < tamanho; x++){ //tracos recebe a letra tracos[x] = letra; } System.out.println("Letra certa, voce ainda tem " +cntC + " chances. " ); break; }else{ System.out.println("Letra errada ):" ); cntC--; System.out.println(); System.out.println("Voce ainda tem " +cntC + " chances." ); break; } } Olha o que acontece: Faz de conta que sua palavra é “oi”. Você digita ‘i’.
Primeira condição da false, já cai no else, falando que a letra está errada.
Outra coisa que vc está substituindo todos os traços pela letra.

G

É que eu ainda não uso programas como netbeans ou eclipse, tô no primeiro ano de analise e desenvolvimento de sistemas e daí não podemos usar esses programas. Então como eu poderia fazer pra ele receber a letra no lugar correspondente?

F

Você não precisa de IDEs para debugar o código.
Um simples System.out.print() para imprimir suas variáveis já resolve.
O que você precisa é entender o que está acontecendo no programa. Faça testes de mesa,
rode seu programa como se você fosse o compilador.

Fiz algumas alterações em uma parte. Agora fica a seu critério melhorar isso e corrigir o resto.

do {
            System.out.println("A palavra a ser adivinhada eh: ");
            for (x = 0; x < tamanho; x++) {
                System.out.print(tracos[x] + " ");
            }
            System.out.println();
            System.out.print("Digite uma letra: ");
            letra = scn.next().charAt(0); // recebe a letra

            boolean acertou = false;
            for (x = 0; x < tamanho; x++) {
                if (palavraCompleta[x] == letra) { //compara pra ver se a letra digita tem na palavrava
                    //for (x = 0; x < tamanho; x++) { //tracos recebe a letra
                        tracos[x] = letra;
                    //}
                    //System.out.println("Letra certa, voce ainda tem " + cntC + " chances. ");
                    //break;
                    acertou = true;
                } //else {
            }
            if (acertou == false) {
                    System.out.println("Letra errada ):");
                    cntC--;
                    System.out.println();
                    System.out.println("Voce ainda tem " + cntC + " chances.");
            } else {
                System.out.println("Letra certa, voce ainda tem " + cntC + " chances. ");
            }
                //}
            //}
         . . .

Veja que comentei o seu próprio código e modifiquei algumas coisas. Tenta entender o que acontece e melhorar a solução. :smiley:

G

Eu entendi tuas alterações, ficou até mais fácil de se entender o programa, mas eu não tô conseguindo pegar a ideia de comparar cada letra do vetor com a letra digitada e daí dizer se tá certa ou não.

F

Já falei pra você. Faz um teste de mesa.

Olha só: Palavra escolhida - oi; Primeira letra digitada: letra = i; Tamanho = 2;

Começando a partir do boolean acertou . . .

Entra no for = 0
   entra no if
      palavraCompleta[0] = 'o', é igual letra? Não
   sai do if
continua for = 1
   entra no if
      palavraCompleta[1] = 'i', é igual letra? Sim
      tracos[1] = 'letra' (tracos[] fica = "_ i")
      acertou = true
   sai do if
continua for = 2 (Ops, 2 não é < tamanho) Não entra no for

entra no if
    acertou é false? Não
sai do if

entra no else
    imprime
sai do else

E aí por diante. Não sei se errei algo hahaha, mas dá pra ter uma noção.

Criado 6 de junho de 2012
Ultima resposta 6 de jun. de 2012
Respostas 12
Participantes 3