Вызываемая функция очищает изменения предыдущего

Я работаю над сотовым автоматом, где изменения происходят в каждом раунде. Очевидно, я сделал для этого цикл - в основном это работает, к счастью, но если я хочу добавить другой тип клеток на карту, один тип клеток работает, но другой ничего не делает: игра начинается и, например, в В этом примере автомат Конвея начинает расти, но красные тест-клетки остаются без изменений.

#define fldwidth 110 
#define fldheight 140

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

const tiles TEST_ALIVE = {255,0,0};
const tiles TEST_DEAD = {50,0,0};
const tiles CONWAY_ALIVE = {0,255,0};
const tiles CONWAY_DEAD = {0,50,0};

//Maes módszere a struktúrák egyenlőségének vizsgálatára
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;
    }
}



//sejttípus 1.: tesztsejt: minden magányos vagy túlbuzgó sejt meghal
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];
            //itt a sejtek szabályai jönnek; mindig a születést tesszük előre, utána a halált!
            if (equality(&arra[i][j], &TEST_ALIVE) == false && counter >= 2)
            {
                arrb[i][j] = TEST_ALIVE;
            }

            if (equality(&arra[i][j], &TEST_ALIVE) == true && (counter == 0 || counter > 6))
            {
                arrb[i][j] = TEST_DEAD;
            }
        }
    }

}

//sejttípus 2.: Conway életjátéka
void Conway(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], &CONWAY_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], &CONWAY_ALIVE) == true)
                    {
                        counter+=1;
                    }
                }
            }
            arrb[i][j] = arra[i][j];
            //itt a sejtek szabályai jönnek; mindig a születést tesszük előre, utána a halált!
            if (equality(&arra[i][j], &CONWAY_ALIVE) == false && counter == 3)
            {
                arrb[i][j] = CONWAY_ALIVE;
            }

            if (equality(&arra[i][j], &CONWAY_ALIVE) == true && (counter != 2 && counter != 3))
            {
                arrb[i][j] = CONWAY_DEAD;
            }
        }
    }
}

Это содержимое цикла:

Test(fielda,fieldb);
Conway(fielda,fieldb);
end = false;
round++;
for (j = 0; j < fldheight; j++)
    {
        for (i = 0; i < fldwidth; i++)
        {
            fielda[i][j] = fieldb[i][j];
        }
    }

Как я уже упоминал, в этом примере клетки Конвея растут, а тестовые клетки просто остаются. Как заставить их работать одновременно?

(Я использую библиотеки Allegro, так что если у вас есть что-то для этой проблемы, не стесняйтесь поделиться со мной!)

1 ответ

Решение

Test(fielda,fieldb); устанавливает каждую ячейку fieldb на основе текущего значения fielda. А потом Conway(fielda,fieldb); устанавливает каждую ячейку fieldb на основе текущего значения fielda, перезаписывая fieldb так, чтобы все Test сделал, ушел. Один из способов исправить это - изменить ваш цикл на:

Test(fielda,fieldb);
Conway(fieldb,fielda);  //switched the parameters
end = false;
round++;
//there is no need to copy fieldb to fielda here because Conway already did

Но это может быть неправильным решением, в зависимости от того, как именно вы хотите, чтобы тест и конвей взаимодействовали друг с другом.

Другие вопросы по тегам