在某些区域随机生成位置的最有效方法?

时间:2015-01-05 15:57:26

标签: java optimization

我正在制作一场“贪婪的蛇”游戏。我使用二维数组来存储地图的每个位置/网格的值:鸡蛋或蛇体或空。鸡蛋需要在空白处产生。一种解决方案可能是:

while (new egg location overlaps snake body)
     Within the range of 2d array randomly generate an egg location

然而,当蛇变得非常大并且填满地图的大部分区域时,生成新蛋变得非常低效,因为它必须检查2d阵列的几乎每个元素。如何优化?

4 个答案:

答案 0 :(得分:1)

维护所有空方格的列表。每当你需要一个新的随机空方格时使用:

Collections.shuffle(list).get(0);

答案 1 :(得分:1)

首先,我想说你的解决方案没有任何问题。你得到的唯一问题是游戏后期(当大部分方块被蛇占用时)你可能需要多次尝试才能找到一个空的空间。

在这种情况下,OldCurmudgeon的解决方案非常合适。但是,它遇到了不同的问题。从大空网格维护空方块列表是浪费时间。

在比赛初期,您目前的解决方案更可取。但是后期他们的解决方案更好。

所以我建议检查一下蛇的大小。如果蛇占用不到一半的网格,请使用当前的解决方案。只有当蛇占据网格的一半以上时才开始维护一个空方格列表。

答案 2 :(得分:0)

将蛇当前占据的所有空间作为输入,然后从剩余部分进行检查。不会完全达到O(1)但会减少你需要经过多少阵列。

答案 3 :(得分:0)

public Point generateRandomPoint(){
    Random rand = new Random();
    Point p;
    boolean goodPoint = false;
    //while the point selected is not empty
    while (goodPoint!=true){
        p= new Point(rand.nextInt(MAX_X),rand.nextInt(MAX_Y));
        //is the point empty
        goodPoint = array[p.x][p.y].equals("empty");
    }

    return p;
}

如果你使用它,那么它只会检查鸡蛋产生的空间。现在,因为它是随机的,它可能需要检查很多空格,但除非你的电路板是几千个,它应该几乎是即时的(<&lt; <50 ms)。