【问题标题】:get a list of values to represent x,y on Cartesian获取在笛卡尔坐标中表示 x,y 的值列表
【发布时间】:2013-06-13 02:59:55
【问题描述】:

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

很多时候,我需要从当前单元格中随机选择一个相邻的单元格并执行一些操作,然后循环通过其他三个单元格(我只使用侧单元格,而不是对角线。网格上的当前单元格我们可以呼叫位置 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 上、y 上、x 右、y 右...)。然后生成一个随机数来选择一个“起点”并遍历。最后成员循环回到数组的开头,直到读出了四对x,y。

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

我还可以使用一些指导来说明如何将这个问题表述为搜索。

非常感谢。

【问题讨论】:

  • 当您说“循环通过其他三个单元格”时,您的意思是顺时针/逆时针旋转吗?或者你的意思是你需要对其他三个单元格执行一些操作,顺序不重要?因为在后一种情况下,您可以循环遍历所有 四个 相邻单元格,但跳过“起始单元格”。
  • 随机选择起始单元格后,对其他单元格的操作可以从起始单元格顺时针进行。

标签: java arrays random


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你可以采用循环链表方法

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

    那你就可以了

    Node startNode = randomStartNode(list);
    Node nextNode = startNode;
    do{
    
        // do something;
    
        nextNode = nextNode.next();   
    }while (startNode != nextNode);
    

    【讨论】:

      【解决方案3】:

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

      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]);
      

      在最后两个 sn-ps 中,randRandom 的一个实例。应该在整个程序中创建和共享一个实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-27
        • 1970-01-01
        • 2018-04-20
        • 1970-01-01
        • 2013-08-19
        • 1970-01-01
        • 1970-01-01
        • 2020-07-04
        相关资源
        最近更新 更多