生命游戏使用C++类和对象以及easyx
时间: 2023-11-18 13:02:11 浏览: 68
以下是一个生命游戏的完整实现示例,使用了C++类和对象以及easyx图形库:
```cpp
#include <graphics.h>
#include <time.h>
const int WIDTH = 50; // 游戏界面宽度
const int HEIGHT = 50; // 游戏界面高度
const int CELL_SIZE = 10; // 细胞大小
const int DELAY = 100; // 每一帧的延迟时间(ms)
class Cell {
public:
Cell(int x, int y) {
m_x = x;
m_y = y;
m_alive = false;
}
void setAlive(bool alive) {
m_alive = alive;
}
bool isAlive() const {
return m_alive;
}
int getX() const {
return m_x;
}
int getY() const {
return m_y;
}
private:
bool m_alive;
int m_x, m_y;
};
class GameOfLife {
public:
GameOfLife() {
m_running = false;
init();
}
void init() {
srand(time(NULL));
for (int x = 0; x < WIDTH; x++) {
for (int y = 0; y < HEIGHT; y++) {
m_cells[x][y] = Cell(x, y);
if (rand() % 2 == 0) {
m_cells[x][y].setAlive(true);
}
}
}
}
void update() {
Cell next[WIDTH][HEIGHT];
for (int x = 0; x < WIDTH; x++) {
for (int y = 0; y < HEIGHT; y++) {
int aliveCount = 0;
for (int dx = -1; dx <= 1; dx++) {
for (int dy = -1; dy <= 1; dy++) {
if (dx == 0 && dy == 0) {
continue;
}
int nx = x + dx;
int ny = y + dy;
if (nx < 0 || nx >= WIDTH || ny < 0 || ny >= HEIGHT) {
continue;
}
if (m_cells[nx][ny].isAlive()) {
aliveCount++;
}
}
}
if (m_cells[x][y].isAlive()) {
if (aliveCount < 2 || aliveCount > 3) {
next[x][y].setAlive(false);
} else {
next[x][y].setAlive(true);
}
} else {
if (aliveCount == 3) {
next[x][y].setAlive(true);
} else {
next[x][y].setAlive(false);
}
}
}
}
for (int x = 0; x < WIDTH; x++) {
for (int y = 0; y < HEIGHT; y++) {
m_cells[x][y].setAlive(next[x][y].isAlive());
}
}
}
void draw() {
cleardevice();
for (int x = 0; x < WIDTH; x++) {
for (int y = 0; y < HEIGHT; y++) {
if (m_cells[x][y].isAlive()) {
setfillcolor(YELLOW);
fillrectangle(x * CELL_SIZE, y * CELL_SIZE, (x + 1) * CELL_SIZE, (y + 1) * CELL_SIZE);
}
}
}
flushbatch();
}
void start() {
m_running = true;
while (m_running) {
update();
draw();
delay_ms(DELAY);
}
}
void pause() {
m_running = false;
}
private:
bool m_running;
Cell m_cells[WIDTH][HEIGHT];
};
int main() {
initgraph(WIDTH * CELL_SIZE, HEIGHT * CELL_SIZE);
GameOfLife game;
game.start();
closegraph();
return 0;
}
```
在init函数中,我们使用rand函数随机设置一些细胞的初始状态。
在update函数中,我们使用双重循环遍历游戏界面中的每个细胞,计算每个细胞周围的存活细胞数量,并根据生命游戏的规则,计算出每个细胞下一时刻的状态。
在draw函数中,我们使用setfillcolor和fillrectangle函数绘制游戏界面中的每个细胞。
在start函数中,我们使用while循环,反复调用update和draw函数,并使用delay_ms函数控制每一帧的延迟时间,实现游戏的运行。
在pause函数中,我们可以通过修改m_running变量的值,控制游戏的暂停。
最后,在main函数中,我们创建一个GameOfLife的实例,调用start函数启动游戏。
阅读全文