我无法弄清楚,我的地牢打印不正确(问题和输出在底部)。这将需要一些代码,但这是必须的。
这是地牢的构造函数:
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