【问题标题】:Creating randomly generated objects in a 2D array在二维数组中创建随机生成的对象
【发布时间】:2015-03-26 17:28:40
【问题描述】:

全部。我正在开发一个小游戏,其中创建了一个 2D 数组来容纳游戏“地图”的每个图块。游戏产生了一个玩家和一堆各种各样的物品。单元格如下所示:

private String [][] cells;

...

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

每个字符串都说明每个地方的单元格的样子。例如,有时会生成一堵墙,有时会创建通道(这都是从文件中读取的)。所以问题是这样的:

如何在某些单元格上随机生成对象?例如,如果我总共有 36 个单元格 (6x6),但其中只有 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();
}

【问题讨论】:

  • 我已经阅读了您的描述两次,但我仍然不确定您要做什么,但作为一个附带建议,我可以肯定地说不要这样做:@ 987654323@。不要使用==!= 比较字符串,因为这会比较对象相等,两个对象是否相同,这不是您想要的。您想要功能相等,因此使用equals(...)equalsIgnoreCase(...) 方法。所以改为if (cells[x][y].equals("W")) {
  • 你想生成迷宫吗?每个“通道”都应该可以从任何其他“通道”到达吗?
  • 我同意@HovercraftFullOfEels。此外,您在第二个if 之前缺少一个结束}。你不是说第二个if中的cells[x].length吗?
  • @HovercraftFullOfEels 谢谢,我改变了这个。我对java比较陌生,所以谢谢你的解释。我正在尝试绘制一个迷宫,在迷宫的某些位置,我需要诸如钥匙或宝石之类的“对象”来生成。
  • @DarronMartinez 对不起,但我仍然不知道你想要什么。你想在你的地图上插入一些随机的东西......好吧。那是你的问题吗?或者它是否因为某种限制而验证是否可以将东西放在某个单元格上?或者是别的什么?我很困惑。

标签: java multidimensional-array


【解决方案1】:

您可以创建一个 ArrayList,其中包含有资格在其上放置项目的点,然后使用 [your ArrayList's name].get(Math.random() * [your ArrayList's name].size()) 随机选择它们

【讨论】:

    【解决方案2】:

    所以,在与 OP 的聊天中进行了讨论,这就是问题所在,从问题帖子中看起来有点令人困惑:

    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。所以,我给了他两个建议:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      相关资源
      最近更新 更多