【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

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个简单的C++实现康威生命游戏的代码。康威生命游戏是一个基于细胞自动机的零玩家游戏,它是由英国数学家约翰·康威在1970年发明的。 以下是一个简单的实现: ```c++ #include <iostream> #include <cstdlib> #include <ctime> using namespace std; const int ROW = 20; //棋盘行数 const int COL = 20; //棋盘列数 void initBoard(int board[][COL]) { srand(time(NULL)); //随机种子 for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { board[i][j] = rand() % 2; //随机生成0或1 } } } void displayBoard(int board[][COL]) { for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { if (board[i][j] == 0) { cout << " "; //死细胞用空格表示 } else { cout << "X"; //活细胞用X表示 } } cout << endl; } } int countNeighbor(int board[][COL], int row, int col) { int count = 0; for (int i = row - 1; i <= row + 1; i++) { for (int j = col - 1; j <= col + 1; j++) { if (i >= 0 && i < ROW && j >= 0 && j < COL && !(i == row && j == col)) { count += board[i][j]; } } } return count; } void updateBoard(int board[][COL]) { int newBoard[ROW][COL]; for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { int count = countNeighbor(board, i, j); if (board[i][j] == 1 && (count == 2 || count == 3)) { //活细胞周围2或3个活细胞时仍然存活 newBoard[i][j] = 1; } else if (board[i][j] == 0 && count == 3) { //死细胞周围恰好3个活细胞时复活 newBoard[i][j] = 1; } else { newBoard[i][j] = 0; //其他情况细胞死亡 } } } for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { board[i][j] = newBoard[i][j]; //更新棋盘 } } } int main() { int board[ROW][COL]; initBoard(board); while (true) { displayBoard(board); updateBoard(board); system("cls"); //清屏 } return 0; } ``` 该程序使用二维数组模拟了一个棋盘,其中每个元素代表一个细胞,0表示死细胞,1表示活细胞。`initBoard`函数用于随机初始化棋盘,`displayBoard`函数用于显示当前的棋盘状态,`countNeighbor`函数用于统计某个细胞周围的活细胞数量,`updateBoard`函数用于根据细胞周围的情况更新棋盘状态。在主函数中,程序不断显示当前的棋盘状态,并不断更新棋盘,直到用户手动退出程序为止。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值