利用ege图形库实现《生命游戏》迭代过程(数组写),带背景音乐,附文件下载地址。

1.摘要:

人工生命研究中有一种被称作“生命游戏”的小游戏,这种游戏相当简单。假设有一个象棋盘一样的方格网,每个方格中放置一个生命细胞,生命细胞只有两种状态:“生”或者“死”游戏规则如下:
(1)如果一个细胞周围有3个细胞为生(一个细胞周围总共有8个细胞)则该细胞为生,即若原先为死则转为生,若原先为生则保持不变;
(2)如果一个细胞周围有2个细胞为生,则该细胞的生死状态不变;
(3)在其他情况下,该细胞为死,即该细胞若原先为生,则转为死,若原先为死则保持不变。

2.ege库函数:

注:在微软的vs上最容易配置,作者的ege库函数就是在vs上配置,其他环境配置代码通用

如何配置:https://blog.csdn.net/HuachengGJ/article/details/79183790

3.功能实现

(1)头文件使用

#include "stdafx.h"
#include<graphics.h>
#include<conio.h>
#include <windows.h>
#include <time.h>
#include<mmsystem.h>  //里面包含PlaySound()函数(播放音乐)
#pragma comment(lib, "winmm.lib")//PlaySound是Windows用于播放音乐的API函数(方法)。

(2)使用的宏定义以及一些函数:

#define High 100   //数组大小
#define Width 100
#define Hight 10*High  //画面大小
#define Widths 10*Width
// 全局变量
int cells[High][Width]; // 所有位置细胞生1或死0
void my_playsoundbk();//播放开头音乐
void my_playsound();//播放游戏中音乐
void gotoxy(int x, int y);//清屏函数,时间比system(“pause”)短
void startup();//初始化
void show();//展示
void updateInput();//更新下一次的细胞状态
int Input_yonghu();//用户输入迭代次数

(3)清屏函数:(网上都有这种,比system(“cls“)要快,也可以用cleardevice()

void gotoxy(int x, int y)//类似于清屏函数
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle, pos);
}

(4)细胞数组初始化(我默认的是最外面一圈刚开始全活,动的时候,最外面一圈不动)

void startup() // 数据初始化
{
	int i, j;
	for (i = 0; i <High; i++) { // 初始化

		cells[i][0] = 1;
		cells[i][Width - 1] = 1;
		for (j = 0; j <Width; j++)
		{
			cells[0][j] = 1;
			cells[High - 1][j] = 1;
		}
	}
}

(5)细胞更新状态(根据游戏规则)

注:要将每一个细胞更新后的状态放进新数组

void updateInput()  // 细胞更新
{
	int NewCells[High][Width]; // 下一帧的细胞情况
	int NeibourNumber; //统计邻居的个数
	int i, j;
	for (i = 1; i < High - 1; i++)
	{
		for (j = 1; j < Width - 1; j++)
		{
			NeibourNumber = cells[i - 1][j - 1] + cells[i - 1][j] + cells[i - 1][j + 1]
				+ cells[i][j - 1] + cells[i][j + 1] + cells[i + 1][j - 1] + cells[i + 1][j] + cells[i + 1][j + 1];
			if (NeibourNumber == 3)
				NewCells[i][j] = 1;
			else if (NeibourNumber == 2)
				NewCells[i][j] = cells[i][j];
			else
				NewCells[i][j] = 0;
		}
	}

	for (i = 1; i < High - 1; i++)
		for (j = 1; j < Width - 1; j++)
			cells[i][j] = NewCells[i][j];
}

(6)细胞状态显示

void show()  // 显示画面
{
	gotoxy(0, 0);  // 清屏
	int i, j;
	for (i = 0; i < High; i++)
	{
		for (j = 0; j <Width; j++)
		{
			if (cells[i][j] == 1) {
				setfillcolor(RED);
				fillrectangle(10 * i, 10 * j, 10 * (i + 1), 10 * (j + 1));
			}
			else
			{
				setfillcolor(0x55FFFF);
				fillrectangle(10 * i, 10 * j, 10 * (i + 1), 10 * (j + 1));
			}
		}
	}
	Sleep(00);
}

(7)音乐播放函数

