在二维数组中创建随机生成的对象
Creating randomly generated objects in a 2D array
全部。我正在开发一个小游戏,其中创建了一个二维数组来容纳游戏 "map" 的每个图块。游戏产生了一个玩家和一堆各种各样的物品。单元格如下所示:
private String [][] cells;
...
public void set(int cellX, int cellY, String str)
{
cells[cellX][cellY] = str;
}
每个字符串说明每个地方的单元格是什么样子的。例如,有时会生成一堵墙,有时会创建通道(这些都是从文件中读入的)。所以问题是:
如何在某些单元格上随机生成对象?例如,如果我总共有 36 个单元格 (6x6),但玩家只能 "moved" 打开其中的 23 个单元格,我怎样才能随机生成在每个单元格上生成机会均等的物品?
到目前为止我的代码是这样的。
public void draw()
{
for (int x = 0; x < cells.length; x++)
{
for (int y = 0; y < cells[w].length; y++)
{
if(cells[x][y] == "W"){
Cell wall = new Cell(config.wallImage());
wall.draw(config, x, y);
if(cells[x][y] == "P"){
Cell passage = new CellPassage(config.passageImage());
// This is where I need to check to see if the item is okay
// to be placed. If it is unable, nothing will be added to
// the Cell passage.
//passage.attemptToAdd(item);
passage.draw(config, x, y);
}
}
}
hero.draw();
}
您可以创建一个有资格在其上放置项目的点的 ArrayList,然后使用 [your ArrayList's name].get(Math.random() * [your ArrayList's name].size())
随机 select 它们
所以,在与 OP 的聊天中进行了讨论,这就是问题所在,从问题 post:
看来有点混乱
- 有
Item
,例如Key
和Gem
,每轮都可能产生。
- 那些
Item
有一个限制,必须每轮生成。例如,每轮可能产生 5 Gem
。
- 它们必须以相同的概率出现在通道中。
所以,解决这个问题,我的建议是:
- 正在创建一个
ArrayList
的 Cell
。存储所有通道的细胞。
- 生成一个介于 0 和数组长度 - 1 之间的随机数。
- 重复直到达到所需项目的限制。
它应该看起来像这样:
public void addItem(Item item, int limit)
{
ArrayList<Cell> passages = new ArrayList<Cell>();
for(int x = 0; x < cells.length; x++)
{
for (int y = 0; y < cells[w].length; y++)
{
if (cells[x][y] == "P") //if it's a passage
passages.add(new Cell(x,y));
}
}
Random rand = new Random();
while(spawnedItems < limit){
if(passages.size() == 0)
throw LimitImpossibleError();
int randomNum = rand.nextInt(passages.size());
items.add(new ItemPosition(item, passages.get(randomNum))); //assuming that you have a global ArrayList of Item and respective Cell (ItemPosition) to draw them later
}
}
OP讨论的另一个问题是Item
后面怎么画。所以,我给了他2条建议:
- 将迷宫的表示更改为表示迷宫中内容的某个对象。例如,
CellInfo
可能是 Wall
、Passage
、Item
等的父级。然而,这需要在实际工作中进行大量更改。例如,他实际上是在从文件中读取迷宫。
- 有一个
ArrayList
和 Item
以及相应的 Cell
应该在哪里绘制。在draw
方法中,绘制完所有的墙壁和通道(迷宫中唯一用String
表示的东西),遍历这个ArrayList
并绘制在各自的位置。
全部。我正在开发一个小游戏,其中创建了一个二维数组来容纳游戏 "map" 的每个图块。游戏产生了一个玩家和一堆各种各样的物品。单元格如下所示:
private String [][] cells;
...
public void set(int cellX, int cellY, String str)
{
cells[cellX][cellY] = str;
}
每个字符串说明每个地方的单元格是什么样子的。例如,有时会生成一堵墙,有时会创建通道(这些都是从文件中读入的)。所以问题是:
如何在某些单元格上随机生成对象?例如,如果我总共有 36 个单元格 (6x6),但玩家只能 "moved" 打开其中的 23 个单元格,我怎样才能随机生成在每个单元格上生成机会均等的物品?
到目前为止我的代码是这样的。
public void draw()
{
for (int x = 0; x < cells.length; x++)
{
for (int y = 0; y < cells[w].length; y++)
{
if(cells[x][y] == "W"){
Cell wall = new Cell(config.wallImage());
wall.draw(config, x, y);
if(cells[x][y] == "P"){
Cell passage = new CellPassage(config.passageImage());
// This is where I need to check to see if the item is okay
// to be placed. If it is unable, nothing will be added to
// the Cell passage.
//passage.attemptToAdd(item);
passage.draw(config, x, y);
}
}
}
hero.draw();
}
您可以创建一个有资格在其上放置项目的点的 ArrayList,然后使用 [your ArrayList's name].get(Math.random() * [your ArrayList's name].size())
所以,在与 OP 的聊天中进行了讨论,这就是问题所在,从问题 post:
看来有点混乱- 有
Item
,例如Key
和Gem
,每轮都可能产生。 - 那些
Item
有一个限制,必须每轮生成。例如,每轮可能产生 5Gem
。 - 它们必须以相同的概率出现在通道中。
所以,解决这个问题,我的建议是:
- 正在创建一个
ArrayList
的Cell
。存储所有通道的细胞。 - 生成一个介于 0 和数组长度 - 1 之间的随机数。
- 重复直到达到所需项目的限制。
它应该看起来像这样:
public void addItem(Item item, int limit)
{
ArrayList<Cell> passages = new ArrayList<Cell>();
for(int x = 0; x < cells.length; x++)
{
for (int y = 0; y < cells[w].length; y++)
{
if (cells[x][y] == "P") //if it's a passage
passages.add(new Cell(x,y));
}
}
Random rand = new Random();
while(spawnedItems < limit){
if(passages.size() == 0)
throw LimitImpossibleError();
int randomNum = rand.nextInt(passages.size());
items.add(new ItemPosition(item, passages.get(randomNum))); //assuming that you have a global ArrayList of Item and respective Cell (ItemPosition) to draw them later
}
}
OP讨论的另一个问题是Item
后面怎么画。所以,我给了他2条建议:
- 将迷宫的表示更改为表示迷宫中内容的某个对象。例如,
CellInfo
可能是Wall
、Passage
、Item
等的父级。然而,这需要在实际工作中进行大量更改。例如,他实际上是在从文件中读取迷宫。 - 有一个
ArrayList
和Item
以及相应的Cell
应该在哪里绘制。在draw
方法中,绘制完所有的墙壁和通道(迷宫中唯一用String
表示的东西),遍历这个ArrayList
并绘制在各自的位置。