在2D数组中创建随机生成的对象

时间:2015-01-27 23:02:26

标签: java multidimensional-array

所有。我正在开发一个小型游戏,在这个游戏中创建一个2D数组来容纳" map"游戏游戏产生了一个玩家和一堆各种各样的物品。细胞看起来像这样:

private String [][] cells;

...

public void set(int cellX, int cellY, String str)
{
    cells[cellX][cellY] = str;
}

每个String说明每个地方的单元格是什么样的。例如,有时墙会产生,有时会创建通道(这都是从文件中读取的)。所以问题是:

如何在某些细胞上随机生成物体?例如,如果我总共有36个单元格(6x6),但只有23个单元格可以移动#34;在玩家身上,我如何随机生成每个产生相等机会的物品?

到目前为止我的代码就是这个。

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();
}

2 个答案:

答案 0 :(得分:2)

您可以创建一个有资格在其上放置项目的Points的ArrayList,然后使用[your ArrayList's name].get(Math.random() * [your ArrayList's name].size())

随机选择它们

答案 1 :(得分:2)

所以,在与OP聊天时讨论了这个问题,从问题帖子看起来有点混乱:

  1. 可能会在每轮中产生Item,例如KeyGem
  2. 那些Item有一个必须每轮产生的限制数。例如,每轮可能产生5 Gem
  3. 他们必须以相同的概率在段落中产卵。
  4. 所以,要解决这个问题,我的建议是:

    1. 创建ArrayList Cell。存放所有通道的细胞。
    2. 生成0到数组长度的随机数 - 1。
    3. 重复,直到达到所需物品的限制。
    4. 看起来应该是这样的:

      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. ArrayList ItemCell应该绘制的draw。在String方法中,在绘制了所有墙和通道(迷宫中使用ArrayList表示的唯一内容)之后,遍历此{{1}}并将它们绘制在相应的位置。