这是我C语言的一个小项目,如有Bug请指出。
用C语言来实现Conway‘s_Game_of_Life
规则:
细胞有存活或死亡两种状态,与自身周围的八个细胞互动
细胞周围的存活细胞 == 2个时,该细胞保持原状态;
细胞周围的存活细胞 == 3个时,该细胞变成存活状态;
其他情况细胞死亡。
本项目采用动态内存开辟来存储数据,而不是直接在栈区创建二维数组,这样有以下优点:
1、动态内存开辟在堆区开辟空间,堆区空间>栈区空间(次要因素)
2、为了正确计算细胞周围存活细胞的数目,在判断完第一个细胞的死活后,不能立刻修改,而是要存储在另一块空间内,在全部计算完成后才可修改原来位置的数值。
如果在栈区开辟空间,除了一开始就有的cells[]数组,还需要再创建一个temporary[]数组,将计算好的数据存进去,判断完所有细胞的死活后再将数据拷贝回cells[]数组;
如果在堆区开辟空间,一开始开辟cells[]数组同时,创建一个cellsCopy[]数组,将计算好的数据存进cellsCopy[]数组,判断完所有细胞的死活后只需交换指向cellsCopy[]数组和cells[]数组的指针即可
边界:
由于最边上的元素没有被环绕,不能采用与中间元素相同的访问方式,否则会越界访问导致程序崩溃。所以需要特殊处理,
方法1.不修改最边上的元素,如创建6*6的数组,实际会发生变化的只有4*4大小
方法2.使用滚动数组
这里采用方法1,因为实现简单,我采用calloc()来开辟空间,所以最边上的所有元素恒定为死亡状态,当然也可以初始化为全部存活,或随机,只需调整 InitailizeCells()函数即可。
注意"不修改最边上的元素"是指Growing()不访问最边上的元素,InitailizeCells()可以访问可以不访问;这里InitailizeCells()使用随机函数,也可改成手动输入坐标。
本工程包含三个文件,一个头文件Conway's_Game_of_Life.h,两个源文件Conway's_Game_of_Life.c和test.c
<