运用C++类的功能编写康威生命游戏代码 规则: 每个细胞处于两种可能状态中的一种,活的或死的 每个细胞与它的8个邻居相互作用: 1. 任何活细胞如果邻居少于两个就会死亡。 2. 任何一个活的细胞,只要有两到三个活的邻居,就会延续到下一代。 3.任何有三个以上邻居的活细胞都会死到下一代。 4. 任何一个死去的细胞只要有恰好三个活着的邻居,就会成为一个活细胞,延续到下一代。 要求:1.用户能够自定义创建网格大小 2.用户可以在命令行中通过鼠标点击网格的方式自定义细胞的初始状态 3.用户可以随时暂停和恢复游戏的进程4.用黑白方块代表细胞的状态
时间: 2024-03-18 22:41:09 浏览: 61
leetcode_289. 生命游戏
以下是使用C++类的方式实现康威生命游戏的代码:
```c++
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <conio.h>
#include <windows.h>
using namespace std;
class LifeGame {
public:
LifeGame(int width, int height) : width_(width), height_(height) {
// 初始化网格
grid_.resize(width_);
for (int i = 0; i < width_; ++i) {
grid_[i].resize(height_);
for (int j = 0; j < height_; ++j) {
grid_[i][j] = false;
}
}
}
void Run() {
// 随机生成初始状态
srand((unsigned)time(NULL));
for (int i = 0; i < width_; ++i) {
for (int j = 0; j < height_; ++j) {
grid_[i][j] = rand() % 2 == 0;
}
}
// 开始游戏
while (true) {
system("cls");
Display();
if (_kbhit()) {
// 暂停游戏
char c = _getch();
if (c == ' ') {
_getch();
}
}
else {
// 更新状态
Update();
Sleep(100);
}
}
}
void SetCell(int x, int y, bool value) {
grid_[x][y] = value;
}
private:
void Display() {
for (int i = 0; i < width_; ++i) {
for (int j = 0; j < height_; ++j) {
if (grid_[i][j]) {
cout << "■ ";
}
else {
cout << "□ ";
}
}
cout << endl;
}
}
void Update() {
vector<vector<bool>> new_grid = grid_;
for (int i = 0; i < width_; ++i) {
for (int j = 0; j < height_; ++j) {
int alive_count = 0;
// 统计周围活细胞的数量
for (int x = -1; x <= 1; ++x) {
for (int y = -1; y <= 1; ++y) {
if (x == 0 && y == 0) {
continue;
}
int nx = i + x;
int ny = j + y;
if (nx >= 0 && nx < width_ && ny >= 0 && ny < height_) {
if (grid_[nx][ny]) {
++alive_count;
}
}
}
}
// 根据规则更新状态
if (grid_[i][j]) {
if (alive_count < 2 || alive_count > 3) {
new_grid[i][j] = false;
}
}
else {
if (alive_count == 3) {
new_grid[i][j] = true;
}
}
}
}
grid_ = new_grid;
}
private:
int width_;
int height_;
vector<vector<bool>> grid_;
};
int main() {
int width, height;
cout << "请输入网格的宽度和高度(用空格分隔):";
cin >> width >> height;
LifeGame game(width, height);
cout << "请用鼠标点击网格设置细胞的初始状态,左键为生,右键为死。" << endl;
while (true) {
system("cls");
game.SetCell(0, 0, false); // 用一个假的SetCell来刷新显示
game.Display();
if (_kbhit()) {
// 等待用户确认
break;
}
else {
Sleep(100);
}
}
game.Run();
return 0;
}
```
说明:
1. `LifeGame` 类表示游戏,构造函数接收网格的宽度和高度,通过 `grid_` 存储网格的状态。
2. `Run` 方法开始游戏,随机生成初始状态,然后不断更新状态并显示。
3. `SetCell` 方法用于设置网格中某个细胞的状态。
4. `Display` 方法用于在命令行中显示网格的状态。
5. `Update` 方法用于根据规则更新网格的状态。
6. `main` 函数中先让用户输入网格的宽度和高度,然后通过 `LifeGame` 类创建游戏对象,接着在命令行中显示网格并等待用户用鼠标设置初始状态,最后调用 `Run` 方法开始游戏。
阅读全文