【问题标题】:Langton's Ant Constantly Moving Diagonally兰顿的蚂蚁不断沿对角线移动
【发布时间】:2018-02-19 21:40:52
【问题描述】:

我一直在编写一个模拟 Langton's Ant 的处理脚本,但是我遇到了一个问题,它只会沿对角线移动。我一直在尝试修复它一段时间,但我无法弄清楚是什么导致了这个问题。我怀疑这可能与 turn() 函数有关。

代码如下:

int[][] grid;
int row;
int col;
int dir = 0;
final int DIR_UP = 0;
final int DIR_RIGHT = 1;
final int DIR_DOWN = 2;
final int DIR_LEFT = 3;

void setup()
{
  size(500, 500);
  background(255);

  grid = new int[width][height];
  col = width / 2;
  row = height / 2;
}

void draw()
{
  go();
}

void go()
{
  int pix = col + row * width;
  int state = grid[row][col];

  loadPixels();

  if(state == 0)
  {
    turn(1);
    grid[row][col] = 1;

    pixels[pix] = color(255);
  }
  else
  {
    turn(-1);
    grid[row][col] = 0;

    pixels[pix] = color(0);
  }

  updatePixels();

  move();
}

void turn(int rotation)
{
  dir += rotation;

  if(dir < 0)
  {
    dir = 3;
  }
  else if(dir > 3)
  {
    dir = 0;
  }

  // Does not work, can return negative values
  //dir = (dir + rotation) % 4;
}

void move()
{  
  switch(dir)
  {
    case DIR_UP:
      row--;
    case DIR_RIGHT:
      col++;
    case DIR_LEFT:
      col--;
    case DIR_DOWN:
      row++;    
  }

  if(col < 0)
    col = width - 1;
  else if(col >= width)
    col = 0;

  if(row < 0)
    row = height - 1;
  else if(row >= height)
    row = 0;
}

【问题讨论】:

  • 请不要将解决方案添加到您的问题中。如果您找到了最适合您的解决方案,那么您可以在下面接受它或回答您自己的问题。本网站鼓励其他用户提供多种解决方案,因为最适合您的解决方案可能不适用于其他用户。您的问题已回滚到之前的状态。欲了解更多信息,请访问help center

标签: java grid processing cell simulation


【解决方案1】:

请养成debugging your code的习惯。

特别是,单步执行您的 switch 声明:

  switch(dir)
  {
    case DIR_UP:
      row--;
    case DIR_RIGHT:
      col++;
    case DIR_LEFT:
      col--;
    case DIR_DOWN:
      row++;    
  }

dirDIR_UP 时会发生什么?当dir 如果DIR_RIGHT 会发生什么?用dir 的硬编码值拼凑出一个简单的草图来测试这部分。

final int DIR_UP = 0;
final int DIR_RIGHT = 1;
final int DIR_DOWN = 2;
final int DIR_LEFT = 3;
int dir = DIR_UP;
switch(dir)
{
  case DIR_UP:
    println("up");
  case DIR_RIGHT:
    println("right");
  case DIR_LEFT:
    println("left");
  case DIR_DOWN:
    println("down");
}

您会发现,当dirDIR_UP 时,代码实际上也执行了所有其他方向。那是因为case 语句通过 并继续执行。 case 语句类似于“从这里开始”语句。如果你想避免执行其余的情况,你可以使用break 关键字来跳出switch 语句:

final int DIR_UP = 0;
final int DIR_RIGHT = 1;
final int DIR_DOWN = 2;
final int DIR_LEFT = 3;
int dir = DIR_UP;
switch(dir)
{
case DIR_UP:
  println("up");
  break;
case DIR_RIGHT:
  println("right");
  break;
case DIR_LEFT:
  println("left");
  break;
case DIR_DOWN:
  println("down");
  break;
}

请养成在这样的小型孤立示例程序中工作的习惯,并请debug your code 了解将来会发生什么。

【讨论】:

  • 我很抱歉;我绝对应该尝试隔离那部分代码。那是罪魁祸首,现在已经解决了。感谢您的帮助!
猜你喜欢
  • 2023-03-27
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 2023-03-22
相关资源
最近更新 更多