1

我正在尝试制作一个能够创建各种细胞自动机的程序,例如康威的生命游戏和其他一切。

图形实现已经完美运行,所以我不会浪费你的时间(尤其是它使用 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];

被添加。现在一切都保持原样。

4

2 回答 2

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!

于 2013-05-20T09:14:21.790 回答
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)
于 2013-05-20T09:16:13.540 回答