Impasse para finalizar - Jogo da Forca

Bom dia pessoal, eu sou novo no universo JAVA (mais ou menos 1 mês de estudos) e no fórum. Fiquei um bom tempo sem saber como aplicar/testar meus conhecimentos adquiridos, até que cheguei a ideia de tentar criar uma espécie de jogo da forca. Dessa forma consigo aplicar alguns do que já aprendi e ao me deparar com algum problema aprender a resolvê-lo (e foram muitos até aqui kkkk).

Link do código:

Após esse resumo sobre como cheguei aqui vamos ao que eu consegui até o momento:

  • Uma forma de sortear a palavra que dará início ao “jogo” por meio de um array;
  • Transformar a palavra sorteada em uma ArrayList de chars e converte-los para “*”, de forma que a pessoa visualize a quantidade de letras da palavra sorteada sem ter acesso a mesma;
  • Criar um input do char que o usuário dará como palpite e substituir os “*” por esse char no gabarito, dando assim a posição correta dos caracteres para o usuário.

Agora que vem onde empaquei:
Preciso criar uma forma de verificar e quantificar os erros. Tentei de diversas formas, mas todas as formas que eu faço terminam da mesma forma. Ele contabiliza um erro para cada caractere verificado, ex.: Se a palavra sorteada for “casa”, será impresso inicialmente “***", após o input “a” ficaria “aa”, mas por causa dos dois "” na palavra ela acaba contabilizando dois erros ao invés de um só. Já tentei algumas variações dessa alternativa, mas o máximo que consegui foi um true pra quando tem erro e um false pra quando não tem.

Desculpem pela extensão do texto e por prováveis bizarrices que vierem a ter no meu código, estou apenas começando e achei melhor quebrar cabeça e tentar executar “sozinho” e com o que eu sabia pra posteriormente ir modificando e deixando ele com uma sintaxe melhor.
Sugestões sempre serão bem-vindas. :grinning:

Não sei como estava seu código, mas você está no caminho certo com essa opção. Você não pode aterar a variável quantidadeDeErros quando não acha a letra em uma determinada posição da palavra, apenas quando não acha em nenhuma posição, somente após verificar todas.

Se quiser simplificar, em vez de verificar com charAt, você pode usar indexOf. Isso vai te dar a informação se a letra existe ou não na palavra, sem você precisar fazer o loop. Algo como:

void verificaLetra(char c) {
	if (palavraSorteada.indexOf(c) == -1){
		// letra não existe na palavra, incrementa quantidadeDeErros
		quantidadeDeErros++;
	} else {
		// aqui você faz o loop para substituir a letra no gabarito
		// sem mexer na quantidadeDeErros
		for (int i = 0; i < palavraSorteada.length(); i++) {
			if (palavraSorteada.charAt(i) == c)
				gabarito.set(i, c);
		}
	}
}

Obviamente, como você acaba tendo que fazer o loop pra trocar os asteriscos por letras, pode não ser tão benéfico, mas é uma opção.

Abraço.

1 curtida

Opa, muito obrigado amigo, vou testar aqui e já posto como ficou.

Edit.: Fiz aqui e deu certo, muito obrigado mesmo amigo. Só depois que você me mostrou que vi que estava tentando o tempo todo a verificação no gabarito, sendo que é mais eficiente fazer a verificação na própria palavraSorteada. Muito obrigado novamente e abraços.