1

コンウェイのライフ ゲームなど、あらゆる種類のセル オートマトンを作成できるプログラムを作成しようとしています。

グラフィックの実装はすでに完全に機能しているので、(特に Allegro ライブラリを使用することで) あなたの時間を無駄にすることはありませんが、セルをカウントする関数は適切に機能しません。

それが私が今持っているものです。(コードは整然としています。すべてを明確にするために、コメントでそれを壊しています)

事前定義:

#define fldwidth 110 
#define fldheight 140

グラフィックスの構造:

typedef struct tiles
{
        unsigned char red, green, blue;
}tiles;

2 つの事前定義された構造: 生きているテスト セルと死んでいるテスト セルの 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;
    }
}

主な機能。構造体の 2 つの配列を取得します (1 つ目は現在のラウンド、2 つ目はカウントが発生する場所です。ラウンド ループでは、カウント後に 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]等価性チェックのためにアクセスするのですか? これは配列の外側にあり、配列の最後の要素の 1 つ後ろにあります! アクセスしたいのは ですarra[i][j]

arrbのコピーとして開始しない限りarra、おそらくarrb[i][j] = arra[i][j];2 つの等値チェックの前に追加することをお勧めします。こうすることで、セルが 2 つの状態変更規則のいずれにも適合しない場合、現在の状態が維持されます。

編集:

また、ループを i-1 と i+1 の間で実行する必要があるため、次のようにする必要があります: for (a = i-1; a <= i+1; a++)、b についても同じです!

于 2013-05-20T09:14:21.790 に答える