黄金矿工 C++ 多文件 easyx
时间: 2023-09-13 17:05:09 浏览: 60
好的,下面给出一个简单的黄金矿工游戏的 C++ 多文件实现,使用 EasyX 图形库。
首先,我们需要一个 `main.cpp` 文件,负责启动游戏和处理用户输入。该文件中的代码如下:
```cpp
#include <graphics.h>
#include <conio.h> // 用于获取用户输入
#include <ctime> // 用于生成随机数种子
#include "game.h" // 引入游戏逻辑实现
int main() {
srand(time(NULL)); // 初始化随机数种子
initgraph(WIDTH, HEIGHT);
Game game;
while (!game.isOver()) {
game.draw();
game.update();
if (_kbhit()) {
char ch = _getch();
if (ch == ' ') {
game.dropHook();
}
}
Sleep(10);
}
game.end();
closegraph();
return 0;
}
```
其中,`WIDTH` 和 `HEIGHT` 分别表示游戏窗口的宽度和高度。`Game` 类是游戏逻辑的实现,我们将在 `game.h` 和 `game.cpp` 中定义。
首先是 `game.h` 文件,定义了 `Game` 类和一些常量:
```cpp
#ifndef GAME_H
#define GAME_H
#include <vector>
#include "gold.h" // 引入黄金和钩子的实现
const int WIDTH = 800;
const int HEIGHT = 600;
const int HOOK_SPEED = 5;
const int GOLD_SPEED = 3;
class Game {
public:
Game();
void draw();
void update();
void dropHook();
bool isOver() const;
void end();
private:
void initGold();
void checkCollision();
void updateScore();
int score;
bool over;
bool hookDropping;
Hook hook;
std::vector<Gold> golds;
};
#endif
```
`Game` 类中定义了一些常量,如钩子移动的速度 `HOOK_SPEED` 和黄金下落的速度 `GOLD_SPEED`。也定义了一些方法,如 `draw` 用于绘制游戏界面,`update` 用于更新游戏状态,`dropHook` 用于下落钩子,`isOver` 用于判断游戏是否结束,以及 `end` 用于结束游戏。
下面是 `game.cpp` 文件的实现:
```cpp
#include "game.h"
#include <graphics.h>
Game::Game() : score(0), over(false), hookDropping(false) {
initGold();
}
void Game::initGold() {
for (int i = 0; i < 10; i++) {
Gold gold(rand() % WIDTH, -(rand() % 500 + 1), rand() % 3 + 1);
golds.push_back(gold);
}
}
void Game::draw() {
cleardevice();
setbkcolor(RGB(255, 255, 255));
settextcolor(RGB(0, 0, 0));
settextstyle(20, 0, _T("Consolas"));
TCHAR strScore[32];
wsprintf(strScore, _T("Score: %d"), score);
outtextxy(20, 20, strScore);
hook.draw();
for (auto& gold : golds) {
gold.draw();
}
flushbatch();
}
void Game::update() {
if (hookDropping) {
hook.moveDown(HOOK_SPEED);
checkCollision();
}
for (auto& gold : golds) {
gold.moveDown(GOLD_SPEED);
if (gold.isOutOfScreen()) {
gold.reset(rand() % WIDTH, -(rand() % 500 + 1), rand() % 3 + 1);
}
}
updateScore();
}
void Game::dropHook() {
if (!hookDropping) {
hookDropping = true;
}
}
bool Game::isOver() const {
return over;
}
void Game::end() {
setbkcolor(RGB(255, 255, 255));
settextcolor(RGB(0, 0, 0));
settextstyle(40, 0, _T("Consolas"));
outtextxy(WIDTH / 2 - 100, HEIGHT / 2 - 20, _T("GAME OVER"));
}
void Game::checkCollision() {
for (auto& gold : golds) {
if (hook.isColliding(gold)) {
score += gold.getValue();
gold.reset(rand() % WIDTH, -(rand() % 500 + 1), rand() % 3 + 1);
hookDropping = false;
return;
}
}
if (hook.isOutOfScreen()) {
hookDropping = false;
}
}
void Game::updateScore() {
if (score >= 100) {
over = true;
}
}
```
`Game` 类中的方法实现了游戏逻辑。`initGold` 用于初始化黄金的位置和大小,`draw` 用于绘制游戏界面,包括钩子和黄金,以及分数。`update` 用于更新游戏状态,包括钩子和黄金的移动,以及检测碰撞和更新分数。`dropHook` 用于下落钩子,`isOver` 用于判断游戏是否结束,以及 `end` 用于结束游戏。
最后是 `gold.h` 和 `gold.cpp` 文件的实现,定义了 `Gold` 类和一些常量:
```cpp
#ifndef GOLD_H
#define GOLD_H
#include <graphics.h>
const int GOLD_SIZE[3][2] = {{50, 50}, {40, 40}, {30, 30}};
class Gold {
public:
Gold(int x, int y, int type);
void draw() const;
void moveDown(int speed);
bool isOutOfScreen() const;
void reset(int x, int y, int type);
int getValue() const;
private:
int x;
int y;
int type;
};
#endif
```
```cpp
#include "gold.h"
#include <graphics.h>
Gold::Gold(int x, int y, int type) : x(x), y(y), type(type) {}
void Gold::draw() const {
setfillcolor(RGB(255, 215, 0));
fillcircle(x, y, GOLD_SIZE[type - 1][0] / 2);
}
void Gold::moveDown(int speed) {
y += speed;
}
bool Gold::isOutOfScreen() const {
return y > HEIGHT + GOLD_SIZE[type - 1][1] / 2;
}
void Gold::reset(int x, int y, int type) {
this->x = x;
this->y = y;
this->type = type;
}
int Gold::getValue() const {
return type * 10;
}
```
`Gold` 类中定义了一些常量,如黄金的大小 `GOLD_SIZE`。也定义了一些方法,如 `draw` 用于绘制黄金,`moveDown` 用于下落,`isOutOfScreen` 用于判断是否超出屏幕,以及 `reset` 和 `getValue` 用于重置黄金的位置和获取黄金的分数。
以上就是黄金矿工游戏的 C++ 多文件实现,使用了 EasyX 图形库。这只是一个简单的实现,还可以进一步改进,使游戏更加完善。
阅读全文