生命游戏C++

生命游戏一般指康威生命游戏,是由剑桥大学约翰.何顿.康威设计的计算机程序。生命游戏既没有玩家之间的竞争,也没有输赢,可以归类为仿真游戏。因为其模拟和显示的图像看起来像具有生命的出生、繁衍过程,而被称之为“生命游戏”。

生命游戏规定,每个方格可以放置一个生命细胞,而每个生命细胞只有生和死两种状态。规定:

  1. 当前细胞为死亡状态时,当周围由3个存活细胞时,迭代后该细胞变成存活状态;若原先为生,则保持不变;

  1. 当前细胞为存活状态,而周围的邻居细胞小于两个存活时,则细胞死亡;

  1. 细胞为存活状态,而周围细胞存活数为2或3时,该细胞状态保持不变;

  1. 当细胞状态为存活状态,而周围存活了大于3个细胞时,则细胞死亡。

使用graphics库进行图形化

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <graphics.h>//用来支持图形化的库
#include <conio.h>//刷新函数的头文件
#include <wingdi.h>

#define WIDTH 540
#define HEIGHT 540
#define N 110
#define SIZE 5//细胞边长

int map[N+2][N+2];//创建初始化的细胞世界
int next[N + 2][N + 2];//存储下一刻的世界
int count;
char str[20]=" ";
int speed;//存放速度


void welcome()
{
    initgraph(WIDTH, HEIGHT);//创建窗口
    setbkcolor(RGB(200,155,200));
    cleardevice();//清屏
    settextstyle(40, 0, "楷体");
    settextcolor(BLUE);
    outtextxy(150,40,"生命游戏");//出现生命游戏标题的位置
    outtextxy(200, 300, "按空格暂停");
    outtextxy(80, 100, "按数字键控制速度");

    int c = 250;
    while (!_kbhit())//检测按键
    {
        c -= 3;
        if (c < 0)
        {
            c = 25;
        }
        settextcolor(RGB(20, c, 20));
        outtextxy(150, 350, "按任意键继续");
    }
    _getch();//任意键刷新
    cleardevice();//刷新
}

void initDATA()
{
    for (int i = 0;i < N+2;i++)
    {
        for (int j=0;j<N+2;j++)
        {
            map[i][j] = 0;
        }
    }
    speed = 250;//存放速度
    count = 0;
}

void recDETA()
{
    for (int i = 1; i < N + 1; i++)
    {
        for (int j = 1; j < N + 1; j += 2)
        {
            //if (i==0 || i==N-1 || j==0 || j==N-1)//比较奇特的分布方式
            //if (i == 2 || i == N-1 || j == 1 || j ==N-1)//矩形
            map[i][j] = 1;
        }
        for (int i = 1; i < N + 1; i += 2)
        {
            for (int j = 1; j < N; j += 2)
            {
                if (i == 0 || i == N - 1 || j == 0 || j == N - 1)
                    map[i][j] = 1;
                else
                {
                    map[i][j] = 0;
                }
            }
        }
    }
}

void drawGame()
{
    count = 0;
    for (int i = 1;i < N+1;i++)    //行数y
    {
        for (int j = 1;j < N+1;j++)     //列数x
        {
            int nx, ny;   //把下标换成坐标
            nx = (j-1)* SIZE;
            ny = (i-1)* SIZE;
            if (map[i][j] == 1)
            {
                setfillcolor(RGB(100,100,200));
                solidrectangle(nx, ny, nx + SIZE, ny + SIZE);      //int x,int y,int xx,int yy
                count++;
            }
            else if (map[i][j])
            {
                setfillcolor(RGB(200, 155, 230));
                solidrectangle(nx, ny, nx + SIZE/2, ny + SIZE/2);
            }
        }
    }
    sprintf(str, "存活数量[%d]", count);//显示地图上的细胞数
    settextstyle(20,0, "楷体");
    outtextxy(260, 30, str);//存放数字显示器的位置
}

void show() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("%d", map[i][j]);
        }
        printf("/n");
    }
}

void ruleGame()//游戏的规则
{    
    int next[N + 2][N + 2] = { 0 };//暂存下一时刻的变化
    for (int i = 1;i < N+1;i++)
    {
        for (int j = 1;j < N+1;j++)
        {
            int temp = 0;//存放周围8个细胞数量
            temp = map[i - 1][j - 1]+ map[i - 1][j ]+ map[i - 1][j + 1]+ map[i ][j - 1]+ 
                map[i ][j + 1]+ map[i + 1][j - 1]+ map[i + 1][j ]+ map[i + 1][j + 1];
            switch (temp)
            {
            case 2:
                next[i][j] = map[i][j];
                break;
            case 3:
                next[i][j] = 1;
                break;
            default:
                next[i][j] = 0;
                break;
            }
        }
    }
    for (int i =0;i<N+2;i++)
    {
        for (int j = 0;j < N+2;j++)
        {
            map[i][j] = next[i][j];
        }
    }
}

void keyDOWN()//按键处理
{
    if (_kbhit())
    {
        char ch = _getch();
        if (ch == 32)//ASCII码:也就是当用户按下空格键的时候
        {
            while (_getch() != 32);//直到用户按的不再是空格的时候结束循环,以实现暂停功能
            
        }
        if (ch > '0' && ch<'9')//用户输入数字以改变速度
        {
            speed = ('9'-ch) * 100;
        }
    }
}

int main()
{
    welcome();
    initDATA();
    recDETA();

    while (1)
    {
        drawGame();
        Sleep(speed);
        ruleGame();
        keyDOWN();
    }
    closegraph();//关闭窗口
    return 0;
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜之王。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值