在嵌套循环中迭代 char 数组

如何解决在嵌套循环中迭代 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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res