C++康威生命游戏代码(改版)(会自动运行)

main.cpp

#include "life.h"
#include "utility.h"
#include <unistd.h>

int main() // 主程序:运行康威生命游戏
/*Pre: 用户提供一个初始的生命细胞配置。
  Post: 程序按照生命游戏规则打印出一系列显示生命细胞配置变化的图像。
  使用:Life 类及其方法 initialize(), 2 print(), 和 update()。
		函数 instructio1ns(); user_says_yes()。*/
{
	Life configuration;			// 创建一个 Life 类的对象,用于存储和更新生命游戏状态
	instructions();				// 输出游戏使用说明
	configuration.initialize();		// 初始化生命游戏的起始状态
	cout << "count = " << configuration.neighbor_count(2, 3) << endl; // 示例性调用 neighbor_count 方法,并打印某个位置周围活细胞的数量
	configuration.print();		// 打印当前生命游戏状态
	cout << "Continue viewing new generations? " << endl;
	while (1) // 当用户希望继续查看时,循环执行以下操作
	{
		configuration.update(); // 根据生命游戏规则计算并更新到下一个世代
		system ("cls");
		configuration.print();	// 打印更新后的新一代生命游戏状态
		usleep(20000);
	}

	return 0; // 主程序正常结束,返回值为0
}

life.h

// 定义游戏区域最大尺寸,这里是行数和列数
const int maxrow = 20, maxcol = 60; // 游戏格子的维度

// 定义生命游戏(Conway's Game of Life)类
class Life {
public:
    // 初始化方法,用于设置初始细胞状态
    void initialize();

    // 打印当前游戏状态的方法,显示整个网格
    void print();

    // 更新方法,根据游戏规则计算下一代细胞的状态
    void update();    

    // 使用二维数组存储游戏网格,并额外增加两行两列以简化边界条件处理
    int grid[maxrow + 2][maxcol + 2]; 

    // 计算给定位置 (row, col) 的邻居细胞存活数量的方法
    int neighbor_count(int row, int col);
};

// 结束某些预处理器条件或标志着某个阶段完成的宏定义
#define DONE

// 包含实现上述接口的具体代码
#include "life.cpp"

life.cpp

#include <iostream>
#include <istream>
using namespace std;

#ifdef DONE

// 初始化方法:清零整个游戏区域,并让用户输入活细胞坐标,构建初始生命配置
void Life::initialize()
/*Pre: 无预条件
  Post: Life对象包含用户指定的生命配置*/
{
	int row, col;
	for (row = 0; row <= maxrow + 1; row++)
		for (col = 0; col <= maxcol + 1; col++)
			grid[row][col] = 0; // 将所有格子初始化为死状态

	cout << "List the coordinates for living cells." << endl;
	cout << "Terminate the list with the special pair -1 -1" << endl;
	cin >> row >> col;
	while (row != -1 || col != -1)
	{
		if (row >= 1 && row <= maxrow)
			if (col >= 1 && col <= maxcol)
				grid[row][col] = 1; // 根据有效坐标设置活细胞
			else
				cout << "Column " << col << " is out of range." << endl;
		else
			cout << "Row " << row << " is out of range." << endl;
		cin >> row >> col; // 继续读取下一个坐标对
	}
}

// 打印当前生命游戏配置的方法
void Life::print()
/*Pre: Life对象已包含一个生命配置
  Post: 用户可以看到该配置信息*/
{
	int row, col;
	cout << "\nThe current Life configuration is:" << endl;
	for (row = 1; row <= maxrow; row++)
	{
		for (col = 1; col <= maxcol; col++)
			if (grid[row][col] == 1)
				cout << '*'; // 输出活细胞用星号表示
			else
				cout << ' '; // 死细胞用空格表示
		cout << endl;		 // 换行准备输出下一行
	}
	cout << endl; // 输出结束后的额外换行
}

// 更新方法:根据康威生命游戏规则计算并生成下一世代的生命配置
void Life::update()
/*Pre: Life对象已包含一个生命配置
  Post: Life对象现在包含基于原有配置计算出的新一代生命配置*/
{
	int row, col;
	int new_grid[maxrow + 2][maxcol + 2]; // 创建一个新的临时网格用于存放下一代状态

	// 遍历每一个细胞,根据邻居数量决定新状态
	for (row = 1; row <= maxrow; row++)
		for (col = 1; col <= maxcol; col++)
			switch (neighbor_count(row, col))
			{
			case 2:
				new_grid[row][col] = grid[row][col]; // 当前状态保持不变
				break;
			case 3:
				new_grid[row][col] = 1; // 符合"生死准则"的细胞变为活细胞
				break;
			default:
				new_grid[row][col] = 0; // 其他情况,细胞变为死细胞
			}

	// 将临时网格中的新状态复制回原网格中,完成更新过程
	for (row = 1; row <= maxrow; row++)
		for (col = 1; col <= maxcol; col++)
			grid[row][col] = new_grid[row][col];
}

// 生命游戏类 Life 的成员函数,计算给定位置周围活细胞数量的方法
int Life::neighbor_count(int row, int col)
{
	// 检查输入坐标是否在有效范围内(假设网格从1开始计数)
	if (row < 1 || row > maxrow || col < 1 || col > maxcol)
		return 0; // 如果坐标无效,则返回0表示没有活细胞邻居

	int count = 0;							 // 初始化活细胞计数器为0
	for (int i = row - 1; i <= row + 1; ++i) // 遍历以给定行为中心的3行
	{
		for (int j = col - 1; j <= col + 1; ++j) // 遍历以给定列为中心的3列
		{
			// 跳过当前格子自身(不计入邻居)
			if (i == row && j == col)
				continue;

			// 检查所考虑的单元格是否在有效范围内并存活
			if (i >= 1 && i <= maxrow && j >= 1 && j <= maxcol && grid[i][j] == 1)
				++count; // 若存活,则增加计数器
		}
	}

	return count; // 返回活细胞邻居的数量
}

#endif

utility.h

void instructions();
bool user_says_yes();

#define DONE
#include "utility.cpp"
//想不到吧!!!

utility.cpp

#include <iostream>
#include <istream>
using namespace std;

#ifdef DONE

// 函数:打印游戏使用说明
void instructions()
/*Pre: 无预条件.
  Post: 已经打印了使用生命游戏的说明。*/
{
	cout << "Welcome to Conway's game of Life." << endl;
	cout << "This game uses a grid of size " << maxrow << " by " << maxcol << " in which " << endl;
	cout << "each cell can either be occupied by an organism or not." << endl;
	cout << "The occupied cells change from generation to generation" << endl;
	cout << "according to the number of neighboring cells which are alive." << endl;
}

// 函数:获取用户确认(yes/no)的回答,并返回布尔值表示结果
bool user_says_yes()
{
	int c;
	bool initial_response = true; // 标记是否是首次提示

	do
	{ // 循环直到获得有效输入为止
		if (initial_response)
			cout << " (y,n)? " << flush; // 首次提示信息
		else
			cout << "Respond with either y or n: " << flush; // 非首次提示信息
		do
		{ // 忽略空白字符并等待用户输入
			c = cin.get();
		} while (c == '\n' || c == ' ' || c == '\t'); // 检查换行符、空格和制表符
		initial_response = false;
	} while (c != 'y' && c != 'Y' && c != 'n' && c != 'N'); // 循环直至用户输入 y, Y, n 或 N
	return (c == 'y' || c == 'Y');							// 如果用户输入的是 y 或 Y,则返回 true,否则返回 false
}
#endif

 请一位恩人不要介意我抄代码的迹象,已改main.cpp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值