请用c++写出一个飞机大战的游戏

时间: 2023-10-17 07:05:16 浏览: 32
这里给出一个简单的飞机大战的游戏,使用C++语言和SFML库实现。游戏规则是:玩家控制一架飞机,消灭敌机并获得分数,同时要躲避敌机的攻击。游戏分为两个场景:开始场景和游戏场景。 1. 开始场景 开始场景显示游戏标题,同时提示玩家按下空格键开始游戏。 2. 游戏场景 游戏场景显示玩家飞机、敌机和子弹,玩家可以通过键盘控制飞机的移动和发射子弹。敌机会不断向玩家飞机发射子弹,玩家需要躲避敌机的攻击,并且消灭敌机以获得分数。游戏场景还包括计分板,显示玩家的得分和剩余生命值。 下面是主要的游戏代码实现: ```c++ #include <SFML/Graphics.hpp> #include <iostream> #include <vector> #include <cstdlib> #include <ctime> using namespace sf; // 定义常量 const int WINDOW_WIDTH = 800; const int WINDOW_HEIGHT = 600; const float PLAYER_SPEED = 5.0f; const float BULLET_SPEED = 10.0f; const float ENEMY_SPEED = 3.0f; const int ENEMY_SCORE = 10; const int PLAYER_LIFE = 3; // 定义玩家飞机 class Player { public: Player(Texture& texture, Vector2f position) { m_sprite.setTexture(texture); m_sprite.setPosition(position); m_life = PLAYER_LIFE; } void update() { if (Keyboard::isKeyPressed(Keyboard::Left)) { m_sprite.move(-PLAYER_SPEED, 0); } if (Keyboard::isKeyPressed(Keyboard::Right)) { m_sprite.move(PLAYER_SPEED, 0); } if (Keyboard::isKeyPressed(Keyboard::Up)) { m_sprite.move(0, -PLAYER_SPEED); } if (Keyboard::isKeyPressed(Keyboard::Down)) { m_sprite.move(0, PLAYER_SPEED); } } void draw(RenderWindow& window) { window.draw(m_sprite); } Vector2f getPosition() { return m_sprite.getPosition(); } void setLife(int life) { m_life = life; } int getLife() { return m_life; } private: Sprite m_sprite; int m_life; }; // 定义子弹 class Bullet { public: Bullet(Texture& texture, Vector2f position) { m_sprite.setTexture(texture); m_sprite.setPosition(position); } void update() { m_sprite.move(0, -BULLET_SPEED); } void draw(RenderWindow& window) { window.draw(m_sprite); } Vector2f getPosition() { return m_sprite.getPosition(); } private: Sprite m_sprite; }; // 定义敌机 class Enemy { public: Enemy(Texture& texture, Vector2f position) { m_sprite.setTexture(texture); m_sprite.setPosition(position); } void update() { m_sprite.move(0, ENEMY_SPEED); } void draw(RenderWindow& window) { window.draw(m_sprite); } Vector2f getPosition() { return m_sprite.getPosition(); } void setScore(int score) { m_score = score; } int getScore() { return m_score; } private: Sprite m_sprite; int m_score; }; int main() { // 创建窗口 RenderWindow window(VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), "飞机大战"); // 加载纹理 Texture playerTexture, bulletTexture, enemyTexture; playerTexture.loadFromFile("player.png"); bulletTexture.loadFromFile("bullet.png"); enemyTexture.loadFromFile("enemy.png"); // 创建玩家飞机 Player player(playerTexture, Vector2f(WINDOW_WIDTH / 2, WINDOW_HEIGHT - 100)); // 创建子弹和敌机数组 std::vector<Bullet> bullets; std::vector<Enemy> enemies; // 创建字体和文本 Font font; font.loadFromFile("arial.ttf"); Text scoreText, lifeText; scoreText.setFont(font); scoreText.setCharacterSize(24); scoreText.setPosition(10, 10); lifeText.setFont(font); lifeText.setCharacterSize(24); lifeText.setPosition(WINDOW_WIDTH - 100, 10); // 设置随机种子 srand(time(NULL)); // 游戏循环 int score = 0; int life = PLAYER_LIFE; while (window.isOpen()) { // 处理事件 Event event; while (window.pollEvent(event)) { if (event.type == Event::Closed) { window.close(); } // 玩家发射子弹 if (event.type == Event::KeyPressed && event.key.code == Keyboard::Space) { bullets.push_back(Bullet(bulletTexture, player.getPosition())); } } // 更新玩家飞机 player.update(); // 更新子弹和敌机 for (int i = 0; i < bullets.size(); i++) { bullets[i].update(); if (bullets[i].getPosition().y < 0) { bullets.erase(bullets.begin() + i); } } for (int i = 0; i < enemies.size(); i++) { enemies[i].update(); if (enemies[i].getPosition().y > WINDOW_HEIGHT) { enemies.erase(enemies.begin() + i); } } // 生成敌机 if (rand() % 100 < 5) { enemies.push_back(Enemy(enemyTexture, Vector2f(rand() % WINDOW_WIDTH, 0))); } // 处理碰撞 for (int i = 0; i < bullets.size(); i++) { for (int j = 0; j < enemies.size(); j++) { if (bullets[i].getPosition().x > enemies[j].getPosition().x && bullets[i].getPosition().x < enemies[j].getPosition().x + enemyTexture.getSize().x && bullets[i].getPosition().y > enemies[j].getPosition().y && bullets[i].getPosition().y < enemies[j].getPosition().y + enemyTexture.getSize().y) { score += enemies[j].getScore(); bullets.erase(bullets.begin() + i); enemies.erase(enemies.begin() + j); } } } for (int i = 0; i < enemies.size(); i++) { if (enemies[i].getPosition().x > player.getPosition().x && enemies[i].getPosition().x < player.getPosition().x + playerTexture.getSize().x && enemies[i].getPosition().y > player.getPosition().y && enemies[i].getPosition().y < player.getPosition().y + playerTexture.getSize().y) { life--; enemies.erase(enemies.begin() + i); if (life == 0) { window.close(); } } } // 绘制场景 window.clear(Color::White); player.draw(window); for (int i = 0; i < bullets.size(); i++) { bullets[i].draw(window); } for (int i = 0; i < enemies.size(); i++) { enemies[i].draw(window); } scoreText.setString("得分: " + std::to_string(score)); window.draw(scoreText); lifeText.setString("生命: " + std::to_string(life)); window.draw(lifeText); window.display(); } return 0; } ``` 这个游戏只是一个简单的实现,还有很多可以改进和优化的地方。

