栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

生命游戏【C/C++】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

生命游戏【C/C++】

生命游戏

简介: 康威生命游戏:
康威生命游戏(Game of Life),剑桥大学约翰·何顿·康威设计的计算机程序。[1]美国趣味数学大师马丁·加德纳(Martin Gardner,1914-2010)通过《科学美国人》杂志,将康威的生命游戏介绍给学术界之外的广大渎者,一时吸引了各行各业一大批人的兴趣,这时细胞自动机课题才吸引了科学家的注意。[1]
中文名:康威生命游戏
外文名:Conway life game
提出者约翰·何顿·康威


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

生命游戏
  • 生命游戏
  • 概述>
  • 一、游戏规则是什么?
    • <==游戏规则 :==> 生存定律
    • 游戏开始时,每个细胞随机地设定为“生”或“死”之一的某个状态。然后,根据某种规则,计算出下一代每个细胞的状态,画出下一代细胞的生死分布图。应该规定什么样的迭代规则呢?需要一个简单的,但又反映生命之间既协同又竞争的生存定律。为简单起见,最基本的考虑是假设每一个细胞都遵循完全一样的生存定律;再进一步,把细胞之间的相互影响只限制在最靠近该细胞的8个邻居中。也就是说,每个细胞迭代后的状态由该细胞及周围8个细胞状态所决定。作了这些限制后,仍然还有很多方法来规定“生存定律”的具体细节。例如,在康威的生命游戏中,规定了如下生存定律。
  • 二、使用步骤
    • 1.引入库
    • 2.主函数
    • 3.函数调用
  • 总结


概述>

提示:这里可以添加本文要记录的大概内容:

小崔

生命游戏没有游戏玩家各方之间的竞争,也谈不上输赢,可以把它归类为仿真游戏。事实上,也是因为它模拟和显示的图像看起来颇似生命的出生和繁衍过程而得名为“生命游戏”。在游戏进行中,杂乱无序的细胞会逐渐演化出各种精致、有形的结构;这些结构往往有很好的对称性,而且每一代都在变化形状。一些形状一经锁定就不会逐代变化。有时,一些已经成形的结构会因为一些无序细胞的“入侵”而被破坏。但是形状和秩序经常能从杂乱中产生出来。每个方格中都可放置一个生命细胞,每个生命细胞只有两种状态:“生”或“死”。用黑色方格表示该细胞为“生”,空格(白色)表示该细胞为“死”。或者说方格网中黑色部分表示某个时候某种“生命”的分布图。生命游戏想要模拟的是:随着时间的流逝,这个分布图将如何一代一代地变化。


提示:以下是本篇文章正文内容,下面案例可供参考

一、游戏规则是什么? <游戏规则 :>
生存定律 游戏开始时,每个细胞随机地设定为“生”或“死”之一的某个状态。然后,根据某种规则,计算出下一代每个细胞的状态,画出下一代细胞的生死分布图。应该规定什么样的迭代规则呢?需要一个简单的,但又反映生命之间既协同又竞争的生存定律。为简单起见,最基本的考虑是假设每一个细胞都遵循完全一样的生存定律;再进一步,把细胞之间的相互影响只限制在最靠近该细胞的8个邻居中。也就是说,每个细胞迭代后的状态由该细胞及周围8个细胞状态所决定。作了这些限制后,仍然还有很多方法来规定“生存定律”的具体细节。例如,在康威的生命游戏中,规定了如下生存定律。
  • (1)当前细胞为死亡状态时,当周围有3个存活细胞时,则迭代后该细胞变成存活状态(模拟繁殖);若原先为生,则保持不变。
  • (2)当前细胞为存活状态时,当周围的邻居细胞低于两个(不包含两个)存活时,该细胞变成死亡状态(模拟生命数量稀少)。
  • (3)当前细胞为存活状态时,当周围有两个或3个存活细胞时,该细胞保持原样。
  • (4)当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态(模拟生命数量过多)。
二、使用步骤 1.引入库

代码如下(声明):

#include //easyX 

#include 
#pragma comment(lib,"winmm.lib")

//每个正方形格子大小
#define SPACE   10

#define  ROWS    80
#define  COLS    80
//是否继续设置地图
bool isContinueSet;

//绘制一个矩形
void drawRect(int x, int y, int flag);
//绘制整个窗口
void drawMap(int map[ROWS][COLS]);

//循环不断获取鼠标信息并根据鼠标信息设置map
void getAndSet(int map[ROWS][COLS]);

