C++实现飞机大战,敌我均可发射导弹,写出源代码
时间: 2024-04-06 20:30:51 浏览: 22
以下是一个简单的C++飞机大战游戏源代码示例,使用了SFML库和面向对象编程:
```c++
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <vector>
#include <ctime>
#include <cstdlib>
#include <iostream>
using namespace std;
// 定义游戏窗口大小
const int WINDOW_WIDTH = 800;
const int WINDOW_HEIGHT = 600;
// 定义玩家飞机速度
const int PLAYER_SPEED = 6;
// 定义敌机速度
const int ENEMY_SPEED = 3;
// 定义导弹速度
const int MISSILE_SPEED = 8;
// 定义玩家飞机和敌机生命值
const int PLAYER_HP = 10;
const int ENEMY_HP = 5;
// 定义游戏音效和背景音乐
sf::SoundBuffer explosionBuffer;
sf::SoundBuffer missileBuffer;
sf::SoundBuffer bgmBuffer;
sf::Sound explosionSound;
sf::Sound missileSound;
sf::Music bgm;
// 定义游戏对象类
class GameObject {
public:
GameObject(sf::Texture& texture, int x, int y) : sprite(texture), hp(1) {
sprite.setPosition(x, y);
}
virtual void update() {}
bool isAlive() {
return hp > 0;
}
void hit() {
hp--;
}
sf::Sprite sprite;
int hp;
};
// 定义玩家飞机类
class Player : public GameObject {
public:
Player(sf::Texture& texture, int x, int y) : GameObject(texture, x, y) {
hp = PLAYER_HP;
}
void update() {
// 移动玩家飞机
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) {
sprite.move(-PLAYER_SPEED, 0);
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) {
sprite.move(PLAYER_SPEED, 0);
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) {
sprite.move(0, -PLAYER_SPEED);
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) {
sprite.move(0, PLAYER_SPEED);
}
}
};
// 定义敌机类
class Enemy : public GameObject {
public:
Enemy(sf::Texture& texture, int x, int y) : GameObject(texture, x, y), direction(rand() % 2 == 0 ? -1 : 1) {
hp = ENEMY_HP;
sprite.setScale(0.5f, 0.5f); // 缩小敌机大小
}
void update() {
// 移动敌机
sprite.move(ENEMY_SPEED * direction, 0);
// 如果敌机到达窗口边缘则改变方向
if (sprite.getPosition().x < 0 || sprite.getPosition().x > WINDOW_WIDTH - sprite.getGlobalBounds().width) {
direction *= -1;
}
}
private:
int direction;
};
// 定义导弹类
class Missile : public GameObject {
public:
Missile(sf::Texture& texture, int x, int y, int direction) : GameObject(texture, x, y), direction(direction) {
hp = 1;
}
void update() {
// 移动导弹
sprite.move(0, MISSILE_SPEED * direction);
}
private:
int direction;
};
// 定义游戏主函数
int main() {
// 初始化随机数种子
srand(time(NULL));
// 创建游戏窗口
sf::RenderWindow window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), "飞机大战");
// 加载游戏资源
sf::Texture bgTexture;
bgTexture.loadFromFile("background.png");
sf::Sprite bgSprite(bgTexture);
sf::Texture playerTexture;
playerTexture.loadFromFile("player.png");
Player player(playerTexture, WINDOW_WIDTH / 2, WINDOW_HEIGHT - 100);
sf::Texture enemyTexture;
enemyTexture.loadFromFile("enemy.png");
vector<Enemy> enemies;
for (int i = 0; i < 10; i++) {
enemies.push_back(Enemy(enemyTexture, rand() % WINDOW_WIDTH, rand() % WINDOW_HEIGHT / 2));
}
sf::Texture missileTexture;
missileTexture.loadFromFile("missile.png");
vector<Missile> playerMissiles;
vector<Missile> enemyMissiles;
if (!explosionBuffer.loadFromFile("explosion.wav")) {
cout << "无法加载爆炸音效文件" << endl;
}
explosionSound.setBuffer(explosionBuffer);
if (!missileBuffer.loadFromFile("missile.wav")) {
cout << "无法加载导弹音效文件" << endl;
}
missileSound.setBuffer(missileBuffer);
if (!bgmBuffer.loadFromFile("bgm.ogg")) {
cout << "无法加载背景音乐文件" << endl;
}
bgm.setBuffer(bgmBuffer);
bgm.setLoop(true);
bgm.play();
// 游戏循环
while (window.isOpen()) {
// 处理窗口事件
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
window.close();
}
// 玩家飞机发射导弹
if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Space) {
playerMissiles.push_back(Missile(missileTexture, player.sprite.getPosition().x + player.sprite.getGlobalBounds().width / 2, player.sprite.getPosition().y, -1));
missileSound.play();
}
}
// 更新游戏对象
player.update();
for (int i = 0; i < enemies.size(); i++) {
enemies[i].update();
// 敌机发射导弹
if (rand() % 100 == 0) {
enemyMissiles.push_back(Missile(missileTexture, enemies[i].sprite.getPosition().x + enemies[i].sprite.getGlobalBounds().width / 2, enemies[i].sprite.getPosition().y + enemies[i].sprite.getGlobalBounds().height, 1));
missileSound.play();
}
}
for (int i = 0; i < playerMissiles.size(); i++) {
playerMissiles[i].update();
}
for (int i = 0; i < enemyMissiles.size(); i++) {
enemyMissiles[i].update();
}
// 检测碰撞
for (int i = 0; i < playerMissiles.size(); i++) {
for (int j = 0; j < enemies.size(); j++) {
if (playerMissiles[i].sprite.getGlobalBounds().intersects(enemies[j].sprite.getGlobalBounds())) {
playerMissiles[i].hit();
enemies[j].hit();
explosionSound.play();
}
}
}
for (int i = 0; i < enemyMissiles.size(); i++) {
if (enemyMissiles[i].sprite.getGlobalBounds().intersects(player.sprite.getGlobalBounds())) {
enemyMissiles[i].hit();
player.hit();
explosionSound.play();
}
}
// 移除死亡游戏对象
for (int i = playerMissiles.size() - 1; i >= 0; i--) {
if (!playerMissiles[i].isAlive()) {
playerMissiles.erase(playerMissiles.begin() + i);
}
}
for (int i = enemyMissiles.size() - 1; i >= 0; i--) {
if (!enemyMissiles[i].isAlive()) {
enemyMissiles.erase(enemyMissiles.begin() + i);
}
}
for (int i = enemies.size() - 1; i >= 0; i--) {
if (!enemies[i].isAlive()) {
enemies.erase(enemies.begin() + i);
}
}
// 如果敌机数量不足,则随机添加敌机
if (enemies.size() < 10) {
enemies.push_back(Enemy(enemyTexture, rand() % WINDOW_WIDTH, 0));
}
// 绘制游戏场景
window.clear();
window.draw(bgSprite);
window.draw(player.sprite);
for (int i = 0; i < enemies.size(); i++) {
window.draw(enemies[i].sprite);
}
for (int i = 0; i < playerMissiles.size(); i++) {
window.draw(playerMissiles[i].sprite);
}
for (int i = 0; i < enemyMissiles.size(); i++) {
window.draw(enemyMissiles[i].sprite);
}
window.display();
}
return 0;
}
```
请注意,这只是一个简单的示例代码,可能还需要添加更多的游戏功能和优化。