运用C++类的功能编写康威生命游戏代码 规则: 每个细胞处于两种可能状态中的一种,活的或死的 每个细胞与它的8个邻居相互作用: 1. 任何活细胞如果邻居少于两个就会死亡。 2. 任何一个活的细胞,只要有两到三个活的邻居,就会延续到下一代。 3.任何有三个以上邻居的活细胞都会死到下一代。 4. 任何一个死去的细胞只要有恰好三个活着的邻居,就会成为一个活细胞,延续到下一代。 要求: 1.用户能够自定义创建网格大小 2.用户可以随时暂停和恢复游戏的进程 3.用黑白方块代表细胞的状态 4.用户可以在演化过程中更改细胞的状态
时间: 2024-03-21 14:38:24 浏览: 62
以下是使用C++类实现康威生命游戏的代码:
```c++
#include <iostream>
#include <windows.h>
using namespace std;
class GameOfLife {
private:
int numRows; // 网格的行数
int numCols; // 网格的列数
bool **grid; // 存储网格状态的二维数组
bool **nextGrid; // 存储下一代网格状态的二维数组
bool running; // 游戏是否在运行中
public:
GameOfLife(int rows, int cols) {
numRows = rows;
numCols = cols;
running = false;
// 动态分配内存
grid = new bool*[numRows];
nextGrid = new bool*[numRows];
for (int i = 0; i < numRows; i++) {
grid[i] = new bool[numCols];
nextGrid[i] = new bool[numCols];
}
// 初始化网格,将所有细胞状态设为死亡
for (int i = 0; i < numRows; i++) {
for (int j = 0; j < numCols; j++) {
grid[i][j] = false;
nextGrid[i][j] = false;
}
}
}
~GameOfLife() {
// 释放内存
for (int i = 0; i < numRows; i++) {
delete[] grid[i];
delete[] nextGrid[i];
}
delete[] grid;
delete[] nextGrid;
}
// 获取网格的行数和列数
int getNumRows() {
return numRows;
}
int getNumCols() {
return numCols;
}
// 获取指定位置细胞的状态
bool getCellState(int row, int col) {
return grid[row][col];
}
// 设置指定位置细胞的状态
void setCellState(int row, int col, bool state) {
grid[row][col] = state;
}
// 运行游戏
void run() {
running = true;
while (running) {
// 清空控制台
system("cls");
// 输出网格状态
for (int i = 0; i < numRows; i++) {
for (int j = 0; j < numCols; j++) {
if (grid[i][j]) {
cout << "■ ";
} else {
cout << "□ ";
}
}
cout << endl;
}
// 计算下一代网格状态
for (int i = 0; i < numRows; i++) {
for (int j = 0; j < numCols; j++) {
int numNeighbors = countNeighbors(i, j);
if (grid[i][j]) {
if (numNeighbors < 2 || numNeighbors > 3) {
nextGrid[i][j] = false; // 细胞死亡
} else {
nextGrid[i][j] = true; // 细胞存活
}
} else {
if (numNeighbors == 3) {
nextGrid[i][j] = true; // 细胞复活
} else {
nextGrid[i][j] = false; // 细胞仍然死亡
}
}
}
}
// 将下一代网格状态复制到当前网格状态
for (int i = 0; i < numRows; i++) {
for (int j = 0; j < numCols; j++) {
grid[i][j] = nextGrid[i][j];
}
}
// 等待一段时间,使得游戏演化的速度适中
Sleep(500);
}
}
// 暂停游戏
void pause() {
running = false;
}
private:
// 计算指定位置细胞周围活细胞的数量
int countNeighbors(int row, int col) {
int count = 0;
for (int i = row - 1; i <= row + 1; i++) {
for (int j = col - 1; j <= col + 1; j++) {
if (i >= 0 && i < numRows && j >= 0 && j < numCols) {
if (i != row || j != col) {
if (grid[i][j]) {
count++;
}
}
}
}
}
return count;
}
};
int main() {
int numRows, numCols;
cout << "请输入网格的行数和列数:" << endl;
cin >> numRows >> numCols;
GameOfLife game(numRows, numCols);
// 设置初始细胞状态
cout << "请设置初始细胞状态,用数字 1 表示活细胞,用数字 0 表示死细胞:" << endl;
for (int i = 0; i < numRows; i++) {
for (int j = 0; j < numCols; j++) {
int state;
cin >> state;
game.setCellState(i, j, state == 1);
}
}
// 运行游戏
cout << "游戏开始运行,按任意键暂停游戏。" << endl;
game.run();
// 暂停游戏
system("pause");
game.pause();
// 更改细胞状态
cout << "请输入要更改状态的细胞的位置和新状态,格式为“行 列 状态”:" << endl;
int row, col, state;
cin >> row >> col >> state;
game.setCellState(row, col, state == 1);
// 恢复游戏
cout << "按任意键恢复游戏。" << endl;
system("pause");
game.run();
return 0;
}
```
使用该代码,用户可以自定义网格的大小,并设置初始细胞状态。在游戏运行过程中,用户可以随时暂停和恢复游戏的进程,并更改细胞的状态。程序会在控制台上以黑白方块的形式展示细胞的状态,使得用户可以直观地观察到细胞的演化过程。
阅读全文