黄金矿工 C++ 多文件 easyx

时间: 2023-08-05 11:07:31 浏览: 35
好的,以下是黄金矿工的 C++ 多文件版 easyx 实现,文件分别为 main.cpp、game.h、game.cpp、object.h、object.cpp、resource.h、resource.cpp。代码注释较详细,希望能帮到你。 main.cpp: ```cpp #include "game.h" int main() { Game game; game.run(); return 0; } ``` game.h: ```cpp #ifndef GAME_H #define GAME_H #include <vector> #include "object.h" #include "resource.h" class Game { public: Game(); ~Game(); void run(); private: void init(); // 初始化游戏 void update(); // 更新游戏 void render(); // 渲染游戏 void handleInput(); // 处理输入 void spawnObject(); // 生成物体 void checkCollision(); // 检测碰撞 void gameOver(); // 游戏结束 bool isCollided(Object& a, Object& b); // 判断两个物体是否碰撞 static const int WIDTH = 800; // 窗口宽度 static const int HEIGHT = 600; // 窗口高度 Resource resource; // 资源管理器 std::vector<Object*> objects; // 物体数组 Object* player; // 玩家 bool isRunning; // 是否正在运行 }; #endif // GAME_H ``` game.cpp: ```cpp #include <graphics.h> #include <conio.h> #include <time.h> #include "game.h" // 构造函数 Game::Game() { init(); } // 析构函数 Game::~Game() { for (Object* object : objects) { delete object; } objects.clear(); delete player; } // 初始化游戏 void Game::init() { // 初始化随机数种子 srand((unsigned)time(NULL)); // 初始化资源 resource.load(); // 创建玩家 player = new Object(WIDTH / 2, HEIGHT - 80, Object::PLAYER, &resource); // 设置游戏状态 isRunning = true; // 生成初始物体 for (int i = 0; i < 5; i++) { spawnObject(); } } // 运行游戏 void Game::run() { while (isRunning) { // 处理输入 handleInput(); // 更新游戏 update(); // 渲染游戏 render(); // 等待一段时间 Sleep(10); } } // 更新游戏 void Game::update() { // 更新玩家 player->update(); // 更新物体 for (Object* object : objects) { object->update(); } // 检测碰撞 checkCollision(); // 生成新物体 if (rand() % 100 == 0) { spawnObject(); } // 游戏结束 if (player->getHealth() <= 0) { gameOver(); } } // 渲染游戏 void Game::render() { // 清空屏幕 cleardevice(); // 绘制玩家 player->render(); // 绘制物体 for (Object* object : objects) { object->render(); } // 绘制生命值 settextcolor(WHITE); settextstyle(20, 0, _T("Consolas")); TCHAR healthText[10]; _stprintf_s(healthText, _T("Health: %d"), player->getHealth()); outtextxy(10, 10, healthText); // 更新屏幕 flushbatch(); } // 处理输入 void Game::handleInput() { // 检测按键 if (GetAsyncKeyState(VK_LEFT) & 0x8000) { player->setDir(Object::LEFT); } else if (GetAsyncKeyState(VK_RIGHT) & 0x8000) { player->setDir(Object::RIGHT); } else { player->setDir(Object::NONE); } } // 生成物体 void Game::spawnObject() { int type = rand() % Object::COUNT; int x = rand() % (WIDTH - 40) + 20; int y = rand() % 200 - 300; objects.push_back(new Object(x, y, (Object::Type)type, &resource)); } // 检测碰撞 void Game::checkCollision() { // 判断玩家与物体是否碰撞 for (auto it = objects.begin(); it != objects.end();) { Object* object = *it; if (isCollided(*player, *object)) { player->setHealth(player->getHealth() + object->getHealth()); player->setScore(player->getScore() + object->getScore()); delete object; it = objects.erase(it); } else { it++; } } } // 判断两个物体是否碰撞 bool Game::isCollided(Object& a, Object& b) { int ax = a.getX(), ay = a.getY(), aw = a.getWidth(), ah = a.getHeight(); int bx = b.getX(), by = b.getY(), bw = b.getWidth(), bh = b.getHeight(); if (ax + aw < bx || ax > bx + bw || ay + ah < by || ay > by + bh) { return false; } return true; } // 游戏结束 void Game::gameOver() { isRunning = false; cleardevice(); settextcolor(WHITE); settextstyle(50, 0, _T("Consolas")); outtextxy(200, 250, _T("Game Over")); flushbatch(); _getch(); } ``` object.h: ```cpp #ifndef OBJECT_H #define OBJECT_H #include "resource.h" class Object { public: enum Type { GOLD, ROCK, DIAMOND, COUNT }; enum Dir { LEFT, RIGHT, NONE }; Object(int x, int y, Type type, Resource* resource); ~Object(); void update(); void render(); void setDir(Dir dir) { this->dir = dir; } int getX() const { return x; } int getY() const { return y; } int getWidth() const { return width; } int getHeight() const { return height; } int getHealth() const { return health; } int getScore() const { return score; } private: int x, y; int width, height; int health, score; Type type; Dir dir; Resource* resource; }; #endif // OBJECT_H ``` object.cpp: ```cpp #include <graphics.h> #include "object.h" // 构造函数 Object::Object(int x, int y, Type type, Resource* resource) { this->x = x; this->y = y; this->type = type; this->resource = resource; // 设置属性 switch (type) { case GOLD: width = 40; height = 40; health = 10; score = 10; break; case ROCK: width = 60; height = 60; health = -20; score = 0; break; case DIAMOND: width = 30; height = 30; health = 20; score = 20; break; default: break; } // 设置方向 dir = NONE; } // 析构函数 Object::~Object() { } // 更新物体 void Object::update() { // 根据方向移动 switch (dir) { case LEFT: x -= 5; break; case RIGHT: x += 5; break; default: break; } // 如果超出屏幕,删除物体 if (y > 600 || y < -100 || x > 800 || x < -100) { delete this; } } // 绘制物体 void Object::render() { switch (type) { case GOLD: resource->draw(x, y, Resource::GOLD); break; case ROCK: resource->draw(x, y, Resource::ROCK); break; case DIAMOND: resource->draw(x, y, Resource::DIAMOND); break; default: break; } } ``` resource.h: ```cpp #ifndef RESOURCE_H #define RESOURCE_H #include <graphics.h> #include <map> class Resource { public: enum Type { GOLD, ROCK, DIAMOND, COUNT }; Resource(); ~Resource(); void load(); void draw(int x, int y, Type type); private: std::map<Type, IMAGE*> images; }; #endif // RESOURCE_H ``` resource.cpp: ```cpp #include "resource.h" // 构造函数 Resource::Resource() { } // 析构函数 Resource::~Resource() { for (auto it = images.begin(); it != images.end(); it++) { delimage(it->second); } images.clear(); } // 加载资源 void Resource::load() { images[GOLD] = newimage(); getimage(images[GOLD], _T("res\\gold.png")); images[ROCK] = newimage(); getimage(images[ROCK], _T("res\\rock.png")); images[DIAMOND] = newimage(); getimage(images[DIAMOND], _T("res\\diamond.png")); } // 绘制图片 void Resource::draw(int x, int y, Type type) { putimage(x, y, images[type]); } ```

