【问题标题】:Stuck In For Loop?卡在循环中?
【发布时间】:2015-08-26 13:28:48
【问题描述】:

好吧,我在我的游戏中添加了保存(通过序列化),它工作得很好,但是这些项目有一些东西,比如精灵和我逻辑上不会保存的东西,我解决这个问题的方法很简单。

我在我的 Item 类中创建了一个方法(每个项目都扩展它),将它需要的所有内容分配给它(称为 basicInitialization())。这很好用!

但是,我注意到在加载项目之后放置的任何代码都不会运行。我调查并意识到我陷入了无限的for循环:

public void loadItems(Player p) {
        Item[] temp = SaveGame.loadItems();
        for (int i = 0; i < items.length; i++) {
            this.removeByIndex(i);  
        }
        for (int j = 0; j < temp.length; j++) {
            items[j] = temp[j];
        }
        for (int t = 0; t < items.length; t++) {

            if (items[t] == null) {
                t += 1;
            } 


            items[t].basicInitialization();

            if (items[t] instanceof EquipableItem) {
                items[t].basicInitialization(((EquipableItem)items[t]).slot);
            }
        }
    }

当我删除:

items[t].basicInitialization();

if (items[t] instanceof EquipableItem) {
    items[t].basicInitialization(((EquipableItem)temp[t]).slot);                
}

部分和问题消失了。

我在这里遗漏了一些非常明显的东西吗?
感谢您提供的任何帮助,如果需要更多代码,我会很乐意提供!

编辑: - 重构了一些代码 下面是一个基本初始化的例子:

 public void basicInitialization() {
            this.sprite = Sprite.HealthPotion;
            this.name = "Health Potion";
            this.value = "25";
            this.desc = "Heals Up to 5 HP";
            level = Game.getGame().getLevel();
        }

【问题讨论】:

  • 告诉我们basicInitialization()?它是否调用loadItems()
  • 不,在原帖中添加了一个健康药水的例子。
  • 你确定这是一个很好的循环,而不是异常或需要很长时间的调用?如果你把 println 放在循环中,它会一遍又一遍地打印出来吗?如果只执行一次 basicInitialization 调用会怎样?
  • 我注意到的一件事是您的 instanceof 检查是在 items[i] 上,但您随后会转换 temp[i]。所以我想知道是否有一个 ClassCastException 后来被吞没和忽略。
  • 它们不会一遍又一遍地打印,我没有遇到任何异常,而且我不确定通话需要很长时间。我还创建了一个空方法并调用了空方法而不是 basicInitialization,它做了同样的事情。我需要把两者都拿出来才能继续,我再次更新了原始帖子中的代码,在那里我摆脱了演员表。

标签: java loops for-loop infinite 2d-games


【解决方案1】:

我想我终于修好了,谢谢大家的帮助!这绝对是一个难以破解的难题!

 public void loadItems(Player p) {

      Item[] temp = SaveGame.loadItems();


      for (int i = 0; i < items.length; i++) {
       this.removeByIndex(i);  // Remove all current items
      }

      if (this.lastItemInList(temp) == -1) { // If the loaded item list has no items
       return;
      }
      for (int j = 0; j < temp.length; j++) {
       items[j] = temp[j];items
      }
      for (int t = 0; t < items.length; t++) { 
       if (items[t] == null) {
        if (t != items.length) {
         for (int i = t; i < items.length; i++) {
          if (items[i] != null) {
          t = i;       //Gets the next time there is an item that isn't null
          break;
          }
         }




        }
       } 

       items[t].basicInitialization();

       if (items[t] instanceof EquipableItem) {
        items[t].basicInitialization(((EquipableItem)items[t]).slot);
       }

       if (t == this.lastItemInList(items)) { //Once it hits the last item, then return
        System.out.println(":::FULLY LOADED ITEMS >> RETURNING:::");
        return;
       }
      }
     }

【讨论】:

    【解决方案2】:

    您应该将代码放在第一个 for 循环中:

    int j = 0;
    if (temp[i] == null) { //If there is no item then continue to the next one
        i+= 1
    }
    else{
        items[j] = temp[i];
        j++;
    }
    

    如果下一项为空,那么它会在没有else 块的情况下被分配。

    【讨论】:

    • 不,它仍然没有完成,现在当数组第 1 项有间隙时,null,第 2 项第 2 项没有被初始化
    • j单独维护item的数组索引。将编辑答案。
    • 你在哪里设置 j = 0;在 for 循环之外?
    • 不幸的是,它仍然没有完成。我还用看起来更好的代码更新了原始帖子,但它仍然没有使用旧版本或“新”版本。
    • 我能得到你的意见吗:如果我得到列表中的最后一项,然后说当前增量是否等于最后一项,然后返回?
    猜你喜欢
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多