【发布时间】:2017-08-26 00:20:30
【问题描述】:
我正在完成康威的生命游戏任务。我创建了一个函数来生成 1 和 0 的随机数组; 1 代表一个活细胞,而 0 代表一个空白空间。
我创建了一个单独的函数来检查附近区域并进行计数以确定游戏的进展情况。
规则:如果一个单元格有 2 或 3 个邻居,它会存活,超过 3 个或少于 2 个它会死亡,如果一个空白空间有 3 个邻居,它就会“出生”。我的“星球”是 79 x 24 个字符,但在我包裹屏幕之前它还不是真正的星球。
这里是函数:
void life (int master[24][79]) //generates/kills cells based on neighborhood
{
int temp[24][79]; //temporary array for manipulating data
copy (master, temp); //copy array onto temp
for(int j = 0; j < h; j++) //height loop
{
for (int i = 0; i < w; i++) //width loop
{
int count = 0; //intialize neighbor count variable
count = master[j-1][i] + //searches down
master[j-1][i-1] + //down left
master[j][i-1] + //left
master[j+1][i-1] + //up left
master[j+1][i] + //up
master[j+1][i+1] + //up right
master[j][i+1] + //right
master[j-1][i+1]; //down right
//cell dies if count falls below 2 or rises above 3
if(count < 2 || count > 3)
temp[j][i] = 0;
//cell stays alive if it has two neighbors
if(count == 2)
temp[j][i] = master[j][i];
//cell either stays alive or gets born if three neighbors
if(count == 3)
temp[j][i] = 1;
} //end width loop
}//end height loop
copy(temp, master); //copy temp back to main array
} //end life function
我确定我应该使用模数,但我尝试的任何方法似乎都不起作用。我曾尝试使用 while 循环将最大值恢复为零,但我可以看出它具有逐渐向下缠绕的效果,类似于螺纹缠绕螺钉的方式。我应该修改(抱歉)搜索部分代码看起来像这样吗?
int count = 0; //intialize neighbor count variable
count = master[(j-1)%h][i%w] + //searches down
master[(j-1)%h][(i-1)%w] + //down left
master[j%h][(i-1)%w] + //left
master[(j+1)%h][(i-1)%w] + //up left
master[(j+1)%h][i%w] + //up
master[(j+1)%h][(i+1)%w] + //up right
master[j%h][(i+1)%w] + //right
master[(j-1)%h][(i+1)%w]; //down right
【问题讨论】:
-
[OT]:我建议使用
std::array而不是 C-array 以获得正确的更安全的语法。 (因为void life (int master[24][79])实际上是void life (int (*master)[79]))。 -
大声阅读这些论坛,我知道有人会参与其中! :D 我的教授不是程序员(电气工程师),显然不喜欢教这门课,并且对不使用命名空间标准的任何人都怀有强烈的仇恨。我遇到了很多问题,我只需要解决他的迟钝问题。
-
创建一个
struct worldMap { int cells[24][79]; };将是一个简单的步骤。 (添加访问器将是一个很好的补充)。