运用C++类的功能编写康威生命游戏代码 规则: 每个细胞处于两种可能状态中的一种,活的或死的 每个细胞与它的8个邻居相互作用: 1. 任何活细胞如果邻居少于两个就会死亡。 2. 任何一个活的细胞,只要有两到三个活的邻居,就会延续到下一代。 3.任何有三个以上邻居的活细胞都会死到下一代。 4. 任何一个死去的细胞只要有恰好三个活着的邻居,就会成为一个活细胞,延续到下一代。 要求:1.用户能够自定义创建网格大小 2.用户自定义细胞的初始状态 3.用户可以暂停和恢复仿真
时间: 2024-03-18 22:40:12 浏览: 78
在C++中实现生命游戏 (Game of Life) ,并 遵循一些限制 ·生命游戏的规则 一个无限的二维正交方格单元格网格
以下是用C++类实现康威生命游戏的代码:
```cpp
#include <iostream>
#include <vector>
#include <chrono>
#include <thread>
class LifeGame {
public:
LifeGame(int sizeX, int sizeY): sizeX_(sizeX), sizeY_(sizeY) {
grid_.resize(sizeX_);
for (int i = 0; i < sizeX_; i++) {
grid_[i].resize(sizeY_);
}
}
void init() {
for (int i = 0; i < sizeX_; i++) {
for (int j = 0; j < sizeY_; j++) {
grid_[i][j] = false;
}
}
}
void set(int x, int y, bool alive) {
grid_[x][y] = alive;
}
void print() {
for (int i = 0; i < sizeX_; i++) {
for (int j = 0; j < sizeY_; j++) {
std::cout << (grid_[i][j] ? "O" : ".");
}
std::cout << std::endl;
}
}
void update() {
std::vector<std::vector<bool>> newGrid(sizeX_);
for (int i = 0; i < sizeX_; i++) {
newGrid[i].resize(sizeY_);
}
for (int i = 0; i < sizeX_; i++) {
for (int j = 0; j < sizeY_; j++) {
int aliveNeighbors = countAliveNeighbors(i, j);
if (grid_[i][j]) {
if (aliveNeighbors < 2 || aliveNeighbors > 3) {
newGrid[i][j] = false;
} else {
newGrid[i][j] = true;
}
} else {
if (aliveNeighbors == 3) {
newGrid[i][j] = true;
} else {
newGrid[i][j] = false;
}
}
}
}
grid_ = newGrid;
}
private:
int sizeX_;
int sizeY_;
std::vector<std::vector<bool>> grid_;
int countAliveNeighbors(int x, int y) {
int count = 0;
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
if (i == 0 && j == 0) {
continue;
}
int neighborX = x + i;
int neighborY = y + j;
if (neighborX < 0 || neighborX >= sizeX_ || neighborY < 0 || neighborY >= sizeY_) {
continue;
}
if (grid_[neighborX][neighborY]) {
count++;
}
}
}
return count;
}
};
int main() {
int sizeX, sizeY;
std::cout << "Please enter the size of the grid:" << std::endl;
std::cin >> sizeX >> sizeY;
LifeGame game(sizeX, sizeY);
std::cout << "Please enter the initial state of the grid:" << std::endl;
for (int i = 0; i < sizeX; i++) {
for (int j = 0; j < sizeY; j++) {
char c;
std::cin >> c;
game.set(i, j, c == 'O');
}
}
while (true) {
game.print();
game.update();
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
return 0;
}
```
在上面的代码中,我们定义了一个名为 LifeGame 的类,该类包含一个网格和几种方法来操作它。我们使用二维布尔向量来表示网格中的每个单元格(活着或死了)。使用 init() 方法来初始化网格,使用 set() 方法来设置单元格的状态,使用 print() 方法来打印网格的当前状态,使用 update() 方法来更新网格到下一个时刻的状态。
在 main() 函数中,我们首先要求用户输入网格的大小和初始状态。然后,我们进入一个无限循环,在每个时刻中打印当前的网格状态并更新它。我们在每次更新后暂停 500 毫秒,以便我们可以看到网格状态的变化。
最后,我们可以使用以下命令来编译和运行程序:
```bash
$ g++ -std=c++11 -o life_game life_game.cpp
$ ./life_game
```
这将在控制台中启动康威生命游戏。
阅读全文