Dúvida sobre como percorrer um Array!

Olá, pessoal. Tudo bem?

Ando quebrando a cabeça faz um tempo, volte e meia venho parar nesse site e resolvi fazer uma conta para perguntar, e tbm para fazer parte pois estou entrando de cabeça nesse mundo do Java, acredito que vou aparecer bastante por aqui, vou tentar sempre ajudar também e tal! Bom, após chegar em vários outros topicos e nenhum conseguir encontrar o que exatamente preciso, sei que é algo simples pois meu professor chegou a resolver em sala pra mim na semana passada e me deu uma “luz”, mas deu pau no meu HD e perdi meus codigos :((( e agora preciso entregar pra ele amanhã e não consigo nem passar da parte que eu estava com dificuldade e ja tinha sido “resolvida”, rs… E ai preciso da ajuda de vocês pra não perguntar a mesma coisa denovo pro prof kkkk vamos lá galera é o seguinte!

Estou desenvolvendo o tal do jogo da forca! Tenho duas classes:

Jogo.java:
pastebin.com/1CUGGeGG

e Tela.java:
pastebin.com/gXKWpJi7

O meu problema está no metodo VerificaAcerto() da classe Jogo.java!

Eu quero que quando o jogador tentar uma letra, caso ele acerte, mostre o “tabuleiro” atualizado com a sua tentativa. Por exemplo, vamos dizer que o cara tentou a letra L (minha senha é PUBLIC):

*L >> Resumidamente, nao consigo colocar a tentativa dele dentro do local onde ela deve estar. Na verdade, por esse codigo até o momento ele nem ta conseguindo autenticar que a letra está certa!

Mas quero que ele mostre isso pro usuário. Seguido do numero de erros e quantas tentativas ele ainda tem (das 15 ao total).

E ai então vai partir para a proxima tentativa (acredito que aqui eu resolva com um while mas ainda não cheguei nessa parte, estou travado nessa questão de como saber qual é o local onde está a letra que ele digitou dentro do meu array). E caso ele erre, vai mostrar apenas “******” novamente.

Consegui me expressar bem? Enfim, espero que alguém possa me ajudar, estou naquela travada chata que você tá doido pra continuar o código mas fica patinando numa coisa. Acho que só falta cair a ficha.

Valeu pessoal! Muito obrigado desde já.

Acho que vc se confundiu array com String, a senha é um array de String, mas o que vc quer comparar é a senha[0] e não a senha.

Para comparar cada letra numa String, use charAt para obter a letra e compare com ==.

public void verificaAcerto() {
 // seleciona a senha
 String senhaSelecionada = senha[0];
 // achou alguma letra
 boolean achou = false;
 // letra tentada
 char letraTentativa = getTentativa().charAt(0);
 // novo tabuleiro
 String novoTabuleiro = "";

 // para cada char da senha faca
 for (int i = 0; i < senhaSelecionada.length(); i++) {
  // obtem a letra na posicao i
  char letraSelecionada = senhaSelecionada.charAt(i);

  if (letraSelecionada == letraTentativa) {
   novoTabuleiro = novoTabuleiro + letraSelecionada;
   achou = true;
  } else {
   novoTabuleiro = novoTabuleiro + "*";
  }

 }
 // se nao achou
 if (!achou) {
  erros++;
 }
 setTabuleiro(novoTabuleiro);
}
1 curtida

Muito obrigado, amigo. Já me ajudou muito. Mas só por curiosidade… Não teria uma outra forma talvez mais “simples” de resolver? Lembro que quando meu professor debugou pra mim na aula, ele falou que nem ia precisar usar if, o metodo tava até parecido com o que eu ja tinha feito. A “sacada” era atualizar o tabuleiro e sempre mostrar o tabuleiro atualizado pro jogador, mas nao lembro como ele fez… Mas mesmo assim muito obrigado!

Provavelmente, mas na minha opinião a forma mais simples é aquela que eu consiga entender, acredito que eu consiga resolver isso com apenas 3 ou 4 linhas de código, mas não ficaria tão fácil de entender o código.

String novoTabuleiro = senha[0].replaceAll("[^" + getTentativa() + getTabuleiro() + "]", "*");
erros += novoTabuleiro.equals(getTabuleiro()) ? 1 : 0;
setTabuleiro(novoTabuleiro);

Agora estou na parte do while e achei que seria mais facil, rs. Estava tentando percorrer com o while enquanto não tiver 15 erros ou o NovoTabuleiro == senha, mas estava dando certo pois senha é um array de string e novoTabuleiro não… Aí tentei capturar o numero de acertos e quando tivesse em “5” (public) ele ganhava, mas mesmo assim não está no raciocinio certo pois logo vou trabalhar os niveis e isso não vai estar nem um pouco orientado a objetos né… E também ele estava dando um “loop infinito” quando eu acertava a letra, pois ela sempre estava certa… E o cara ganhava o jogo. Segue:

Jogo.java
http://pastebin.com/S3m5frms

Tela.java
http://pastebin.com/WGpgzrxj

Help!! :frowning:

Onde está

novoTabuleiro == "PUBLIC"

troque por

novoTabuleiro.equals("PUBLIC")

Comparar Strings e Objetos use o equals, tipos nativos use ==.


Será fim de jogo quando venceu ou perdeu

public boolean fimDeJogo() {
  if (venceu || perdeu) return true;
  else return false;
}

e no while

while(!jogo.fimDeJogo()) {

1 curtida

Estou num loop infinito e não estou entendendo por que. Estou seguindo as instruções que o Diego12 passou mas acho que não apliquei certo :confused:

Jogo.java:
http://pastebin.com/hxTanJQJ

Tela.java: //coloquei o while aqui pra tentar corrigir o loop infinito mas não deu certo tbm
http://pastebin.com/qqTGaS08

Mova o seguinte trecho para fora do loop

if (!achou) {
 erros++;
}

if (achou) {
 numeroDeAcertos++;
}

e altere o getSenha para

public String getSenha() {
 return senha[0].toString();
}

Poxa amigo, num ta dando não… Agora o loop mudou, mas continua. Exibe:

Tentativa: P
P*****
P*****
1
PP
PP
2
PPP*****
PPP*****
3
PPPP
PPPP
4
PPPPP*****
PPPPP*****
5
PPPPPP
PPPPPP
6
(e assim consecutivamente até o 15)

E aparece isso mesmo a letra estando errada :confused: ja tentei um monte de coisa antes de voltar aqui mas nada que fiz deu certo, só piorei a coisa ;/

Jogo.java http://pastebin.com/UTB5TGU0
Tela esta como antes ainda, a unica coisa que mudei é que resolvi colocar o while lá, ao invés de aqui no jogo, mas da no mesmo…

//enquanto
while(!jg.fimDeJogo()) {
jg.verificaAcerto();
System.out.println(jg.getNovoTabuleiro());
System.out.println(jg.erros);

}

Alguém? ;/ :frowning:

Não cheguei a testar, mas o while estava errado

Seria mais ou menos assim:

enquanto não terminar o jogo repita {
  obtem a letra digitada pelo usuario;
  insere no tabuleiro;
  verifica estado do tabuleiro;
  exibe estado do tabuleiro, incluindo se ganhou ou perdeu;
}

import java.util.Arrays;
import java.util.Scanner;
import java.util.*;
import java.lang.*;
import java.io.*;

public class Tela {

 public String coletaNome() {
  Scanner sc = new Scanner(System.in);
  System.out.printf("Qual seu nome, jogador?\n\n");
  String nome = sc.next();
  return nome;
 }

 public String coletaTentativa() {
  Scanner sc = new Scanner(System.in);
  System.out.printf("Tentativa: ");
  String tentativa = sc.next();
  return tentativa;
 }


 public static void main(String[] args) {

  Tela t = new Tela();
  Jogo jg = new Jogo();


  // - O jogo apresenta o objetivo ao jogador;
  System.out.println(jg.getObj());

  // - O jogador se identifica;
  String nome = t.coletaNome();
  jg.setNome(nome);

  //enquanto
  while (!jg.fimDeJogo()) {
   // - O jogo apresenta a categoria,
   //a quantidade máxima de tentativas erradas
   //e quantas letras possuem a palavra selecionada;

   System.out.println(jg.getCat());

   // - O jogador tenta uma letra;
   String tentativa = t.coletaTentativa();
   jg.setTentativa(tentativa);

   // - O jogo apresenta as letras acertadas pelo jogador
   //na respectiva posição da palavra, a quantidade de erros
   //e a quantidade máxima de tentativas erradas.
   //Exemplo: [*a*a] 01/06 ;
   jg.verificaAcerto();
   System.out.println(jg.getNovoTabuleiro());
   System.out.println(jg.erros);
  }
 }
}

O motivo de estar imprimindo dessa forma é porque vc não entendeu o código que eu postei, o novoTabuleiro precisa ser resetado e funciona como uma variável auxiliar para a reconstrução do tabuleiro, portanto:

public void verificaAcerto() {
    novoTabuleiro = ""; // valor sempre deve comecar vazio