代码之家  ›  专栏  ›  技术社区  ›  joeyvanlierop

兰顿的蚂蚁一直在对角移动

  •  1
  • joeyvanlierop  · 技术社区  · 7 年前

    我一直在编写一个处理脚本来模拟Langton的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;
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Kevin Workman    7 年前

    请养成 debugging your code .

    特别是 switch 声明:

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

    dir DIR_UP ? 当 目录 如果 DIR_RIGHT ? 制作一个简单的草图,使用硬编码值测试该零件 目录

    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");
    }
    

    你会发现 目录 DIR\U向上 ,代码实际上也执行所有其他方向。那是因为 case 声明 落空 并继续执行。A. 语句类似于“从这里开始”语句。如果要避免执行其余案例,可以使用 break 要突破的关键字 转换 声明:

    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 准确了解未来的情况。