生命游戏的简单实现(c++代码)

news2025/1/11 2:57:27

今天上数模课,本来一如既往准备自习,但是,生命游戏——从前就在“人工智能”的书上看到过,今天一讲,发现如此简单。课上30min实现了一份简单的生命游戏代码/

目录

前言

一、生命游戏

生命游戏的基本设置

生命游戏的规则

生命游戏的应用与发展

二、代码实现过程

三、代码

说明

结语


前言

系统演变仿真——生命游戏(与细胞自动机but没实现)

这是数模课的一节内容,讲计算机仿真,其中的一个小点,生命游戏。


一、生命游戏

  • 生命游戏(Game of Life, 简称 生命)是 John Conway 于 1970 年发明的
  • 生命游戏不是通常意义上的游戏,没有游戏者,也无所谓胜负
  • 生命游戏是一类特殊的 细胞自动机(Cellular Automata)
  • 一旦给定初始状态,之后的发展完全由规则确定
  • 生命充满了悬念!绝大多数情况下,不可能只根据初始状态(或称模式)判断未来的发展,只能按照游戏的规则运行下去

生命游戏的基本设置

  • 游戏在一个方形网格中进行,网格在各个方向上都是无限延伸的
  • 每个网格中有一个细胞,细胞可以是  的或者  的
  • 如果细胞是活的就在它所在的方格做一个标记,死的细胞则留空
  • 每个细胞的 邻居 是指它最邻近的 8 个方格

