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.
[RESOLVIDO]Ajuda no jogo da Forca
12 Respostas
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…
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);
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;
}
(...)
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. " );
Tu aí estás a substituir todas as posições de tracos pela letra
Verdade, não tinha observado isso… Então eu devo deixar o tracos[x] = letra; só dentro do if e daí tirar o for?
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.
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.
É 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?
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. 
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.
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.