1

对于我的作业,我正在像康威的生命游戏这样的网格上制作捕食者/猎物。它看起来不错,但有一点很粗糙。

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

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

对于 x 和 y,我可以使用 math.random() 获得一个随机起始单元格。

让我烦恼的是当我不知道将是随机开始的单元格时,定义循环中下一个单元格的 x,y 的聪明方法。我可以通过使用 if(x==1 && y==0) 然后三行在其他三个单元格中执行任务来蛮力完成。然后 if(x==0 && y=1) 和另外三行。但这对于四个可能的开始中的每一个都是三行。看起来很粗糙。

我想也许我可以在 8 个成员的数组中描述所有四个单元格的 x,y:x 顶部、y 顶部、x 对、y 对...)。然后生成一个随机数来选择一个“起点”并遍历。最后成员循环回到数组的开头,直到读出了四对x,y。

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

我还可以使用一些指导来说明如何用这个问题来进行搜索。

非常感谢。

4

3 回答 3

0

遍历邻居的常用方法是存储每个方向的偏移量:

int[] dx = { 1, 0, -1, 0 }; // change in x for each direction
int[] dy = { 0, 1, 0, -1 }; // change in y for each direction

一个简单的迭代将是

for (int i = 0; i < dx.length; i++)
    process(x + dx[i], y + dy[i]);

在您的情况下,您可以选择一个随机方向并遍历其余方向:

int special = rand.nextInt(dx.length);
processSpecial(x + dx[special], y + dy[special]);

for (int i = 0; i < dx.length; i++)
    if (i != special)
        process(x + dx[i], y + dy[i]);

或者你可以在一个循环中循环,从随机方向开始:

int special = rand.nextInt(dx.length);
processSpecial(x + dx[special], y + dy[special]);

for (int i = (special + 1) % dx.length; i != special; i = (i + 1) % dx.length)
    process(x + dx[i], y + dy[i]);

在最后两个片段中,randRandom. 应在整个程序中创建和共享单个实例。

于 2013-06-13T03:25:53.687 回答
0

听起来您想处理相邻单元格的随机循环排列。您可以使用一级索引间接执行此操作。例如,您可以通过数组定义相邻单元格的索引

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
于 2013-06-13T03:07:50.773 回答
0

您可以采用循环链表方法

每个节点都有对下一个节点的引用,最后一个节点对第一个节点的引用(因此是循环的;

那么你可以做

Node startNode = randomStartNode(list);
Node nextNode = startNode;
do{

    // do something;

    nextNode = nextNode.next();   
}while (startNode != nextNode);
于 2013-06-13T03:09:22.770 回答