计算邻居的数量康威的生命游戏
Counting number of neighbors Conway's Game of Life
我在这段代码中的某处有错误。
根据我的理解,邻居的数量没有被正确计算。邻居功能可能是问题所在。我的字段变量是一个 12x12 字符数组,“#”是一个活细胞,“-”是一个死细胞。
我对编程比较陌生,希望能得到一些帮助。
int neighbors(int l, int c)
{
int num = 0;
for (int i = -1; i < 2; i++)
{
for (int j = -1; j < 2; j++)
{
if ((l+i < 0 || l+i > 12) && (c+j < 0 || c+j > 12))
{
continue;
}
else if ((i != 0 || j != 0) && field[(l + i)][(c + j)] == '#')
{
num++;
}
}
}
return num;
}
//game logic
void logic()
{
char temp[12][12];
for (int i = 0; i < 12; i++)
{
for (int j = 0; j < 12; j++)
{
temp[i][j] = field[i][j];
}
}
for (int i = 0; i < 12; i++)
{
for (int j = 0; j < 12; j++)
{
if (field[i][j] == '#')
{
if (neighbors(i, j) < 1 || neighbors(i, j) > 3)
{
temp[i][j] = '-';
}
else
{
temp[i][j] = '#';
}
}
if (field[i][j] = '-')
{
if (neighbors(i, j) == 3)
{
temp[i][j] = '#';
}
else
{
temp[i][j] = '-';
}
}
field[i][j] = temp[i][j];
}
}
}
如果数组的维度为 12x12,则最大索引值为 11,因此测试 if ((l+i < 0 || l+i > 12) && (c+j < 0 || c+j > 12))
不正确。应该是:
if (l+i < 0 || l+i >= 12 || c+j < 0 || c+j >= 12)
continue;
另一个主要问题是您在更新循环中更新 field[i][j] = temp[i][j];
:这会破坏相邻单元格的邻居的计算。您应该首先计算整个 temp
数组并在后续循环中更新 field
,或者通过一次调用 memcpy()
.
此外,Conway's Game of Life 的标准规则与您的实现有些不同:if (neighbors(i, j) < 1 || neighbors(i, j) > 3)
使具有单个邻居的单元保持存活,而在标准规则下它应该死亡。将此测试更改为:
if (neighbors(i, j) < 2 || neighbors(i, j) > 3)
temp[i][j] = '-';
这是一个简化版本:
int neighbors(int l, int c) {
int num = 0;
for (int i = -1; i < 2; i++) {
for (int j = -1; j < 2; j++) {
if (l+i >= 0 && l+i < 12 && c+j >= 0 && c+j < 12
&& (i != 0 || j != 0) && field[l+i][c+j] == '#') {
num++;
}
}
}
return num;
}
//game logic
void logic() {
char temp[12][12];
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++) {
temp[i][j] = field[i][j];
}
}
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++) {
int nb = neighbors(i, j);
if (nb < 2 || nb > 3) {
temp[i][j] = '-';
} else
if (nb == 3) {
temp[i][j] = '#';
}
}
}
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++) {
field[i][j] = temp[i][j];
}
}
}
我在这段代码中的某处有错误。 根据我的理解,邻居的数量没有被正确计算。邻居功能可能是问题所在。我的字段变量是一个 12x12 字符数组,“#”是一个活细胞,“-”是一个死细胞。 我对编程比较陌生,希望能得到一些帮助。
int neighbors(int l, int c)
{
int num = 0;
for (int i = -1; i < 2; i++)
{
for (int j = -1; j < 2; j++)
{
if ((l+i < 0 || l+i > 12) && (c+j < 0 || c+j > 12))
{
continue;
}
else if ((i != 0 || j != 0) && field[(l + i)][(c + j)] == '#')
{
num++;
}
}
}
return num;
}
//game logic
void logic()
{
char temp[12][12];
for (int i = 0; i < 12; i++)
{
for (int j = 0; j < 12; j++)
{
temp[i][j] = field[i][j];
}
}
for (int i = 0; i < 12; i++)
{
for (int j = 0; j < 12; j++)
{
if (field[i][j] == '#')
{
if (neighbors(i, j) < 1 || neighbors(i, j) > 3)
{
temp[i][j] = '-';
}
else
{
temp[i][j] = '#';
}
}
if (field[i][j] = '-')
{
if (neighbors(i, j) == 3)
{
temp[i][j] = '#';
}
else
{
temp[i][j] = '-';
}
}
field[i][j] = temp[i][j];
}
}
}
如果数组的维度为 12x12,则最大索引值为 11,因此测试 if ((l+i < 0 || l+i > 12) && (c+j < 0 || c+j > 12))
不正确。应该是:
if (l+i < 0 || l+i >= 12 || c+j < 0 || c+j >= 12)
continue;
另一个主要问题是您在更新循环中更新 field[i][j] = temp[i][j];
:这会破坏相邻单元格的邻居的计算。您应该首先计算整个 temp
数组并在后续循环中更新 field
,或者通过一次调用 memcpy()
.
此外,Conway's Game of Life 的标准规则与您的实现有些不同:if (neighbors(i, j) < 1 || neighbors(i, j) > 3)
使具有单个邻居的单元保持存活,而在标准规则下它应该死亡。将此测试更改为:
if (neighbors(i, j) < 2 || neighbors(i, j) > 3)
temp[i][j] = '-';
这是一个简化版本:
int neighbors(int l, int c) {
int num = 0;
for (int i = -1; i < 2; i++) {
for (int j = -1; j < 2; j++) {
if (l+i >= 0 && l+i < 12 && c+j >= 0 && c+j < 12
&& (i != 0 || j != 0) && field[l+i][c+j] == '#') {
num++;
}
}
}
return num;
}
//game logic
void logic() {
char temp[12][12];
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++) {
temp[i][j] = field[i][j];
}
}
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++) {
int nb = neighbors(i, j);
if (nb < 2 || nb > 3) {
temp[i][j] = '-';
} else
if (nb == 3) {
temp[i][j] = '#';
}
}
}
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++) {
field[i][j] = temp[i][j];
}
}
}