【C/C++】康威生命游戏——conway game

//conway_game.c

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

#include "conway_game.h"

int main(void)
{
    if(GripInit() != 0)
    {
        printf("ILlegal rows or columns!!!\n");
    }
    
    if(GripUpdate() != 0)
    {
        printf("ILlegal characters!!!\n");
    }
    
    GripFree();
    
    return 0;
}

int GripInit(void)
{
    int i,j;

    scanf("%d %d\n", &row,&column);
    if(row <= 0 || column <= 0)
    {
        return -1;
    }

    grip_char = (char**)malloc(sizeof(char *)*row);
    for(i = 0;i < row;i ++)
    {
        grip_char[i] = (char*)malloc(sizeof(char)*column);
    }
    
    for(i = 0;i < row;i ++)
    {
        for(j = 0;j < column;j ++)
        {
            scanf("%c", &grip_char[i][j]);
        }
        getchar();
    }
    
    return 0;
}

void GripFree(void)
{
    int i = 0;
    for(i = 0;i < row;i ++)
    {
        free(grip_char[i]);
    }
    free(grip_char);
}

//将原网格映射到一个容量为[row+2][column+2]的网格中间,将死亡细胞标志为0,存活细胞标志为1
int GripConvert(int grip_int[][column + 2])
{
    int i,j = 0;
    
    for(i = 0;i < row + 2;i ++)
    {
        for(j = 0;j < column + 2;j ++)
        {
            grip_int[i][j] = 0;
        }
    }
    
    for(i = 0;i < row;i ++)
    {
        for(j = 0;j < column;j ++)
        {
            if(grip_char[i][j] == '*')
                grip_int[i + 1][j + 1] = 1;
            else if(grip_char[i][j] == '.')
                grip_int[i + 1][j + 1] = 0;
            else
                return -1;
        }
    }
    
    return 0;
}

//计算四周存活细胞数
int CountLivingCells(int m, int n, int grip_int[][column + 2])
{
    int living_count = 0;
    
    living_count = grip_int[m][n] + grip_int[m][n + 1] + grip_int[m][n + 2] + 
                     grip_int[m + 1][n] + grip_int[m + 1][n + 2] + 
                     grip_int[m + 2][n] + grip_int[m + 2][n + 1] + grip_int[m + 2][n + 2];
    
    return living_count;
}

//打印网格
void GripPrint(char grip[][column])
{
    int i,j;
    
    printf("%d %d\n", row, column);
    for(i = 0;i < row;i ++)
    {
        for(j = 0;j < column;j ++)
        {
            printf("%c", grip[i][j]);
        }
        printf("\n");
    }
}

int GripUpdate(void)
{
    int i,j = 0;
    int living_count = 0;
    int temp[row + 2][column + 2];
    char grip_next[row][column];
    
    if(GripConvert(temp) != 0)
    {
        return -1;
    }
    
    for(i = 0;i < row;i ++)
    {
        for(j = 0;j < column;j ++)
        {
            living_count = CountLivingCells(i, j, temp);
            if(living_count == 3)       //周围有3个活细胞时,该细胞生
                grip_next[i][j] = '*';
            else if(living_count == 2)  //周围有2个活细胞时,该细胞状态不变
                grip_next[i][j] = grip_char[i][j];
            else                        //周围有过多或过少活细胞时,该细胞死
                grip_next[i][j] = '.';
        }
    }
    
    GripPrint(grip_next);
    
    return 0;
}


