在二维数组中创建随机生成的对象

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:

看来有点混乱
  1. Item,例如KeyGem,每轮都可能产生。
  2. 那些Item有一个限制,必须每轮生成。例如,每轮可能产生 5 Gem
  3. 它们必须以相同的概率出现在通道中。

所以,解决这个问题,我的建议是:

  1. 正在创建一个 ArrayListCell。存储所有通道的细胞。
  2. 生成一个介于 0 和数组长度 - 1 之间的随机数。
  3. 重复直到达到所需项目的限制。

它应该看起来像这样:

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条建议:

  1. 将迷宫的表示更改为表示迷宫中内容的某个对象。例如,CellInfo 可能是 WallPassageItem 等的父级。然而,这需要在实际工作中进行大量更改。例如,他实际上是在从文件中读取迷宫。
  2. 有一个 ArrayListItem 以及相应的 Cell 应该在哪里绘制。在draw方法中,绘制完所有的墙壁和通道(迷宫中唯一用String表示的东西),遍历这个ArrayList并绘制在各自的位置。