在嵌套循环内迭代 char 数组

问题描述 投票:0回答:2

我正在用 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,它的迭代次数是否超出了我告诉它的范围?

提前致谢

java arrays char iteration nested-loops
2个回答
0
投票

问题出在

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
    }

0
投票

您的代码的主循环中还有一个额外的问题:

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();
© www.soinside.com 2019 - 2024. All rights reserved.