用c++写生命游戏,定义类cell,每个cell负责计算下一代的步数。并且细胞显示其状态
时间: 2024-03-18 21:39:05 浏览: 51
C语言做的细胞生命游戏
4星 · 用户满意度95%
好的,我可以为您解答这个问题。
首先,我们需要了解生命游戏的规则。生命游戏是由英国数学家约翰·何顿·康威在1970年发明的。它是一个零玩家游戏,由一个二维的网格组成,每个格子被称为一个“细胞”。每个细胞有两种状态:存活和死亡。每个细胞的状态由其周围8个细胞的状态决定。
根据生命游戏的规则,我们可以定义一个 Cell 类,来计算下一代的步数,并显示细胞的状态。下面是一个基本的 Cell 类的定义:
```c++
class Cell {
public:
Cell(bool state = false) : m_state(state) {}
bool getState() const { return m_state; }
void setState(bool state) { m_state = state; }
int countNeighbours(const std::vector<std::vector<Cell>>& grid, int x, int y) const {
int count = 0;
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
if (i == 0 && j == 0) continue;
int row = (x + i + grid.size()) % grid.size();
int col = (y + j + grid[0].size()) % grid[0].size();
count += grid[row][col].getState() ? 1 : 0;
}
}
return count;
}
bool nextState(const std::vector<std::vector<Cell>>& grid, int x, int y) const {
int count = countNeighbours(grid, x, y);
if (m_state) {
return count == 2 || count == 3;
} else {
return count == 3;
}
}
void display() const {
std::cout << (m_state ? "O" : " ");
}
private:
bool m_state;
};
```
在上面的代码中,我们定义了一个 Cell 类,它有一个 bool 类型的成员变量 m_state,表示细胞的状态。我们还定义了一个构造函数,可以设置细胞的初始状态。countNeighbours() 函数用来计算细胞周围的存活细胞数量。nextState() 函数用来计算细胞的下一个状态。最后,display() 函数用来显示细胞的状态。
接下来,我们可以定义一个 Grid 类,来表示整个生命游戏的网格。Grid 类中包含一个二维的 Cell 数组,以及一些用来更新和显示网格的函数。下面是一个基本的 Grid 类的定义:
```c++
class Grid {
public:
Grid(int rows, int cols) : m_rows(rows), m_cols(cols) {
m_grid.resize(rows, std::vector<Cell>(cols));
}
void update() {
std::vector<std::vector<Cell>> newGrid(m_rows, std::vector<Cell>(m_cols));
for (int i = 0; i < m_rows; i++) {
for (int j = 0; j < m_cols; j++) {
newGrid[i][j].setState(m_grid[i][j].nextState(m_grid, i, j));
}
}
m_grid = newGrid;
}
void display() const {
for (int i = 0; i < m_rows; i++) {
for (int j = 0; j < m_cols; j++) {
m_grid[i][j].display();
std::cout << " ";
}
std::cout << std::endl;
}
}
void setCell(int row, int col, bool state) {
m_grid[row][col].setState(state);
}
private:
int m_rows;
int m_cols;
std::vector<std::vector<Cell>> m_grid;
};
```
在上面的代码中,我们定义了一个 Grid 类,它包含一个二维的 Cell 数组 m_grid,以及网格的行数和列数 m_rows 和 m_cols。Grid 类中包含了 update() 函数,用来更新整个网格的状态;display() 函数,用来显示整个网格的状态;setCell() 函数,用来设置某个细胞的状态。
现在,我们可以使用 Cell 和 Grid 类来实现生命游戏。下面是一个示例代码:
```c++
int main() {
Grid grid(10, 10);
grid.setCell(4, 5, true);
grid.setCell(5, 6, true);
grid.setCell(6, 4, true);
grid.setCell(6, 5, true);
grid.setCell(6, 6, true);
for (int i = 0; i < 10; i++) {
system("cls");
grid.display();
grid.update();
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
return 0;
}
```
在上面的代码中,我们创建了一个 10x10 的网格,并设置了一些细胞的初始状态。然后,我们使用一个 for 循环来更新和显示网格的状态,每次更新后等待 500 毫秒。
希望这个示例代码可以帮助您理解如何使用 Cell 和 Grid 类来实现生命游戏。如果您有任何问题或疑问,请随时向我提问。
阅读全文