兰顿的蚂蚁不断地沿对角线移动
Langton's Ant Constantly Moving Diagonally
我一直在研究模拟兰顿蚂蚁的处理脚本,但是我遇到了一个问题,它只能沿对角线移动。我已经尝试修复它一段时间了,但我无法弄清楚是什么导致了这个问题。我怀疑这可能与 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;
}
请养成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
if DIR_RIGHT
时会发生什么?将 dir
.
的 hard-coded 值放在一起测试这部分的简单草图
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
为 DIR_UP
时,代码实际上也执行所有其他方向。那是因为 case
语句 通过 并继续执行。 case
语句类似于 "start here" 语句。如果想避免执行其余的情况,可以使用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了解未来发生的事情。
我一直在研究模拟兰顿蚂蚁的处理脚本,但是我遇到了一个问题,它只能沿对角线移动。我已经尝试修复它一段时间了,但我无法弄清楚是什么导致了这个问题。我怀疑这可能与 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;
}
请养成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
if 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");
}
您会发现,当 dir
为 DIR_UP
时,代码实际上也执行所有其他方向。那是因为 case
语句 通过 并继续执行。 case
语句类似于 "start here" 语句。如果想避免执行其余的情况,可以使用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了解未来发生的事情。