我正在尝试创建一个能够创建各种细胞自动机的程序,例如Conway的生命游戏以及其他所有内容。
图形实现已经完美运行了,所以我不会浪费你的时间(特别是它使用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;
}
}
}
}
问题在于,当计数开始时,每个活细胞在第一轮中立即死亡,有时它们只会消失,即使没有变成死细胞(显然是深红色),几乎每一个都会发生这种情况。 counter == XY“check。
我已经有了一些提示,但我不知道,为什么它不起作用。它有逻辑故障吗?因为我看不出错误,即使它存在。
编辑:
arra[fldwidth][fldheight]
替换为
arra[i][j]
和
arrb[i][j] = arra[i][j];
已添加。现在一切都保持不变。
答案 0 :(得分:0)
为什么要访问arra[fldwidth][fldheight]
进行相等性检查?这是在数组之外,数组中最后一个元素后面的一个元素!您要访问的是arra[i][j]
。
除非arrb
以arra
的副本开头,否则您可能希望在两个相等检查前添加arrb[i][j] = arra[i][j];
。这样,如果一个单元格不符合两个状态变化规则中的任何一个,它将保持其当前状态。
修改强>
你还需要让循环在i-1和i + 1之间运行,所以它应该是:for (a = i-1; a <= i+1; a++)
,对于b来说是相同的!
答案 1 :(得分:0)
我认为你的错误在于:
if (equality(arra[fldwidth][fldheight], TEST_ALIVE) == false && counter == 5)
这应该是:
if (equality(arra[i][j], TEST_ALIVE) == false && counter == 5)
并且类似于该行:
if (equality(arra[fldwidth][fldheight], TEST_ALIVE) == true && counter == 2)