对于我的家庭作业,我在诸如Conway的《生命游戏》之类的网格上制作捕食者/猎物。看起来不错,但有一点很粗糙。

很多时候,我需要从当前单元格中随机选择一个相邻的单元格并执行一些操作,然后在其他三个单元格之间循环(我只使用边单元格,而不是对角线。网格上的当前单元格可以称为位置x = 0和y = 0)。

如果我总是从(-1,0)这样的地方开始,然后经过(0,1)(+ 1,0)(0,-1),那么执行循环就没有问题。但这不是一个随机的起点。

我可以通过math.random()获得x和y的随机起始单元。

当我不知道提前成为随机起点的单元格时,烦恼我的是一种聪明的方式来定义周期中下一个单元格的x,y。我可以通过用if(x == 1 && y == 0)然后在其他三个单元格中执行三行来通过蛮力来完成。然后if(x == 0 && y = 1)和另外三行。但这是四个可能的起点中的每个起点的三行。似乎很粗糙。

我以为我可以用8个成员的数组描述所有四个单元格的x,y:x top,y top,x right,y right ...)。然后生成一个随机数以选择“起点”并逐步执行。最后,成员循环回到数组的开头,直到读出了四对x,y。

在编写和排除故障之前,有没有更聪明的方法?如果有几个想法,我会尝试为实践编写每个想法。

我还可以使用一些指导来说明如何在搜索中表达这个问题。

非常感谢。

最佳答案

听起来好像您想处理相邻单元格的随机循环排列。您可以使用一级间接索引来做到这一点。例如,您可以通过数组定义相邻单元格的索引

int[] adjacent = {0, 1, 2, 3};


然后,您想从adjacent中的任意位置开始,并按顺序处理这四个元素,如果从末尾开始,则绕到开始。您可以使用模运算符(%)或将数组加倍来处理此问题:

int[] adjacent = {0, 1, 2, 3, 0, 1, 2, 3};
int randomStart = rand.nextInt(4); // rand is an instance of Random
for (int i = 0; i < 4; ++i) {
    processNeighbor(adjacent[randomStart + i]);
}


这将以下列可能性之一处理邻居,这些可能性是随机选择的:


0、1、2、3
1,2,3,0
2,3,0,1
3,0,1,2

10-04 15:14