【问题标题】:Game of life in C, about neighborsC中的生活游戏,关于邻居
【发布时间】:2013-01-26 11:39:45
【问题描述】:

我有一个尺寸为 N 和 M 的表格,由用户提供。 该表仅填充 0 和 1。所以我得到这样的东西:

0 0 0 1 0
1 1 0 0 0
0 0 0 0 1
0 0 0 0 0
0 1 1 0 0

我的问题是,我如何计算单个 1 周围的 1 数量?

我是这样开始的:

int nb_neighbours_M(int **tab, int i, int j, int n, int m)
{

  int nb_neighbours = 0;`

  for (i = 0; i < n; i++)
  {
    for (j = 0; j < m; j++)
    {

    }
  }
}

【问题讨论】:

    标签: c windows codeblocks


    【解决方案1】:

    最简单的方法是使用两个数组int drow[NUMBER_OF_DIRECTIONS]int dcol[NUMBER_OF_DIRECTIONS],用于存储每个单元格邻居的坐标变化。

    // North, East, South, West
    int drow[NUMBER_OF_DIRECTIONS] = {-1,  0, 1, 0};
    int dcol[NUMBER_OF_DIRECTIONS] = {0, 1, 0, -1};
    
    int row, col; // the coordinates of the cell you want to check the neighbours of
    int num_neighbours = 0;
    
    for (int i = 0; i < NUMBER_OF_DIRECTIONS; i++) {
            if (tab[row + drow[i]][col + dcol[i]] == 1) {
                num_neighbours++;
            }
    }
    

    在上面的示例中,我只处理 4 个方向,但您可以轻松地调整这个 sn-p 以处理 8 个方向,而无需修改任何实际代码(这是一个好东西™)。 p>

    您可能还应该为此添加边界检查,因为它不会做任何事情。

    【讨论】:

    • 如果我做对了,方向的数量就是我桌子的大小?
    • 这不可能,您要检查 16 个位置。我认为您只想为该设计做 1 个“为”
    • @AlexiBoulon:没有。NUMBER_OF_DIRECTIONS 基本上是一个细胞有多少邻居(不管他们的内容)。例如,您可以选择一个像元的邻居只是直接位于其北、南、东或西的那些像元,但您也可能同样选择考虑东北等像元。
    • @dranov:哦,好的。是的,我还想计算位于东北部、西北部的那些......
    • @AlexiBoulon:然后您可以将这些位置的更改添加到drow[]dcol[] 数组,并确保正确调整#defineNUMBER_OF_DIRECTIONS。例如,north-east 是在行中更改-1,在列中更改+1
    【解决方案2】:

    通过展开循环,您可以获得类似的东西。

    int count_neighbours (int **a, int x, int y, int w, int h)
    {
      int res = 0;
    
      int left   = x <= 0;
      int right  = x >= w - 1;
      int top    = y <= 0;
      int bottom = y >= h - 1; 
    
      if (!left && !top)     res += a[x-1][y-1];
      if (!right && !bottom) res += a[x+1][y+1];
      if (!left && !bottom)  res += a[x-1][y+1];
      if (!right && !top)    res += a[x+1][y-1];
      if (!left)             res += a[x-1][y];
      if (!right)            res += a[x+1][y];
      if (!top)              res += a[x][y-1];
      if (!bottom)           res += a[x][y+1];
    
      return res;
    }
    

    【讨论】:

    • 所以这适用于 4 个单元格:右上角和左下角。但我还需要计算对角线位置的单元格
    • 这实际上适用于所有 8 个位置,并且您还可以检查出界(这可能是您在 GoL 游戏中想要的)
    • 我明白了!谢谢!我猜 res 是邻居的数量?
    • 是的,res是返回的邻居数
    • 当我使用它时,我的游戏崩溃了:/ 我可以用 int nb_voisins_M(int **tab, int i 替换 (int **a, int x, int y, int w, int h) , int j, int n, int m) 如果我改变代码中的值对吗?
    猜你喜欢
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多