相关推荐

最新推荐

recommend-type

android手机应用源码Imsdroid语音视频通话源码.rar

android手机应用源码Imsdroid语音视频通话源码.rar
recommend-type

营销计划汇报PPT,市场品牌 推广渠道 产品 营销策略tbb.pptx

营销计划汇报PPT,市场品牌 推广渠道 产品 营销策略tbb.pptx
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

可见光定位LED及其供电硬件具体型号,广角镜头和探测器,实验设计具体流程步骤,

1. 可见光定位LED型号:一般可使用5mm或3mm的普通白色LED,也可以选择专门用于定位的LED,例如OSRAM公司的SFH 4715AS或Vishay公司的VLMU3500-385-120。 2. 供电硬件型号:可以使用常见的直流电源供电,也可以选择专门的LED驱动器,例如Meanwell公司的ELG-75-C或ELG-150-C系列。 3. 广角镜头和探测器型号:一般可采用广角透镜和CMOS摄像头或光电二极管探测器,例如Omron公司的B5W-LA或Murata公司的IRS-B210ST01。 4. 实验设计流程步骤: 1)确定实验目的和研究对象,例如车辆或机器人的定位和导航。
recommend-type

JSBSim Reference Manual

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

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

实现实时监控告警系统:Kafka与Grafana整合

![实现实时监控告警系统:Kafka与Grafana整合](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9BVldpY3ladXVDbEZpY1pLWmw2bUVaWXFUcEdLT1VDdkxRSmQxZXB5R1lxaWNlUjA2c0hFek5Qc3FyRktudFF1VDMxQVl3QTRXV2lhSWFRMEFRc0I1cW1ZOGcvNjQw?x-oss-process=image/format,png) # 1.1 Kafka集群架构 Kafka集群由多个称为代理的服务器组成,这
recommend-type

解释这行代码 c = ((double)rand() / RAND_MAX) * (a + b - fabs(a - b)) + fabs(a - b);

这行代码的作用是随机生成一个浮点数,范围在 a 和 b 之间(包括 a 和 b)。 其中,`rand()` 函数是 C 语言标准库中的一个函数,用于生成一个伪随机整数。`RAND_MAX` 是一个常量,它表示 `rand()` 函数生成的随机数的最大值。 因此,`(double)rand() / RAND_MAX` 表示生成的随机数在 [0, 1] 之间的浮点数。 然后,将这个随机数乘上 `(a - b) - fabs(a - b)`,再加上 `fabs(a - b)`。 `fabs(a - b)` 是 C 语言标准库中的一个函数,用于计算一个数的绝对值。因此,`fabs(a - b)