如何解决在嵌套循环中迭代 char 数组
我正在用 Java 创建一个 Hangman 游戏,但是我在将字母与单词(字符数组)进行比较时使用的循环遇到了一些问题:
public class Hangman{
static String seleccionar(){
//Se selecciona al azar una palabra de la lista
String[] palabras = {"callado","llamar","esgrima","monedero","tortuga","semanas","matutino","graduar","domador","regazo","vicio","carrito","esqueleto","golosinas","zodiaco","anestesia","pera","clase","acierto","oliva"};
int numero = 0;
numero = (int)(Math.random() * 9);
String palabra = palabras[numero];
return palabra;
}
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
System.out.println("Ahorcado");
//Método retorna una palabra aleatoria //Method that returns random word
String palabra = seleccionar();
System.out.println(palabra);
char[] letras = palabra.toCharArray();
//Ocultar la palabra //Hiding the word
char[] oculto = new char[palabra.length()];
for (int i = 0; i < palabra.length(); i++){
String underscore = "_";
oculto[i] = underscore.charAt(0);
}
//Here's the issue
int contador = 0;
int s = 0;
for (int k = 0; k < palabra.length(); k++){
char letraUsuario = sc.next().charAt(0);
for (char letra: letras){
if (String.valueOf(letraUsuario).equalsIgnoreCase(String.valueOf(String.valueOf(letra)))){
oculto[s] = letraUsuario;
}
else{
contador += 1;
}
s += 1;
}
for (char letra: oculto){
System.out.print(letra);
}
System.out.println();
if (contador == 7){
break;
}
}
sc.close();
}
所以当我运行它时,终端显示:
Ahorcado
esgrima
r
___r___
m
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 12 out of bounds for length 7
at Hangman.main(Hangman.java:36)
我不太确定它为什么显示索引 12,它的迭代次数是否比我告诉它执行的要多?
事先谢谢
解决方法
问题出在 s
变量中,您正在递增(每次循环 +1 以获取单词中的下一个字母),但是当移动检查下一个 palabra
时,您不要将 s
重置回 0 以从第 0 个字母开始检查。所以固定代码很简单:
int contador = 0;
int s = 0; //SETTING AT 0
for (int k = 0; k < palabra.length(); k++){
s=0; //RESETTING FOR EACH NEW WORD
char letraUsuario = sc.next().charAt(0); //ievada simbolu
for (char letra: letras){
if (String.valueOf(letraUsuario).equalsIgnoreCase(String.valueOf(String.valueOf(letra)))){
oculto[s] = letraUsuario;
} else{
contador += 1;
}
s += 1; //this reaches the length of the word at the end of inner loop
}
,
您的代码主循环中还有一个问题:
for (char letra: letras){
if (String.valueOf(letraUsuario).equalsIgnoreCase(String.valueOf(String.valueOf(letra)))){
oculto[s] = letraUsuario;
}
else{
contador += 1;
}
s += 1;
}
即使字母包含在单词中,contador 也会递增,这意味着对于更长的单词,一个错误就会结束游戏。只有在完成整个循环后还没有找到匹配的字符时,才应该增加它。
我建议你使用 Map
char[] oculto = new char[palabra.length()];
Map<Character,List<Integer>> characterIndexes = new HashMap<>();
for (int i = 0; i < oculto.length; i++) {
oculto[i] = '_';
if (!characterIndexes.containsKey(letras[i])) {
List<Integer> indexes = new ArrayList<>();
indexes.add(i);
characterIndexes.put(letras[i],indexes);
} else {
characterIndexes.get(letras[i]).add(i);
}
}
int contador = 0;
for (int k = 0; k < palabra.length(); k++) {
char letraUsuario = Character.toLowerCase(sc.next().charAt(0));
if (characterIndexes.containsKey(letraUsuario)) {
for (int i : characterIndexes.get(letraUsuario)) {
oculto[i] = letraUsuario;
}
} else {
contador++;
}
for (char letra : oculto) {
System.out.print(letra);
}
System.out.println();
if (contador == 7) {
break;
}
}
sc.close();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。