/*备份*/
/*#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

#include "conway_game.h"

int row    = 0;
int column = 0;
char **grip_char;  //定义全局二维指针

int GripInit(void);
void GripFree(void);
int CountLivingCells(int m, int n);
int GripUpdate(void);

int main(void)
{
    if(GripInit() != 0)
    {
        printf("ILlegal rows or columns!!!\n");
    }
    
    if(GripUpdate() != 0)
    {
        printf("ILlegal characters!!!\n");
    }
    GripFree();
    
    return 0;
}

int GripInit(void)
{
    int i,j;

    scanf("%d %d\n", &row,&column);
    if(row <= 0 || column <= 0)
    {
        return -1;
    }

    grip_char = (char**)malloc(sizeof(char *)*row);
    for(i = 0;i < row;i ++)
    {
        grip_char[i] = (char*)malloc(sizeof(char)*column);
    }
    
    for(i = 0;i < row;i ++)
    {
        for(j = 0;j < column;j ++)
        {
            scanf("%c", &grip_char[i][j]);
        }
        getchar();
    }
    
    return 0;
}

void GripFree(void)
{
    int i = 0;
    for(i = 0;i < row;i ++)
    {
        free(grip_char[i]);
    }
    free(grip_char);
}

int CountLivingCells(int m,int n)  //为了减小空间复杂度,可以把里面的temp数组赋值拿出来
{
    int temp[row + 2][column + 2];
    int neibour_number = 0;
    int i,j = 0;
    
    for(i = 0;i < row + 2;i ++)
    {
        for(j = 0;j < column + 2;j ++)
        {
            temp[i][j] = 0;
        }
    }
    
    for(i = 0;i < row;i ++)
    {
        for(j = 0;j < column;j ++)
        {
            if(grip_char[i][j] == '*')
                temp[i + 1][j + 1] = 1;
            else if(grip_char[i][j] == '.')
                temp[i + 1][j + 1] = 0;
            else
                return -1;
        }
    }
    
    neibour_number = temp[m][n] + temp[m][n + 1] + temp[m][n + 2] + 
                     temp[m + 1][n] + temp[m + 1][n + 2] + 
                     temp[m + 2][n] + temp[m + 2][n + 1] + temp[m + 2][n + 2];
    
    return neibour_number;
}

int GripUpdate(void)
{
    int i,j = 0;
    int living_count = 0;
    char grip_next[row][column];
    
    for(i = 0;i < row;i ++)
    {
        for(j = 0;j < column;j ++)
        {
            living_count = CountLivingCells(i, j);
            if(living_count == 3)       //周围有3个活细胞时,该细胞生
                grip_next[i][j] = '*';
            else if(living_count == 2)  //周围有2个活细胞时,该细胞状态不变
                grip_next[i][j] = grip_char[i][j];
            else if(living_count == -1)
                return -1;
            else                        //周围有过多或过少活细胞时,该细胞死
                grip_next[i][j] = '.';
        }
    }
    
    printf("%d %d\n", row, column);
    for(i = 0;i < row;i ++)
    {
        for(j = 0;j < column;j ++)
        {
            printf("%c", grip_next[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}*/


<conway_game.h>

#ifndef CONWAY_GAME_INCLUDED
#define CONWAY_GAME_INCLUDED

int row    = 0;
int column = 0;
char **grip_char;  //定义全局二维指针

int GripInit(void);
void GripFree(void);
int GripConvert(int grip_int[][column + 2]);
int CountLivingCells(int m, int n, int grip_int[][column + 2]);
void GripPrint(char grip[][column]);
int GripUpdate(void);

#endif

<conway_game.c>

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

#include "conway_game.h"

int main(void)
{
    if(GripInit() != 0)
    {
        printf("ILlegal rows or columns!!!\n");
    }
    
    if(GripUpdate() != 0)
    {
        printf("ILlegal characters!!!\n");
    }
    
    GripFree();
    
    return 0;
}

int GripInit(void)
{
    int i,j;

    scanf("%d %d\n", &row,&column);
    if(row <= 0 || column <= 0)
    {
        return -1;
    }

    grip_char = (char**)malloc(sizeof(char *)*row);
    for(i = 0;i < row;i ++)
    {
        grip_char[i] = (char*)malloc(sizeof(char)*column);
    }
    
    for(i = 0;i < row;i ++)
    {
        for(j = 0;j < column;j ++)
        {
            scanf("%c", &grip_char[i][j]);
        }
        getchar();
    }
    
    return 0;
}

void GripFree(void)
{
    int i = 0;
    for(i = 0;i < row;i ++)
    {
        free(grip_char[i]);
    }
    free(grip_char);
}

//将原网格映射到一个容量为[row+2][column+2]的网格中间,将死亡细胞标志为0,存活细胞标志为1
int GripConvert(int grip_int[][column + 2])
{
    int i,j = 0;
    
    for(i = 0;i < row + 2;i ++)
    {
        for(j = 0;j < column + 2;j ++)
        {
            grip_int[i][j] = 0;
        }
    }
    
    for(i = 0;i < row;i ++)
    {
        for(j = 0;j < column;j ++)
        {
            if(grip_char[i][j] == '*')
                grip_int[i + 1][j + 1] = 1;
            else if(grip_char[i][j] == '.')
                grip_int[i + 1][j + 1] = 0;
            else
                return -1;
        }
    }
    
    return 0;
}

//计算四周存活细胞数
int CountLivingCells(int m, int n, int grip_int[][column + 2])
{
    int living_count = 0;
    
    living_count = grip_int[m][n] + grip_int[m][n + 1] + grip_int[m][n + 2] + 
                     grip_int[m + 1][n] + grip_int[m + 1][n + 2] + 
                     grip_int[m + 2][n] + grip_int[m + 2][n + 1] + grip_int[m + 2][n + 2];
    
    return living_count;
}

