我正在制作一场“贪婪的蛇”游戏。我使用二维数组来存储地图的每个位置/网格的值:鸡蛋或蛇体或空。鸡蛋需要在空白处产生。一种解决方案可能是:
while (new egg location overlaps snake body)
Within the range of 2d array randomly generate an egg location
然而,当蛇变得非常大并且填满地图的大部分区域时,生成新蛋变得非常低效,因为它必须检查2d阵列的几乎每个元素。如何优化?
答案 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)。