约翰·康威';s人生游戏-C语言的基本实现

约翰·康威';s人生游戏-C语言的基本实现,c,arrays,algorithm,C,Arrays,Algorithm,约翰·康威的人生游戏——一套规则 任何少于两个活邻居的活细胞都会死亡,就好像是由于人口不足 任何一个有三个以上邻居的活细胞都会死亡,就好像过度拥挤一样 任何有两个或三个活邻居的活细胞都会延续到下一代 任何有三个活邻居的死细胞都会变成活细胞 在过去的几个小时里,我一直致力于用C语言实现约翰·康威的生命游戏。我想做的是在K个连续迭代之后显示一个板的状态。作为输入,我使用二维数组的行数(int n)和列数(int m)、数组的组成部分(1表示活动,0表示死亡)和代数(K) 我已经成功地实现了使用平面方

约翰·康威的人生游戏——一套规则

  • 任何少于两个活邻居的活细胞都会死亡,就好像是由于人口不足
  • 任何一个有三个以上邻居的活细胞都会死亡,就好像过度拥挤一样
  • 任何有两个或三个活邻居的活细胞都会延续到下一代
  • 任何有三个活邻居的死细胞都会变成活细胞
  • 在过去的几个小时里,我一直致力于用C语言实现约翰·康威的生命游戏。我想做的是在K个连续迭代之后显示一个板的状态。作为输入,我使用二维数组的行数(int n)和列数(int m)、数组的组成部分(1表示活动,0表示死亡)和代数(K)

    我已经成功地实现了使用平面方法的游戏

    你可以在左边的网格中看到平面进近的含义,在这里我们检查黑匣子在N、NW、S、SW等方向的邻居。我的算法在这方面工作得很好,“生命”函数如下所示。为了实现这一点,我用零将两条边缘线/列包围起来

    void life(int a[100][100],int n,int m) {
      //Copies the main array to a temp array so changes can be entered into a grid
      //without effecting the other cells and the calculations being performed on them.
      int count;
      copy(a, temp, n ,m);
      for(int i = 1 ; i <=n ; i++) {
        for(int j = 1; j <= m; j++) {
          count = 0;
          count = a[i-1][j] + a[i][j-1] + a[i+1][j] + a[i][j+1] + a[i-1][j+1]
            + a[i+1][j-1] + a[i-1][j-1] + a[i+1][j+1];
          //The cell dies.
          if(count < 2 || count > 3)
            temp[i][j] = 0;
          //The cell stays the same.
          if(count == 2)
            temp[i][j] = a[i][j];
          //The cell either stays alive, or is "born".
          if(count == 3)
            temp[i][j] = 1;
        }
      }
      //Copies the completed temp array back to the main array.
      copy(temp, a, n ,m);
    }
    
    无效寿命(int a[100][100],int n,int m){
    //将主阵列复制到临时阵列,以便将更改输入网格
    //不影响其他单元格以及对其执行的计算。
    整数计数;
    副本(a、临时、n、m);
    
    对于(int i=1;i来说,当你处理一个你不理解的问题时,首先尝试解决一个更简单的问题往往更容易


    在生活游戏中,你有一个二维网格。如果我们只使用一个维度来简化事情会怎么样?如果你只有一行而不是网格会怎么样?你将如何处理使行的第一个和最后一个元素相邻的问题?

    试着使用
    %
    操作符来绕过限制:
    x%=100
    将变成
     100
    into
    0
    101
    into
    1
    等。在数组索引中使用模运算符:
    a[i-1][j+1]
    -->
    a[(i+n-1)%n][(j+m+1)%m]
    否决票似乎是最不公平的,如果我的部分帖子不充分,为什么不发表一些智慧,并建议我如何改进它?首先,你的第一个平面方法真的有效吗?在我看来,你好像是在阅读数组索引[100]和[101]这是不存在的。我假设
    n
    m
    为100。一旦你确定了平面进近边缘的情况,你可能会想到如何处理环绕(圆环)情况。(在涉及编程(语言)的标题/标题中,不要轻易使用:)这既不是对问题的批评,也不是要求澄清。这是对这个问题以及OP未来可能面临的许多其他问题的一个很好的回答。感谢你和其他人的努力解释,但我仍然不明白。我只是不能把我的心放在这个环形方法上,这非常令人沮丧。让我来我们再进一步尝试帮助你理解它。也许做一些物理的事情会有所帮助。拿一张8 x 11英寸的纸,撕成一条窄条。现在在窄条上画9条垂直线,并用索引号填充线之间的空间,从0开始。这表示10个元素的一维数组。你如何重新安排论文,使所有的元素都是相邻的?我不是直接给你答案,因为我认为如果你从我给你的东西中找出它,你会更好地理解环面方法。