//开头音乐
void my_playsoundbk() {
	PlaySound(TEXT("back.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
}
//细胞变化过程中音乐
void my_playsound() {
	PlaySound(TEXT("cell.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//一遍遍地播放,直到结束
}

(8)用户可控制迭代次数(输入制定代数)

int Input_yonghu() {
	
	char s[10];//提示用户输入迭代次数
	InputBox(s, 10, _T("请输入您想实现迭代次数:"), _T("生命游戏演示"));

	// 将用户输入转换为数字
	int r;
	sscanf(s, "%d", &r);
	return r;
}

4.完整代码

#include "stdafx.h"
#include<graphics.h>
#include<conio.h>
#include <windows.h>
#include <time.h>
#include<mmsystem.h>  //里面包含PlaySound()函数
#pragma comment(lib, "winmm.lib")//PlaySound是Windows用于播放音乐的API函数(方法)。
#define High 100   //数组大小
#define Width 100
#define Hight 10*High  //画面大小
#define Widths 10*Width
// 全局变量
int cells[High][Width]; // 所有位置细胞生1或死0
void my_playsoundbk();//播放开头音乐
void my_playsound();//播放游戏中音乐
void gotoxy(int x, int y);//清屏函数,时间比system(“pause”)短
void startup();//初始化
void show();//展示
void updateInput();//更新下一次的细胞状态
int Input_yonghu();//用户输入迭代次数
int main()
{
	initgraph(Hight, Widths);//建立画布
	my_playsoundbk();//片头音乐
	int r = Input_yonghu();//提示用户输入迭代次数
	my_playsound();//播放音乐
	startup();  // 数据初始化	
	int i = 0;//限定迭代次数
	while (i <= r) //  游戏循环执行
	{
		show();  // 显示画面
		updateInput();  //细胞更新
		i++;
	}
	_getch();
	closegraph();//退出画布
}
void gotoxy(int x, int y)//类似于清屏函数
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle, pos);
}
void startup() // 数据初始化
{
	int i, j;
	for (i = 0; i <High; i++) { // 初始化

		cells[i][0] = 1;
		cells[i][Width - 1] = 1;
		for (j = 0; j <Width; j++)
		{
			cells[0][j] = 1;
			cells[High - 1][j] = 1;
		}
	}
}
void updateInput()  // 细胞更新
{
	int NewCells[High][Width]; // 下一帧的细胞情况
	int NeibourNumber; //统计邻居的个数
	int i, j;
	for (i = 1; i < High - 1; i++)
	{
		for (j = 1; j < Width - 1; j++)
		{
			NeibourNumber = cells[i - 1][j - 1] + cells[i - 1][j] + cells[i - 1][j + 1]
				+ cells[i][j - 1] + cells[i][j + 1] + cells[i + 1][j - 1] + cells[i + 1][j] + cells[i + 1][j + 1];
			if (NeibourNumber == 3)
				NewCells[i][j] = 1;
			else if (NeibourNumber == 2)
				NewCells[i][j] = cells[i][j];
			else
				NewCells[i][j] = 0;
		}
	}

	for (i = 1; i < High - 1; i++)
		for (j = 1; j < Width - 1; j++)
			cells[i][j] = NewCells[i][j];
}
void show()  // 显示画面
{
	gotoxy(0, 0);  // 清屏
	int i, j;
	for (i = 0; i < High; i++)
	{
		for (j = 0; j <Width; j++)
		{
			if (cells[i][j] == 1) {
				setfillcolor(RED);
				fillrectangle(10 * i, 10 * j, 10 * (i + 1), 10 * (j + 1));
			}
			else
			{
				setfillcolor(0x55FFFF);
				fillrectangle(10 * i, 10 * j, 10 * (i + 1), 10 * (j + 1));
			}
		}
	}
	Sleep(00);
}
void my_playsoundbk() {
	PlaySound(TEXT("back.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
}
void my_playsound() {
	PlaySound(TEXT("cell.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//一遍遍地播放,直到结束
}
int Input_yonghu() {
	
	char s[10];//提示用户输入迭代次数
	InputBox(s, 10, _T("请输入您想实现迭代次数:"), _T("生命游戏演示"));

	// 将用户输入转换为数字
	int r;
	sscanf(s, "%d", &r);
	return r;
}

5.实现过程中出现的一些错误或者提示,请自行百度。附上下载地址

https://download.csdn.net/download/qq_27148893/10553191

版权声明:本文为博主原创文章,如若转载,请说明出处。

猜你喜欢

转载自blog.csdn.net/qq_27148893/article/details/81128005