//打印网格
void GripPrint(char grip[][column])
{
    int i,j;
    
    printf("%d %d\n", row, column);
    for(i = 0;i < row;i ++)
    {
        for(j = 0;j < column;j ++)
        {
            printf("%c", grip[i][j]);
        }
        printf("\n");
    }
}

int GripUpdate(void)
{
    int i,j = 0;
    int living_count = 0;
    int temp[row + 2][column + 2];
    char grip_next[row][column];
    
    if(GripConvert(temp) != 0)
    {
        return -1;
    }
    
    for(i = 0;i < row;i ++)
    {
        for(j = 0;j < column;j ++)
        {
            living_count = CountLivingCells(i, j, temp);
            if(living_count == 3)       //周围有3个活细胞时,该细胞生
                grip_next[i][j] = '*';
            else if(living_count == 2)  //周围有2个活细胞时,该细胞状态不变
                grip_next[i][j] = grip_char[i][j];
            else                        //周围有过多或过少活细胞时,该细胞死
                grip_next[i][j] = '.';
        }
    }
    
    GripPrint(grip_next);
    
    return 0;
}


/*备份*/
/*#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

#include "conway_game.h"

int row    = 0;
int column = 0;
char **grip_char;  //定义全局二维指针

int GripInit(void);
void GripFree(void);
int CountLivingCells(int m, int n);
int GripUpdate(void);

int main(void)
{
    if(GripInit() != 0)
    {
        printf("ILlegal rows or columns!!!\n");
    }
    
    if(GripUpdate() != 0)
    {
        printf("ILlegal characters!!!\n");
    }
    GripFree();
    
    return 0;
}

int GripInit(void)
{
    int i,j;

    scanf("%d %d\n", &row,&column);
    if(row <= 0 || column <= 0)
    {
        return -1;
    }

    grip_char = (char**)malloc(sizeof(char *)*row);
    for(i = 0;i < row;i ++)
    {
        grip_char[i] = (char*)malloc(sizeof(char)*column);
    }
    
    for(i = 0;i < row;i ++)
    {
        for(j = 0;j < column;j ++)
        {
            scanf("%c", &grip_char[i][j]);
        }
        getchar();
    }
    
    return 0;
}

void GripFree(void)
{
    int i = 0;
    for(i = 0;i < row;i ++)
    {
        free(grip_char[i]);
    }
    free(grip_char);
}

int CountLivingCells(int m,int n)  //为了减小空间复杂度,可以把里面的temp数组赋值拿出来
{
    int temp[row + 2][column + 2];
    int neibour_number = 0;
    int i,j = 0;
    
    for(i = 0;i < row + 2;i ++)
    {
        for(j = 0;j < column + 2;j ++)
        {
            temp[i][j] = 0;
        }
    }
    
    for(i = 0;i < row;i ++)
    {
        for(j = 0;j < column;j ++)
        {
            if(grip_char[i][j] == '*')
                temp[i + 1][j + 1] = 1;
            else if(grip_char[i][j] == '.')
                temp[i + 1][j + 1] = 0;
            else
                return -1;
        }
    }
    
    neibour_number = temp[m][n] + temp[m][n + 1] + temp[m][n + 2] + 
                     temp[m + 1][n] + temp[m + 1][n + 2] + 
                     temp[m + 2][n] + temp[m + 2][n + 1] + temp[m + 2][n + 2];
    
    return neibour_number;
}

int GripUpdate(void)
{
    int i,j = 0;
    int living_count = 0;
    char grip_next[row][column];
    
    for(i = 0;i < row;i ++)
    {
        for(j = 0;j < column;j ++)
        {
            living_count = CountLivingCells(i, j);
            if(living_count == 3)       //周围有3个活细胞时,该细胞生
                grip_next[i][j] = '*';
            else if(living_count == 2)  //周围有2个活细胞时,该细胞状态不变
                grip_next[i][j] = grip_char[i][j];
            else if(living_count == -1)
                return -1;
            else                        //周围有过多或过少活细胞时,该细胞死
                grip_next[i][j] = '.';
        }
    }
    
    printf("%d %d\n", row, column);
    for(i = 0;i < row;i ++)
    {
        for(j = 0;j < column;j ++)
        {
            printf("%c", grip_next[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}*/


<conway_game.h>

#ifndef CONWAY_GAME_INCLUDED
#define CONWAY_GAME_INCLUDED

int row    = 0;
int column = 0;
char **grip_char;  //定义全局二维指针

int GripInit(void);
void GripFree(void);
int GripConvert(int grip_int[][column + 2]);
int CountLivingCells(int m, int n, int grip_int[][column + 2]);
void GripPrint(char grip[][column]);
int GripUpdate(void);

#endif

猜你喜欢

转载自blog.csdn.net/sinat_33408502/article/details/105817235