计算邻居的数量康威的生命游戏

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