12.2.8--C语言:生命游戏小程序---未成功的代码

题目描述:

1、方格组成的矩阵阵列,每个方格包含一个机体,每个方格和八个机体相邻(这个是很重要的信息---因为矩阵的边界部分不符合这个条件)
也就不存在说辅助边界空间的说法--因为原来矩阵的边界是不符合程序生命体的转变条件的,本身就是固定不变化的。
2、使用函数occ(k)函数表示方格k相邻的包含机体的方格数:
3、规则:2<= occ(k)<=3方格K中的机体继续存活,否则机体死亡
     occ(k) = 3 方格中诞生一个新的机体
4、打印每一时间各个方格中机体的情况

读题也是一个反复的过程。。。。

否定之否定--感觉对了--发现错误--改正再理解。

代码还是未成功:

/**
 * 题目的意图难理解(看不明白及时网上查询)
 * 1、设计两个函数 分别求指定方格的周围八个单元中机体的存活情况
 * 2、根据上一轮查询 周围方格存活情况 判断方格自身的 存活情况
 * 3、周围存活个数与自身是否存活的变量 -- 设计在同一个结构体中
 * 4、设计一个函数(传入两个空间相同的数据)将旧数组中的内容存到新的数组中,避免变化对原数组产生影响。
 * 
*/
//根据题目的要求 5x5的矩阵实际变化的是4x4
/**
 * 必须自己思考
 * 
*/
#include <stdio.h>
#define M 5
#define N 5

//结构体的成员变量自己设计需要怎么样
struct organ
{ //单元体是否是有生命的
    char state;
    //单元体(九宫格)周围的状态
    short count;
};
//根据本身存活状态以及周围的单元存活状态判断本身的存活状态---两个二维数组是 开辟一个新的二维空间去保存的新的数组状态

//此函数没有解决边界的问题
void life(struct organ a[][N], struct organ b[][N]);
// 根据上一轮结束后状态计算每个单元其相邻的结点相邻的八个结点的存活个数 -- 为什么需要设计成这种二维数组的形式 --  不确定的行的二维数组
void occ(struct organ x[][N]);

int k = 0;
//两个数组边界都是合法(辅助空间),已经分配了空间。辅助边界部分上的单元默认都是死亡的(只有统计的存活的个数对非辅助边界部分有影响)
struct organ first[M][N], second[M][N];

void main()
{
    int i, j, num;
    short n;
    char c;
    printf("This is the initial state.\n");
    for (i = 0; i < M; i++)
    {
        for (j = 0; j < N; j++)
        {
            scanf("%c", &first[i][j].state);
        }
    }
    printf("Input the number of changes.\n");
    scanf("%d", &num);
    //自定义的函数:一轮中将所的元素都计算看其中的所有单个元素的状态 完成后再改变各个单元的存活状态
    occ(first);
    k = 1;
    while (k <= num)
    {
        if (k % 2)
        {
            life(first, second);
        }
        else
        {
            life(second, first);
        }
    }
}
//根据周边的八个元素&&单元本身的状态决定====》当前元素的状态
void life(struct organ a[][N], struct organ b[][N])
{
    int i, j;
    int n;
    char c;
    for (i = 1; i < M - 1; i++)
    {
        for (j = 1; j < N - 1; j++)
        {
            n = a[i][j].count;
            c = a[i][j].state;
            if ((n >= 2 && n <= 3 && c == '*') || (n == 3 && c == ' '))
            {
                b[i][j].state = '*';
            }
            else
            {
                b[i][j].count = '+';
            }
        }
    }
    occ(b);
    printf("This is the result of %dth time.\n", k);
    for (i = 0; i < M; i++)
    {
        for (j = 0; j < N; j++)
        {
            printf("%c", b[i][j].state);
        }
        printf("\n");
    }
}
//统计每个单元周围的存活的个数
void occ(struct organ x[][N])
{
    int i, j;
    short c;
    //C语言是默认从0开始 左边界存在
    for (i = 1; i < M - 1; i++)
    {
        for (j = 1; j < N - 1; j++)
        {
            c = 0;
            //如果下标表示的单元不存在怎么处理???? 不是所有的单元都存在八个相邻的单元
            if (x[i - 1][j - 1].state == '*')
                c++;
            if (x[i - 1][j].state == '*')
                c++;
            if (x[i - 1][j + 1].state == '*')
                c++;
            if (x[i + 1][j - 1].state == '*')
                c++;
            if (x[i + 1][j].state == '*')
                c++;
            if (x[i + 1][j + 1].state == '*')
                c++;
            if (x[i][j - 1].state == '*')
                c++;
            if (x[i][j + 1].state == '*')
                c++;
        }
        x[i][j].count = c;
    }
}
发布了212 篇原创文章 · 获赞 32 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_42664961/article/details/104028576