相关推荐

最新推荐

recommend-type

pre_o_1csdn63m9a1bs0e1rr51niuu33e.a

pre_o_1csdn63m9a1bs0e1rr51niuu33e.a
recommend-type

matlab建立计算力学课程的笔记和文件.zip

matlab建立计算力学课程的笔记和文件.zip
recommend-type

FT-Prog-v3.12.38.643-FTD USB 工作模式设定及eprom读写

FT_Prog_v3.12.38.643--FTD USB 工作模式设定及eprom读写
recommend-type

matlab基于RRT和人工势场法混合算法的路径规划.zip

matlab基于RRT和人工势场法混合算法的路径规划.zip
recommend-type

matlab基于matlab的两步定位软件定义接收机的开源GNSS直接位置估计插件模块.zip

matlab基于matlab的两步定位软件定义接收机的开源GNSS直接位置估计插件模块.zip
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

2. 通过python绘制y=e-xsin(2πx)图像

可以使用matplotlib库来绘制这个函数的图像。以下是一段示例代码: ```python import numpy as np import matplotlib.pyplot as plt def func(x): return np.exp(-x) * np.sin(2 * np.pi * x) x = np.linspace(0, 5, 500) y = func(x) plt.plot(x, y) plt.xlabel('x') plt.ylabel('y') plt.title('y = e^{-x} sin(2πx)') plt.show() ``` 运行这段
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。