运用C++类的功能编写康威生命游戏代码 规则: 每个细胞处于两种可能状态中的一种,活的或死的 每个细胞与它的8个邻居相互作用: 1. 任何活细胞如果邻居少于两个就会死亡。 2. 任何一个活的细胞,只要有两到三个活的邻居,就会延续到下一代。 3.任何有三个以上邻居的活细胞都会死到下一代。 4. 任何一个死去的细胞只要有恰好三个活着的邻居,就会成为一个活细胞,延续到下一代。 要求: 1.用户能够自定义创建网格大小 2.用户可以随时暂停和恢复游戏的进程 3.用黑白方块代表细胞的状态 4.先进行随机演化之后在演化过程中可以改变细胞的状态
时间: 2024-03-21 10:38:36 浏览: 48
leetcode_289. 生命游戏
好的,我会尽力回答你的问题。
以下是使用 C++ 类编写康威生命游戏代码的示例:
```c++
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <chrono>
#include <thread>
class Grid {
private:
int rows;
int cols;
std::vector<std::vector<bool>> cells;
public:
Grid(int rows, int cols) : rows(rows), cols(cols), cells(rows, std::vector<bool>(cols, false)) {}
void randomize() {
std::srand(std::time(nullptr));
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cells[i][j] = std::rand() % 2;
}
}
}
void print() {
system("clear"); // 清除屏幕
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
std::cout << (cells[i][j] ? "■" : "□") << " ";
}
std::cout << std::endl;
}
}
void update() {
std::vector<std::vector<bool>> newCells(rows, std::vector<bool>(cols, false));
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
int neighbors = 0;
for (int m = -1; m <= 1; m++) {
for (int n = -1; n <= 1; n++) {
if (m == 0 && n == 0) continue;
int x = i + m;
int y = j + n;
if (x < 0 || x >= rows || y < 0 || y >= cols) continue;
if (cells[x][y]) neighbors++;
}
}
if (cells[i][j]) {
if (neighbors < 2 || neighbors > 3) newCells[i][j] = false; // 规则 1 和 3
else newCells[i][j] = true; // 规则 2
}
else {
if (neighbors == 3) newCells[i][j] = true; // 规则 4
}
}
}
cells = newCells;
}
};
int main() {
int rows, cols;
std::cout << "请输入网格的行数和列数:";
std::cin >> rows >> cols;
Grid grid(rows, cols);
grid.randomize();
grid.print();
bool paused = false;
while (true) {
if (!paused) {
grid.update();
grid.print();
}
std::cout << "请输入命令(p 暂停/恢复,c 更改细胞状态,q 退出):";
char cmd;
std::cin >> cmd;
if (cmd == 'p') paused = !paused;
else if (cmd == 'c') {
int x, y;
std::cout << "请输入细胞的坐标(行 列):";
std::cin >> x >> y;
grid.cells[x][y] = !grid.cells[x][y];
grid.print();
}
else if (cmd == 'q') break;
}
return 0;
}
```
在这个示例中,我们定义了一个名为 `Grid` 的类来表示康威生命游戏中的网格。这个类有三个私有成员变量:行数、列数和一个二维布尔型向量来表示每个细胞的状态。类中包含了三个公有成员函数,分别是:
- `randomize()`:随机生成初始状态。
- `print()`:将当前状态打印到控制台上。
- `update()`:根据康威生命游戏的规则更新状态。
`main()` 函数中,我们首先让用户输入网格的行数和列数,并创建一个 `Grid` 对象。然后,我们使用 `randomize()` 函数来随机生成初始状态,并使用 `print()` 函数将其打印到控制台上。
接下来,我们进入一个循环中。在每次循环中,如果游戏没有被暂停,我们就使用 `update()` 函数更新状态,并使用 `print()` 函数将其打印到控制台上。然后,我们等待用户输入命令,并根据命令执行相应的操作。如果用户输入了 `p`,我们就将游戏暂停或恢复。如果用户输入了 `c`,我们就让用户输入细胞的坐标,并将该细胞的状态取反。如果用户输入了 `q`,我们就退出循环,结束程序。
注意,在每次更新状态之前,我们使用 `system("clear")` 函数清除了控制台上的内容,以便于在同一位置打印新的状态。
希望这个示例能够帮助你编写出自己的康威生命游戏代码。如果你有任何问题或疑问,欢迎随时向我提出。
阅读全文