用C + +与easyX写一个小游戏
时间: 2024-02-05 11:05:11 浏览: 69
好的,我们可以写一个飞机大战小游戏。
首先,我们需要下载并安装 EasyX,它是一款简单易用的图形库,可以帮助我们快速地实现图形界面的操作。
接下来,我们可以开始编写代码。首先是头文件的引入和命名空间的声明:
```c++
#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
```
然后是一些常量的定义:
```c++
const int WIDTH = 480; // 窗口宽度
const int HEIGHT = 700; // 窗口高度
const int BULLET_NUM = 100; // 子弹数量
const int ENEMY_NUM = 20; // 敌机数量
const int ENEMY_SPEED = 3; // 敌机速度
const int BULLET_SPEED = 10; // 子弹速度
const int HERO_SPEED = 5; // 英雄飞机速度
const int HERO_HP = 3; // 英雄飞机生命值
```
接下来是一些全局变量的定义:
```c++
IMAGE bg; // 背景图
IMAGE hero; // 英雄飞机图
IMAGE enemy; // 敌机图
IMAGE bullet; // 子弹图
IMAGE boom; // 爆炸图
int hero_x, hero_y; // 英雄飞机的坐标
int hero_w, hero_h; // 英雄飞机的宽度和高度
int enemy_x[ENEMY_NUM], enemy_y[ENEMY_NUM]; // 敌机的坐标
int enemy_hp[ENEMY_NUM]; // 敌机的生命值
int enemy_w, enemy_h; // 敌机的宽度和高度
int bullet_x[BULLET_NUM], bullet_y[BULLET_NUM]; // 子弹的坐标
int bullet_w, bullet_h; // 子弹的宽度和高度
int boom_x, boom_y; // 爆炸效果的坐标
int boom_w, boom_h; // 爆炸效果的宽度和高度
int score = 0; // 得分
int hp = HERO_HP; // 英雄飞机生命值
bool is_game_over = false; // 游戏是否结束
```
然后是一些函数的声明:
```c++
void init(); // 初始化函数
void draw(); // 绘制函数
void move(); // 移动函数
void shoot(); // 射击函数
void hit(); // 碰撞检测函数
void game_over(); // 游戏结束处理函数
```
接下来是主函数的实现:
```c++
int main()
{
initgraph(WIDTH, HEIGHT); // 初始化图形界面
init(); // 初始化游戏
while(!is_game_over) // 游戏循环
{
draw(); // 绘制游戏
move(); // 移动游戏
shoot(); // 射击子弹
hit(); // 碰撞检测
Sleep(30); // 防止游戏速度过快
if(hp <= 0) // 生命值为0,游戏结束
{
game_over(); // 处理游戏结束
}
}
getchar();
closegraph(); // 关闭图形界面
return 0;
}
```
接下来是各个函数的实现:
初始化函数:
```c++
void init()
{
srand(time(NULL)); // 设置随机数种子
loadimage(&bg, "bg.jpg"); // 载入背景图
loadimage(&hero, "hero.png"); // 载入英雄飞机图
loadimage(&enemy, "enemy.png"); // 载入敌机图
loadimage(&bullet, "bullet.png"); // 载入子弹图
loadimage(&boom, "boom.png"); // 载入爆炸图
hero_x = (WIDTH - getwidth(&hero)) / 2; // 英雄飞机初始位置
hero_y = HEIGHT - getheight(&hero) - 50;
hero_w = getwidth(&hero); // 英雄飞机大小
hero_h = getheight(&hero);
enemy_w = getwidth(&enemy); // 敌机大小
enemy_h = getheight(&enemy);
bullet_w = getwidth(&bullet); // 子弹大小
bullet_h = getheight(&bullet);
for(int i = 0; i < ENEMY_NUM; i++) // 敌机初始位置和生命值
{
enemy_x[i] = rand() % (WIDTH - enemy_w);
enemy_y[i] = rand() % (HEIGHT / 2) - HEIGHT;
enemy_hp[i] = 1;
}
}
```
绘制函数:
```c++
void draw()
{
putimage(0, 0, &bg); // 绘制背景图
putimage(hero_x, hero_y, &hero); // 绘制英雄飞机
for(int i = 0; i < ENEMY_NUM; i++) // 绘制敌机
{
if(enemy_hp[i] > 0)
{
putimage(enemy_x[i], enemy_y[i], &enemy);
}
}
for(int i = 0; i < BULLET_NUM; i++) // 绘制子弹
{
if(bullet_y[i] > 0)
{
putimage(bullet_x[i], bullet_y[i], &bullet);
}
}
settextcolor(WHITE); // 绘制得分和生命值
char str[50];
sprintf(str, "Score: %d", score);
outtextxy(20, 20, str);
sprintf(str, "HP: %d", hp);
outtextxy(WIDTH - 80, 20, str);
if(is_game_over) // 绘制爆炸效果
{
putimage(boom_x, boom_y, &boom);
}
}
```
移动函数:
```c++
void move()
{
char c = getch(); // 获取键盘输入
switch(c)
{
case 'a': // 左移
hero_x -= HERO_SPEED;
break;
case 'd': // 右移
hero_x += HERO_SPEED;
break;
case 'w': // 上移
hero_y -= HERO_SPEED;
break;
case 's': // 下移
hero_y += HERO_SPEED;
break;
}
if(hero_x < 0) // 边界检测
{
hero_x = 0;
}
if(hero_x > WIDTH - hero_w)
{
hero_x = WIDTH - hero_w;
}
if(hero_y < 0)
{
hero_y = 0;
}
if(hero_y > HEIGHT - hero_h)
{
hero_y = HEIGHT - hero_h;
}
for(int i = 0; i < ENEMY_NUM; i++) // 敌机移动
{
if(enemy_hp[i] > 0)
{
enemy_y[i] += ENEMY_SPEED;
}
if(enemy_y[i] > HEIGHT) // 敌机重新出现
{
enemy_x[i] = rand() % (WIDTH - enemy_w);
enemy_y[i] = rand() % (HEIGHT / 2) - HEIGHT;
enemy_hp[i] = 1;
}
}
for(int i = 0; i < BULLET_NUM; i++) // 子弹移动
{
if(bullet_y[i] > 0)
{
bullet_y[i] -= BULLET_SPEED;
}
}
}
```
射击函数:
```c++
void shoot()
{
static int count = 0;
count++;
if(count > 10) // 控制子弹发射速度
{
count = 0;
for(int i = 0; i < BULLET_NUM; i++)
{
if(bullet_y[i] <= 0) // 子弹未使用,进行发射
{
bullet_x[i] = hero_x + hero_w / 2 - bullet_w / 2;
bullet_y[i] = hero_y - bullet_h;
break;
}
}
}
}
```
碰撞检测函数:
```c++
void hit()
{
for(int i = 0; i < ENEMY_NUM; i++) // 子弹和敌机的碰撞检测
{
for(int j = 0; j < BULLET_NUM; j++)
{
if(bullet_y[j] > 0 && enemy_hp[i] > 0 &&
bullet_x[j] > enemy_x[i] - bullet_w &&
bullet_x[j] < enemy_x[i] + enemy_w &&
bullet_y[j] > enemy_y[i] - bullet_h &&
bullet_y[j] < enemy_y[i] + enemy_h)
{
enemy_hp[i]--; // 减少敌机生命值
bullet_y[j] = -1; // 子弹消失
if(enemy_hp[i] <= 0) // 敌机被击毁
{
boom_x = enemy_x[i] + enemy_w / 2 - boom_w / 2;
boom_y = enemy_y[i] + enemy_h / 2 - boom_h / 2;
score++; // 增加得分
}
}
}
}
for(int i = 0; i < ENEMY_NUM; i++) // 英雄飞机和敌机的碰撞检测
{
if(enemy_hp[i] > 0 &&
hero_x + hero_w > enemy_x[i] &&
hero_x < enemy_x[i] + enemy_w &&
hero_y + hero_h > enemy_y[i] &&
hero_y < enemy_y[i] + enemy_h)
{
enemy_hp[i] = 0; // 减少敌机生命值
hp--; // 减少生命值
boom_x = hero_x + hero_w / 2 - boom_w / 2;
boom_y = hero_y + hero_h / 2 - boom_h / 2;
if(hp > 0) // 英雄飞机重新出现
{
hero_x = (WIDTH - hero_w) / 2;
hero_y = HEIGHT - hero_h - 50;
}
}
}
}
```
游戏结束处理函数:
```c++
void game_over()
{
is_game_over = true;
putimage(boom_x, boom_y, &boom); // 绘制爆炸效果
settextcolor(WHITE);
outtextxy(WIDTH / 2 - 50, HEIGHT / 2, "Game Over"); // 绘制游戏结束文字
}
```
到这里,一个简单的飞机大战小游戏就完成了。完整代码如下:
阅读全文