【问题标题】:Called function clears changes of previous one调用函数清除前一个的更改
【发布时间】:2013-05-20 12:08:26
【问题描述】:

我正在研究每轮都会发生变化的元胞自动机。显然,我为它做了一个循环——基本上它可以工作,幸运的是,但如果我想在地图上添加另一种类型的单元格,整个事情就行不通了!我的意思是,一种类型的细胞可以工作,但另一种不做任何事情:游戏开始,例如在这个例子中,康威自动机开始增长,但红色的测试单元只是保持不变。

这是两个函数(带有预定义的东西):

#define fldwidth 110 
#define fldheight 140

//struktúra, aztán a sejtek definíciója

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;
            }
        }
    }
}

这就是循环本身:

while(!end)
{
al_wait_for_event_timed(event_queue,&asd,0.001); //várakozás

if(asd.type == ALLEGRO_EVENT_KEY_DOWN)
{
    if(asd.keyboard.keycode == ALLEGRO_KEY_ENTER)
    {
    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];
            }
        }
    }
}

for (j = 0; j < fldheight; j++)
{
    for (i = 0; i < fldwidth; i++)
    {
        al_draw_filled_rectangle(20 + (4*i), 20 + (4*j), 24 + (4*i), 24 + (4*j), al_map_rgb(fielda[i][j].red, fielda[i][j].green, fielda[i][j].blue));
    }
}

}

你能告诉我它有什么问题吗?或者问题不在循环中?

【问题讨论】:

  • 请澄清'整个事情都不起作用'是什么意思。
  • 如何它不起作用?它会崩溃吗?编译错误?您是否尝试过在调试器中单步执行代码?
  • 程序中没有调试错误。游戏开始,例如在这个例子中,康威自动机开始增长,但红色的测试单元只是保持不变。
  • 在我看来,Test 和 Conway 这两个函数都做同样的事情,所以只有最后一个保持可见。我建议你调换电话,而不是拨打Test(fielda,fieldb); Conway(fielda,fieldb);,而是拨打Conway(fielda,fieldb); Test(fielda,fieldb);,看看会发生什么
  • 在这种情况下,红色的工作。当然,两者几乎(几乎)相同,因为它们都是元胞自动机。如果我希望他们同时工作怎么办?

标签: c++ function call allegro cellular-automata


【解决方案1】:

您的问题是您调用的第二个函数反转了第一个函数所做的所有更改。这就是为什么你只看到一个工作。

让两者都工作的最佳方法是让每个函数只在一个颜色通道上运行。 Test使用红色通道(用于读取和更改),而Conway使用绿色通道。准备好看到不同颜色的细胞:这两种功能都会影响这些细胞。

【讨论】:

  • 但是后来,当我想用​​更多的颜色(比如橙色、紫色或任何颜色的单元格时,我将无法做到,没有反向。还是我错了?
  • 不,但请考虑一下:根据Test,您将如何表示一个细胞,但根据Conway,您将如何表示已死亡?该信息现在直接编码在颜色通道中,其中只有三个。如果您想使用其他颜色或非原色,则必须将生/死信息与用于表示它们的颜色分离。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 2022-01-12
  • 2012-10-15
  • 1970-01-01
相关资源
最近更新 更多