//细胞周期变化
void lifeWeek(int map[ROWS][COLS]);
//获取周围存活数量
int getRoundAlive(int map[ROWS][COLS],int i,int j);
2.主函数

代码如下(主函数):

int main(){
	isContinueSet = true;
	//1 做窗口
	initgraph(COLS*SPACE, SPACE*ROWS);

	int map[ROWS][COLS] = { 0 };//表示细胞

	//map[1][3] = 1;
	CreateThread(NULL, NULL,
		(LPTHREAD_START_ROUTINE)getAndSet,//函数名
		(LPVOID)map,//实参
		NULL, NULL);
	while (isContinueSet){
		drawMap(map);
		Sleep(10);//停顿百分之一秒
	}
	settextcolor(RED);
	outtextxy(400, 500, "开始演示");

	mciSendString("open 1.mp3.mp3", NULL, NULL, NULL);
	mciSendString("play 1.mp3.mp3 repeat", NULL, NULL, NULL);
	//循环播放 repeat

	

	while (1){//循环演化
		//求出来每个细胞周围存活数量
		//然后判断 设置
		lifeWeek(map);
		//显示
		drawMap(map);
		Sleep(10);//停顿百分之一秒
	}


	while (1);
	return 0;
}
3.函数调用
//获取周围存活数量
int getRoundAlive(int map[ROWS][COLS], int i, int j){
	int num = 0;
	if (i > 0 && j > 0 && map[i - 1][j - 1]) num++;
	if (i > 0 && map[i - 1][j]) num++;
	if (i > 0 && j  0 && map[i][j - 1]) num++;
	if (j < COLS - 1 && map[i][j + 1]) num++;
	if (i < ROWS - 1 && j > 0 && map[i + 1][j - 1]) num++;
	if (i < ROWS - 1 && map[i + 1][j]) num++;
	if (i < ROWS - 1 && j < COLS - 1 && map[i + 1][j + 1]) num++;

	return num;
}
//细胞周期变化
void lifeWeek(int map[ROWS][COLS]){
	//准备临时数组 用来存储一次周期map数组周围的存活情况
	int temp[ROWS][COLS] = { 0 };
	int num;
	for (int i = 0; i < ROWS; i++){
		for (int j = 0; j < COLS; j++){
			num = getRoundAlive(map, i, j);
			if (3 == num){//如果细胞周围有3个存活的细胞   
				temp[i][j] = 1;//存活
			}
			else if (2 == num){//如果细胞周围有2个存活的细胞   
				temp[i][j] = map[i][j];//维持不变
			}
			else{//如果是其他情况			    
				temp[i][j] = 0;//不存活
			}
		}
	}
	
	//临时数组拷贝到map
#if 0
	for (int i = 0; i < ROWS; i++){
		for (int j = 0; j < COLS; j++){
			map[i][j] = temp[i][j];
		}
	}
#else
	memcpy(map, temp, sizeof(int)*ROWS*COLS);
#endif
}

//循环不断获取鼠标信息并根据鼠标信息设置map
void getAndSet(int map[ROWS][COLS]){
	MOUSEMSG msg; 
	while (isContinueSet){
		//获取鼠标信息
		msg = GetMouseMsg();
		//根据鼠标信息设置map
		if (msg.mkLButton){//鼠标左键按下 设置为存活
			if ((ROWS - 1) == (msg.y / SPACE) &&
				(COLS - 1) == (msg.x / SPACE)){//点击右下角那个点
				isContinueSet = false;
			}
			map[msg.y / SPACE][msg.x / SPACE] = 1;
		}
		else{//鼠标左键松开 设置为不存活
			map[msg.y / SPACE][msg.x / SPACE] = 0;
		}
	}
}

//绘制整个窗口
void drawMap(int map[ROWS][COLS]){
	for (int i = 0; i < ROWS; i++){
		for (int j = 0; j < COLS; j++){
			drawRect(j, i, map[i][j]);
		}
	}
}

void drawRect(int x, int y, int flag){
	setcolor(RGB(167, 167, 167));//边框是灰色

	if (flag){//为1  设置存活
		setfillcolor(WHITE);
	}
	else{
		setfillcolor(BLACK);
	}

	fillrectangle(x*SPACE, y*SPACE,
		x*SPACE + SPACE, y*SPACE + SPACE);
}

总结

提示:这里对文章进行总结:

可以把最初的细胞结构定义为种子,当所有种子细胞按以上规则处理后,可以得到第1代细胞图。按规则继续处理当前的细胞图,可以得到下一代的细胞图,周而复始。上面的生存定律当然可以任意改动,发明出不同的“生命游戏”。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/937889.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号