我正在尝试制作一个能够创建各种细胞自动机的程序,例如康威的生命游戏和其他一切。
图形实现已经完美运行,所以我不会浪费你的时间(尤其是它使用 Allegro 库),但是计算单元格的函数不能正常工作。
这就是我目前所拥有的。(代码是有序的,我只是用评论来打破它,让你明白一切)
预定义:
#define fldwidth 110
#define fldheight 140
图形结构:
typedef struct tiles
{
unsigned char red, green, blue;
}tiles;
两个预定义的结构:一个活的和一个死的测试单元的 RGB 代码。
const tiles TEST_ALIVE = {200,0,0};
const tiles TEST_DEAD = {100,0,0};
检查结构变量和常量结构的颜色相等性的函数。
bool equality(tiles& a, const tiles& b)
{
if (a.red == b.red && a.green == b.green && a.blue == b.blue)
{
return true;
} else {
return false;
}
}
主要功能。它得到两个结构数组(第一个是当前轮次,第二个是发生计数的地方;在轮次循环中,计数后,b数组将被复制到一个数组中);启动时,它对每个结构执行以下步骤:计数,它在其附近有多少活细胞(如果它是活细胞,它从 -1 开始以避免将自己算作邻居,否则它定期从 0 开始),那么如果它本身不是一个活的测试单元(而是其他任何东西)并且有 5 个邻居,它就成为一个活的测试单元;如果它自己是一个活的测试细胞并且有 2 个邻居,它就变成了一个死细胞。
void Test(tiles arra[fldwidth][fldheight], tiles arrb[fldwidth][fldheight])
{
int a,b,i,j,counter;
for (j=1;j<fldheight-1;j++)
{
for (i=1;i<fldwidth-1;i++)
{
if (equality(arra[i][j], TEST_ALIVE) == true)
{
counter = -1;
} else {
counter = 0;
}
for (b=j-1;b<j+1;b++)
{
for (a=i-1;a<i+1;a++)
{
if (equality(arra[a][b], TEST_ALIVE) == true)
{
counter+=1;
}
}
}
arrb[i][j] = arra[i][j];
if (equality(arra[i][j], TEST_ALIVE) == false && counter == 5)
{
arrb[i][j] = TEST_ALIVE;
}
if (equality(arra[i][j], TEST_ALIVE) == true && counter == 2)
{
arrb[i][j] = TEST_DEAD;
}
}
}
}
问题是,当计数开始时,每个活细胞在第一轮立即死亡,有时它们就消失了,即使没有变成死细胞(显然是更深的红色),并且几乎每个“计数器”都会发生这种情况== XY”检查。
我已经得到了一些提示,但我不知道为什么它不起作用。它有逻辑故障吗?因为我看不到错误,即使它在那里。
编辑:
arra[fldwidth][fldheight]
被替换为
arra[i][j]
和
arrb[i][j] = arra[i][j];
被添加。现在一切都保持原样。