我无法弄清楚,我的地牢打印不正确(问题和输出在底部)。这将需要一些代码,但这是必须的。

这是地牢的构造函数:

public Dungeon ( )
    {
        Random r = new Random();

        int determinedDungeonSize = r.nextInt(10-5) + 5;
        int weaponRandom = r.nextInt(determinedDungeonSize);

        dungeon = new ArrayList<String>(determinedDungeonSize);

        String cell = ("|____|   ");
        char[] cellArray = cell.toCharArray();

        for(int i=0; i<determinedDungeonSize ;i++)
        {
            int randomProbability = r.nextInt(10000);

            if(randomProbability < 5000)
            {
                cellArray[2] = 'M';
            }

            if(i == weaponRandom)
            {
                if(randomProbability < 5000)
                {
                    cellArray[3] = 'S';
                    cellArray[4] = 'w';
                }
                else
                {
                    cellArray[3] = 'S';
                    cellArray[4] = 't';
                }

            }//end if

            cell = String.valueOf(cellArray);
            dungeon.add(cell);
        }//end for

    }//end Dungeon()


toString for the Dungeon:

public String toString()
{
    String dungeonString = "";

    for(int i = 0; i < dungeon.size(); i++)
    {
        dungeonString += dungeon.get(i);
    }

    return dungeonString;
}


现在是问题所在。我使用以下语句-> System.out.print(d.toString());打印驱动程序类中的地牢,其中d只是使用Dungeon d = new Dungeon()创建的Dungeon对象​​。
控制台正在输出(这是一个坏情况):

|_M__|   |_M__|   |_M__|   |_MSt|   |_MSt|   |_MSt|   |_MSt|


表示为“ M”的怪物出现在一个单元格中的概率为50/50。武器(Stick('St')或Sword('Sw'))存在的概率为每个地牢一个武器(任何给定地牢中只有一种武器,单元必须是随机的)。构造函数应该做的一切都很好,我不知道这里出了什么问题,我已经尝试解决了6个小时。

编辑:预期输出:| M_ | | M_ | | _ | | _St_ | | M | | _ | | M | | ___ |

最佳答案

您的问题是,在for循环结束时,您永远不会刷新cellArray的值成为“新”单元格。您只需要在现有单元格的顶部书写即可。这意味着,如果M出现在第一个单元格中,它将出现在每个单元格中。此外,该武器将在首次出现后出现在每个单元格中。要解决此问题,您每次运行for循环时都需要重新初始化cell。只需将初始化移到循环内部即可:

    for(int i=0; i<determinedDungeonSize ;i++)
    {
        //just move these to the inside of the loop
        //so they are fresh each time
        String cell = ("|____|   ");
        char[] cellArray = cell.toCharArray();

        int randomProbability = r.nextInt(10000);

        if(randomProbability < 5000)
        {
            cellArray[2] = 'M';
        }

        if(i == weaponRandom)
        {
            if(randomProbability < 5000)//this does mean that if the weapon is in the same room as a monster, it will always be Sw. Consider generating a new random value
            {
                cellArray[3] = 'S';
                cellArray[4] = 'w';
            }
            else
            {
                cellArray[3] = 'S';
                cellArray[4] = 't';
            }

        }//end if

        cell = String.valueOf(cellArray);
        dungeon.add(cell);
    }//end for

10-01 05:32