运用C++类的功能编写康威生命游戏代码 规则: 每个细胞处于两种可能状态中的一种,活的或死的 每个细胞与它的8个邻居相互作用: 1. 任何活细胞如果邻居少于两个就会死亡。 2. 任何一个活的细胞,只要有两到三个活的邻居,就会延续到下一代。 3.任何有三个以上邻居的活细胞都会死到下一代。 4. 任何一个死去的细胞只要有恰好三个活着的邻居,就会成为一个活细胞,延续到下一代。 要求:1.用户能够自定义创建网格大小 2.用户可以随时暂停和恢复游戏的进程3.用黑白方块代表细胞的状态4.用户可以随时退出游戏界面
时间: 2024-03-18 19:42:04 浏览: 30
下面是C++类实现康威生命游戏的代码:
```
#include <iostream>
#include <vector>
#include <cstdlib> // 用于随机数生成
#include <ctime> // 用于时间戳生成
using namespace std;
class LifeGame {
public:
LifeGame(int rows, int cols); // 构造函数
void show(); // 显示当前状态
void next(); // 计算下一代状态
void pause(); // 暂停
void resume(); // 恢复
void quit(); // 退出
private:
int ROWS, COLS; // 网格大小
vector<vector<int>> grid; // 状态矩阵
bool stopped; // 是否暂停
void init(); // 初始化状态矩阵
int countNeighbors(int i, int j); // 计算(i,j)周围的活细胞数
};
LifeGame::LifeGame(int rows, int cols) {
ROWS = rows;
COLS = cols;
stopped = false;
init();
}
void LifeGame::show() {
system("clear"); // 清屏
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
if (grid[i][j] == 0)
cout << "◻️ "; // 空格表示死细胞
else
cout << "◼️ "; // 实心方块表示活细胞
}
cout << endl;
}
}
void LifeGame::next() {
vector<vector<int>> newGrid(ROWS, vector<int>(COLS, 0)); // 新的状态矩阵
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
int neighbors = countNeighbors(i, j); // 计算(i,j)周围的活细胞数
if (grid[i][j] == 1) { // 当前是活细胞
if (neighbors < 2 || neighbors > 3) // 规则1和3
newGrid[i][j] = 0; // 变为死细胞
else // 规则2
newGrid[i][j] = 1; // 继续活着
} else { // 当前是死细胞
if (neighbors == 3) // 规则4
newGrid[i][j] = 1; // 成为活细胞
else
newGrid[i][j] = 0; // 仍是死细胞
}
}
}
grid = newGrid; // 更新状态矩阵
}
void LifeGame::pause() {
stopped = true;
}
void LifeGame::resume() {
stopped = false;
}
void LifeGame::quit() {
exit(0); // 直接退出程序
}
void LifeGame::init() {
srand(time(NULL)); // 随机数种子
grid = vector<vector<int>>(ROWS, vector<int>(COLS, 0)); // 初始化状态矩阵
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
grid[i][j] = rand() % 2; // 随机生成0或1
}
}
}
int LifeGame::countNeighbors(int i, int j) {
int count = 0;
for (int di = -1; di <= 1; di++) {
for (int dj = -1; dj <= 1; dj++) {
if (di == 0 && dj == 0) // 不计算自己
continue;
int ni = (i + di + ROWS) % ROWS; // 处理边界
int nj = (j + dj + COLS) % COLS;
if (grid[ni][nj] == 1) // 统计活细胞数
count++;
}
}
return count;
}
int main() {
int rows, cols;
cout << "请输入网格行数和列数:";
cin >> rows >> cols;
LifeGame game(rows, cols); // 创建游戏
while (true) {
game.show(); // 显示当前状态
if (!game.stopped)
game.next(); // 计算下一代状态
char c;
cout << "请输入操作(p:暂停;r:恢复;q:退出):";
cin >> c;
if (c == 'p')
game.pause(); // 暂停
else if (c == 'r')
game.resume(); // 恢复
else if (c == 'q')
game.quit(); // 退出
}
return 0;
}
```
代码中用黑色实心方块表示活细胞,用白色空格表示死细胞。用户可以输入行数和列数来自定义创建游戏,输入p键暂停游戏,输入r键恢复游戏,输入q键退出游戏。
阅读全文