java - 由于 null/ map 生成器生成 null 导致游戏内更新循环错误

标签 java maps generator updates text-based

感谢您花时间阅读我的问题。我目前在开发一个基于文本的小型冒险游戏时遇到了麻烦。现在,当我更新 map 时,我收到此错误消息:

    Exception in thread "main" java.lang.NullPointerException
at main.GameManager.update(GameManager.java:92)
at main.GameManager.run(GameManager.java:78)
at main.Main.main(Main.java:8)

我有一个关于为什么会发生这种情况的理论,因为我花了几个小时试图自己弄清楚这一点。我的理论是, map 生成器正在创建一个具有空值的正方形,这导致更新方法遇到错误。我注意到的另一件事是,错误消息每次都会出现在随机对象上。有时,实体返回错误消息,而其他时候则武器返回错误消息。更新方法的代码如下:

注意:我在错误消息返回错误的代码行上放置了两个星号

    //method executed every loop until end
private void update(Object[][] gameMap, GUIController guiController){
    player.update(gameMap, guiController);

    //updates every object on the map besides player
    for(int row = 0; row<mapManager.getWIDTH(); row++){
        for(int col = 0; col<mapManager.getHEIGHT(); col++){

            //if the square has something inside of it
            if(!(gameMap[row][col] instanceof EmptySquare)){
                **gameMap[row][col].update(gameMap, guiController);
            }

        }
    }

    //check
    guiController.displayMessage("updated");
}

map 生成代码如下:

    for(int row = 0; row < WIDTH; row++){
        for(int col = 0; col < HEIGHT; col++){
            Random r = new Random();
            //NOTE: +1 included to get number 1-6 instead of 0-6 or 0-5
            int rand = r.nextInt(6) + 1;
            int rand2 = r.nextInt(2) + 1;
            System.out.println(rand);
            System.out.println(rand2);
            if(rand <= 2){
                //an empty tile
                gameMap[row][col] = new EmptySquare("Empty Square", 0);
                gameMap[row][col].setLocation(row, col);
            }else if(rand == 3 || rand == 4){
                //monster tile
                //decides what monster to put in the tile base on level
                if(row <= 2 && col <= 2){
                    switch(rand2){
                        case 1: gameMap[row][col] = new Entity("Snake", 1, row, col, 5, Weapon.weaponList[0]);
                        break;
                        case 2: gameMap[row][col] = new Entity("Flesh Eating Caterpillar", 1, row, col, 7, Weapon.weaponList[0]);
                        break;
                    }
                }else if((row > 2 && col > 2) && (row <= 5 && col <=5)){
                    switch(rand2){
                        case 1: gameMap[row][col] = new Entity("Spider", 2, row, col, 12, Weapon.weaponList[1]);
                        break;
                        case 2: gameMap[row][col] = new Entity("Zombie", 2, row, col, 20, Weapon.weaponList[1]);
                        break;
                    }
                }else if((row > 5 && col > 5) && (row <= 8 && col <= 8)){
                    switch(rand2){
                        case 1: gameMap[row][col] = new Entity("Giant", 3, row, col, 30, Weapon.weaponList[2]);
                        break;
                        case 2: gameMap[row][col] = new Entity("Fire Drake", 3, row, col, 40, Weapon.weaponList[3]);
                        break;
                    }
                }
            }else if(rand >= 5){
                //weapon tile
                //decides which monster to put int he tile based on level
                if(row <= 2 && col <= 2){
                    switch(rand2){
                        case 1: gameMap[row][col] = new Weapon("Wood Sword", 1, row, col, Material.WOOD);
                        break;
                        case 2: gameMap[row][col] = new Weapon("Bronze Sword", 1, row, col, Material.BRONZE);
                        break;
                    }
                }else if((row > 2 && col > 2) && (row <= 5 && col <=5)){
                    switch(rand2){
                        case 1: gameMap[row][col] = new Weapon("Steel Sword", 2, row, col,  Material.STEEL);
                        break;
                        case 2: gameMap[row][col] = new Weapon("Refined Steel Sword", 2, row, col, Material.REFINEDSTEEL);
                        break;
                    }
                }else if((row > 5 && col > 5) && (row <= 8 && col <= 8)){
                    switch(rand2){
                        case 1: gameMap[row][col] = new Weapon("Gold Sword", 3, row, col, Material.GOLD);
                        break;
                        case 2: gameMap[row][col] = new Weapon("Emerald Sword", 3, row, col, Material.EMERALD);
                        break;
                    }
                }
            } 

        }
    }

感谢任何帮助,因为我已经为此工作了几个小时但没有成功。如果您需要更多代码,对代码有任何疑问,或者有任何与此相关的问题,请询问。我的首要目标是找出这个错误,了解问题出在哪里,并了解可以采取哪些措施来防止它再次发生。

谢谢

最佳答案

我假设 gameMap 最初都是 null 值。您正在尝试根据 2 个随机值将不同类型的方 block 分配给游戏 map 中的每个位置。

但是,在 row、col、rand、rand2 的某些组合中,未分配任何值。

例如,如果 row == 0、col == 5、rand == 3 且 rand2 == 1,则

(rand == 3 || rand == 4) is true
(row <= 2 && col <= 2) is false
(row > 2 && col > 2) && (row <=5 && col <= 5) is false
(row > 5 && col > 5) && (row <=8 && col <= 8) is false

由于此组合没有分配正方形类型的条件,因此 gameMap[0][5] 将为 null。

作为示例,将以下内容添加到内部循环的末尾:

if (gameMap[row][col] == null) {
  // Debug statement showing which row, col pairs weren't assigned
  System.out.println("(" + row + ", " + col + ") was not assigned!");
  gameMap[row][col] = new EmptySquare("Empty Square", 0);
  gameMap[row][col].setLocation(row, col);
}

关于java - 由于 null/ map 生成器生成 null 导致游戏内更新循环错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25298642/

相关文章:

java - Spring 依赖注入(inject)到匿名实现中

JavaFX 将值传递给 View 实例,而不使用静态 setter

java - 为什么需要 ==0,当我删除它时出现错误 "The operator && is undefined for the argument type(s) int, boolean"

mapping - 查找某个位置的城市和邮政编码

java - 如何替换 HashMap 中的重复元素

javascript - NBA 选秀乐透在单击按钮后显示数组项目后将其删除

python - 如何理解Python中all()函数中的取模?

java - 无法使用 SLF4J 禁用 quartz 调度程序日志记录

jquery - MarkerClusterer 只能在 webkit(Chrome 和 Safari)中工作,在 Firefox 中工作正常吗?

Python - 为什么我不能在 print 函数中使用生成器?