生命游戏的规则

  • 游戏的每一步中,计算每个细胞的 活邻居数目,由此数字决定下一步发展
  • 如果一个死细胞正好有 3 个活邻居,则下一步变成一个活细胞(诞生
  • 如果一个活细胞有 2 个或 3 个活邻居,则可以继续活下去(生存
  • 其他情况下,细胞将死去或保持死的状态(拥挤孤独

生命游戏的应用与发展

  • 生命游戏的演变规则近似的描述了生物群体的生存规律,经过扩展能够模拟生命活动中的生存、灭绝、竞争等等复杂现象
  • Conway 证明,生命游戏具有通用图灵机的计算能力,能力上与图灵机等价
  • 生命游戏的主要扩展方式包括修改或扩展规则改变生存空间设置

二、代码实现过程

  • 游戏的每一步中,计算每个细胞的 活邻居数目,由此数字决定下一步发展

这一步遍历整个表并且记录信息即可。

  • 如果一个死细胞正好有 3 个活邻居,则下一步变成一个活细胞(诞生
  • 如果一个活细胞有 2 个或 3 个活邻居,则可以继续活下去(生存
  • 其他情况下,细胞将死去或保持死的状态(拥挤孤独

这一步跟据记录的信息,标记/更新下一轮存活/死亡的信息。

实际上,一句代码即可:

table[i][j]=(count[i][j]==3?true:(count[i][j]==2?table[i][j]:false));

此外,每一轮,经过循环控制就可以实现一代又一代的演变。

三、代码

#include<iostream>
#include<cstdio>
#include<random>
#include<time.h>
#include<windows.h>

#define SIZE 30
#define TIMES 1000
using namespace std;

bool table[SIZE][SIZE];
int count[SIZE][SIZE];//存储该网格周围存活细胞数

void init();//初始化table
void show();//打印table
void count_live();  //计算所有网格周围存活细胞数,结果存在count中
int calcu(int x,int y);//计算单个网格周围存活细胞数
void live_next();//计算下一个时间片存活的情况

int main()
{
    init();
    int times=0;
    while(times++<TIMES)
    {
        show();
        Sleep(20);
        count_live();
        live_next();
        system("cls");
    }
    system("pause");
    return 0;
}

void init()
{
    srand(time(0));
    for(int i=0;i<SIZE;++i)
        for(int j=0;j<SIZE;++j)
        {
            table[i][j]=(rand()%3==0);
        }
}

void show()//打印table
{
    for(int i=0;i<SIZE;++i)
    {
        cout<<endl;
        for(int j=0;j<SIZE;++j)
        {
            if(table[i][j])cout<<"*"<<" ";
            else cout<<" "<<" ";
        }
        cout<<endl;
    }
}

void count_live()
{
    for(int i=0;i<SIZE;++i)
        for(int j=0;j<SIZE;++j)
        {
            count[i][j]=calcu(i,j);
        }
}

int calcu(int x,int y)//计算单个网格周围存活细胞数
{
    int num=0;
    if(table[(x-1+SIZE)%SIZE][(y-1+SIZE)%SIZE])num++;
    if(table[(x-1+SIZE)%SIZE][(y+SIZE)%SIZE])num++;
    if(table[(x-1+SIZE)%SIZE][(y+1+SIZE)%SIZE])num++;
    if(table[(x+SIZE)%SIZE][(y-1+SIZE)%SIZE])num++;
    if(table[(x+SIZE)%SIZE][(y+1+SIZE)%SIZE])num++;
    if(table[(x+1+SIZE)%SIZE][(y-1+SIZE)%SIZE])num++;
    if(table[(x+1+SIZE)%SIZE][(y+SIZE)%SIZE])num++;
    if(table[(x+1+SIZE)%SIZE][(y+1+SIZE)%SIZE])num++;
    return num;
}

void live_next()//计算下一个时间片存活的情况
{
    for(int i=0;i<SIZE;++i)
    {
        for(int j=0;j<SIZE;++j)
        {
            table[i][j]=(count[i][j]==3?true:(count[i][j]==2?table[i][j]:false));
        }
    }
}

说明

#define SIZE 30
#define TIMES 1000

用于控制地图的大小、循环的轮次。 

//init():
table[i][j]=(rand()%3==0);

用于控制初始化时,初始状态的网格点存活的概率,通过修改可以调整初始存活生命的多与少。

//show():
if(table[i][j])cout<<"*"<<" ";
else cout<<" "<<" ";

用于显示死亡/存活,可以自己修改显示的方式。

//main():
Sleep(20);

用于控制显示的帧率。

//calcu():
if(table[(x-1+SIZE)%SIZE][(y-1+SIZE)%SIZE])num++;
if(table[(x-1+SIZE)%SIZE][(y+SIZE)%SIZE])num++;
if(table[(x-1+SIZE)%SIZE][(y+1+SIZE)%SIZE])num++;
if(table[(x+SIZE)%SIZE][(y-1+SIZE)%SIZE])num++;
if(table[(x+SIZE)%SIZE][(y+1+SIZE)%SIZE])num++;
if(table[(x+1+SIZE)%SIZE][(y-1+SIZE)%SIZE])num++;
if(table[(x+1+SIZE)%SIZE][(y+SIZE)%SIZE])num++;
if(table[(x+1+SIZE)%SIZE][(y+1+SIZE)%SIZE])num++;

采用了边界取模循环,类比于空间无限大,回避边界问题。 

可视化通过cmd窗口实现 ,比较丑陋。(下面是过程的图)


结语

实现起来还是非常有趣且简单的!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/558666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WIN提权

win提权分为web和本地提权 web提权就是getshell后&#xff0c;权限是网站权限&#xff0c;要进行提权 本地提权是本地用户进行提权 本地用户的权限大于网站权限&#xff0c;所以本地提权成功概率比web提权概率大 因为我们做渗透测试&#xff0c;一般都是从网站入侵。所以大…

提高电商团队效率:必备的协作工具盘点

随着电商行业的快速发展&#xff0c;电商团队的规模和任务不断增加。然而&#xff0c;文件管理和文件协作方面的问题也随之出现。 电商行业可能存在的问题&#xff1a; 文件传输效率低下&#xff1a;电商团队需要频繁地共享和传输大量的文件&#xff0c;这会导致文件传输效率低…

快速上手,使用关键字驱动测试框架作为Web应用程序的自动化测试武器

目录 前言&#xff1a; 一、预备知识 二、关键字驱动测试框架 三、关键字驱动测试脚本 四、总结 前言&#xff1a; 自动化测试是软件测试中的重要环节之一&#xff0c;它可以帮助开发人员提高测试效率&#xff0c;节省时间和人力成本。随着互联网的发展&#xff0c;Web应…

互联网医院牌照申请|互联网医院申请流程

互联网医院牌照申请需要哪些资料和条件 随着互联网医疗的发展&#xff0c;越来越多的医疗机构开始申请互联网医院牌照。那么&#xff0c;互联网医院牌照的申请需要哪些资料和条件呢&#xff1f;以下是相关介绍。 申请资料 一、法定代表人身份证、执业医师资格证明 二、机构…

分布式事务解决方案Stata 整合 Spring Cloud + Nacos

1. 简介 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 2. Docker 安装 Seata 2.1 下载镜像 docker pull seataio/se…

js 如何定义类和引用

前言 JS是弱定义语言&#xff0c;最适合用于前端的数据处理。因为前端是数据的终点&#xff0c;用完就抛弃&#xff0c;所以前端一般都只是处理简单的业务逻辑。 但是有时候我们希望前端能进行一些复杂的处理&#xff0c;比如SqlLite本地缓存数据库&#xff0c;或者前端处理一…

低代码开发平台:打破IT与业务壁垒,实现高效协作

我们生活在一个离不开应用程序的世界&#xff1a;无论是个人消费者&#xff0c;还是企业运营&#xff0c;应用程序往往是最终的解决方案&#xff0c;它们可以是模块化的&#xff0c;也可以是一个整体&#xff0c;将数据、信息都链接起来&#xff0c;以提高生产生活的效率。 从企…

Fiora二次元Web在线聊天室源码搭建教程|详细

安卓客户端体验&#xff1a;fiora点击下载 网页版体验&#xff1a;fiora网页版 使用的系统是Linux Centos7.6 注意: 512M内存vps可能还需要先加一点虚拟内存&#xff0c;不然构建过程会失败。 开始安装 命令行安装方法 一、安装Nodejs curl -sL https://rpm.nodesource.com/…

chatgpt赋能Python-python_land

Python Land: 探索Python世界的终极指南 Python是一种具有广泛用途的高级编程语言&#xff0c;具有简单易学的特点&#xff0c;因此而备受青睐。Python Land是一个编程社区&#xff0c;该社区专注于提供Python编程有关的资源&#xff0c;以帮助有兴趣的人通过学习Python语言提…

HTTP中 Connection: keep-Alive与TCP中中keepalive有什么区别?

有小伙伴不明白keep-Alive和keepalive有什么区别&#xff1f;今天写这篇文章详细讲清楚&#xff01; HTTP是请求响应模型也就是客户端发起了请求&#xff0c;服务端才会返回响应&#xff0c;一来一回。 由于 HTTP 是基于 TCP 传输协议实现的&#xff0c;客户端与服务端要进行 H…

【中阳期货】国际期货与股票的区别

摘要:“股票之后就是期货”这句话生动地揭示了股票交易与期货交易的内在联系。期货交易的重要功能首先是有利于增强商品价格的预期性,为商业活动的顺利进行创造良好的条件。期货借助市场功能可以找到商品真正的市场价格,有利于制造厂商和生产者确定产品成本产品生产费用,以便顺…

ubuntu下使用python进行简单的UDP通信

目录 一、参考链接二、主要工作1.查看本机ip2.下载Ubuntu下网络调试助手 NetAssist3.编写一个python脚本测试UDP通信4.测试简单的UDP通信 一、参考链接 Ubuntu下网络调试助手 NetAssist 使用python实现UDP通信 python代码实现简单的udp通信 二、主要工作 1.查看本机ip #下载…

如何压缩过大的H2数据库文件

平台自带的H2数据库在使用过程中会随着数据量的增加而增长&#xff0c;但是并不会在删除数据后自动缩小。所以O2OA提供了数据库压缩命令用于缩小数据库占用的空间。 一、先决条件 1、O2Server服务器正常运行&#xff0c;系统安装部署请参考文档《如何在服务器上安装部署O2OA》…

微软收购暴雪战未结束;迪士尼流失 4 百万用户;苹果 iPhone 销量增长;国际旅行回暖机票订单火爆;美国年通胀率再次下降 | 经济学人第 20 周

文章目录 苹果 iPhone 销量增长&#xff0c;但总体收入下降微软收购暴雪战未结束迪士尼流失 4 百万用户美国年通胀率再次下降国际旅行回暖&#xff0c;机票订单火爆瑞银认命首席执行官&#xff0c;完成对瑞士信贷的最终收购最后 苹果 iPhone 销量增长&#xff0c;但总体收入下降…

【Linux环境基础开发工具】编辑器-vim

写在前面 vim是一个编辑器&#xff0c;是在Linux下编程的常用工具&#xff0c;如果要学习在Linux下的编程&#xff0c; 那学会使用vim是一个必修课&#xff0c;今天我就来讲解如何使用vim编辑器。 目录 写在前面 什么是vim vim的常用命令 &#xff08;1&#xff09;gg&a…

C++之堆排

堆排的原理和结构&#xff1a; 堆排序是一种常见的排序算法&#xff0c;基于堆这种数据结构实现。堆是一种特殊的树形数据结构&#xff0c;它满足以下两个条件&#xff1a; 堆是一棵完全二叉树。 堆的任意节点的值&#xff0c;都必须大于等于&#xff08;或小于等于&#xff0…

平板第三方电容笔怎么样?apple pencil一代平替笔推荐

我是一位数码产品的爱好者&#xff0c;所以我对电容笔也有一定的了解。我认为&#xff0c;苹果的原装电容笔和一般的电容笔的区别&#xff0c;在于它们所能产生的压感效果不同。由于苹果的电容笔具有独特的“重力压感”&#xff0c;因此&#xff0c;这款画笔能让我们快速地在画…

搜索二维矩阵 II——力扣240

文章目录 题目描述法一&#xff09;二分查找法二&#xff09;抽象二叉搜索树BST法三&#xff09;直接查找 题目描述 法一&#xff09;二分查找 与搜索二维矩阵——力扣74不同&#xff0c;本题没有保证「每行的第一个整数大于前一行的最后一个整数」&#xff0c;因此无法采取「两…

CentOS安装过程笔记

以前弄过一个ls的版本是直接虚拟机带起的。是系统都是别人给设置好调好的win系统的。后来发现问题&#xff0c;自己也不会搞&#xff0c;所以那个平台就一直扔在那里也没用过。 这次自己搞就想从0试一下吧。一直以为服务器必须Linux才行&#xff0c;所以就想安个CentOS&#x…

TLS 加速技术:Intel QuickAssist Technology(QAT)解决方案

作者&#xff1a;vivo 互联网服务器团队- Ye Feng 本文介绍了 Intel QAT 技术方案&#xff0c;通过Multi-Buffer技术和QAT硬件加速卡的两种方式实现对TLS的加速 一、背景 当前 TLS 已经成为了互联网安全的主要传输协议&#xff0c;TLS带来更高的安全性的同时&#xff0c;也带…