一、实验项目名称
飞机大战
二、实验项目功能描述(用自己的语言描述)
1.用鼠标控制飞机移动。
2.发射子弹:按鼠标左键后飞机发射子弹。
3.增加敌机:敌机自动向下运动,从边界消失后会重新出现,
4.判断胜败:子弹击中敌机加分,敌机撞击我机游戏失败,并增加我机爆炸的图片效果。
5.增加音效:增加背景音乐、发射子弹音效、飞机爆炸音效、得分奖励音效。
三、项目模块结构介绍(文字+总体模型)
#include<graphics.h>
#include<conio.h>
#include<math.h>
#include<stdio.h>
#pragma comment(lib,"Winmm.lib")
#define High 768 //游戏画面尺寸
#define Width 512
IMAGE img_bk; //背景图片
int position_x,position_y; //飞机的位置
int bullet_x,bullet_y; //子弹的位置
float enemy_x,enemy_y; //敌机的位置
IMAGE img_planeExplode1,img_planeExplode2; //爆炸飞机图片
IMAGE img_planeNormal1,img_planeNormal2; //飞机图片
IMAGE img_bullet1,img_bullet2; //子弹图片
IMAGE img_enemyPlane1,img_enemyPlane2; //敌机图片
int isExpolde=0; //飞机是否爆炸
int score=0; //得分
void startup()
{
mciSendString("open C:\Users\admin\Desktop\飞机大战游戏素材\game_music.mp3 alia bkmusic",NULL,0,NULL); //打开背景音乐
mciSendString("play bkmusic repeat",NULL,0,NULL); //循环播放
initgraph(Width,High);
loadimage(&img_bk,"C:\Users\admin\Desktop\飞机大战游戏素材\地图.jpg");
loadimage(&img_planeNormal1,"C:\Users\admin\Desktop\飞机大战游戏素材\飞机背景.jpg");
loadimage(&img_planeNormal2,"C:\Users\admin\Desktop\飞机大战游戏素材\一个飞机.jpg");
loadimage(&img_bullet1,"C:\Users\admin\Desktop\飞机大战游戏素材\子弹背景.jpg");
loadimage(&img_bullet2,"C:\Users\admin\Desktop\飞机大战游戏素材\子弹.jpg");
loadimage(&img_enemyPlane1,"C:\Users\admin\Desktop\飞机大战游戏素材\敌机背景.jpg");
loadimage(&img_enemyPlane2,"C:\Users\admin\Desktop\飞机大战游戏素材\敌机.jpg");
loadimage(&img_planeExplode1,"C:\Users\admin\Desktop\飞机大战游戏素材\飞机爆炸背景.jpg");
loadimage(&img_planeExplode2,"C:\Users\admin\Desktop\飞机大战游戏素材\飞机爆炸.jpg");
position_x=High*0.7;
position_y=Width*0.5;
bullet_x=position_x;
bullet_y=-85;
enemy_x=Width*0.5;
enemy_y=10;
BeginBatchDraw();
}
void show() //显示图片和得分
{
putimage(0,0,&img_bk); //显示背景
if(isExpolde==0)
{
putimage(position_x-58,position_y-60,&img_planeNormal1,NOTSRCERASE); //显示飞机
putimage(position_x-58,position_y-60,&img_planeNormal2,SRCINVERT);
putimage(bullet_x-9.5,bullet_y,&img_bullet1,NOTSRCERASE); //显示子弹
putimage(bullet_x-9.5,bullet_y,&img_bullet2,SRCINVERT);
putimage(enemy_x,enemy_y,&img_enemyPlane1,NOTSRCERASE); //显示敌机
putimage(enemy_x,enemy_y,&img_enemyPlane2,SRCINVERT);
}
else
{
putimage(position_x-41,position_y-43,&img_planeExplode1,NOTSRCERASE);
//显示爆炸飞机
putimage(position_x-41,position_y-43,&img_planeExplode2,SRCINVERT);
}
outtextxy(Width*0.48,High*0.95,"得分:"); //显示得分
char s[5];
sprintf(s,"%d",score);
outtextxy(Width*0.55,High*0.95,s);
FlushBatchDraw();
Sleep(1);
}
void updateWithoutInput() //与用户输入无关的更新
{
if(isExpolde==0)
{
if(bullet_y>-25)
bullet_y=bullet_y-3;
if(enemy_y<High-25)
enemy_y=enemy_y+0.5;
else
enemy_y=10;
if(abs(bullet_x-enemy_x-52)+abs(bullet_y-enemy_y-74)<50) //子弹击中敌机
{
enemy_x=rand()%Width; //rand()为随机函数
enemy_y=-40;
bullet_y=-85;
mciSendString("close gemusic",NULL,0,NULL); //先把前面一次的音乐关闭
mciSendString("open C:\Users\admin\Desktop\飞机大战游戏素材\gotEnemy.mp3 alias gemusic",NULL,0,NULL);
//打开音乐
mciSendString("play gemusic",NULL,0,NULL); //仅播放一次
score++;
if(score>0&&score%5==0&&score%2!=0)
{
mciSendString("close 5music",NULL,0,NULL); //先把前面一次的音乐关闭
mciSendString("open C:\Users\admin\Desktop\飞机大战游戏素材\5.mp3 alias 5music",NULL,0,NULL); //打开音乐
mciSendString("play 5music",NULL,0,NULL); //仅播放一次
}
if(score%10==0)
{
mciSendString("close 10music",NULL,0,NULL); //先把前面一次的音乐关闭
mciSendString("open C:\Users\admin\Desktop\飞机大战游戏素材\10.mp3 alias 10music",NULL,0,NULL); //打开音乐
mciSendString("play 10music",NULL,0,NULL); //仅播放一次
}
}
if(abs(position_x-enemy_x-52)+abs(position_y-enemy_y-74)<80) //敌机撞击我机
{
isExpolde=1;
mciSendString("close exmusic",NULL,0,NULL); //先把前面一次的音乐关闭
mciSendString("open C:\Users\admin\Desktop\飞机大战游戏素材\explode.mp3 alias 10music",NULL,0,NULL); //打开音乐
mciSendString("play exmusic",NULL,0,NULL); //仅播放一次
}
}
}
void updateWithInput() //与用户输入有关的更新
{
if(isExpolde==0)
{
MOUSEMSG m; //定义鼠标消息
while(MouseHit()) //这个函数用于检测当前是否有鼠标消息
{
m=GetMouseMsg();
if(m.uMsg == WM_MOUSEMOVE)
{
//飞机的位置等于鼠标所在的位置
position_x=m.x;
position_y=m.y;
}
else if(m.uMsg == WM_LBUTTONDOWN)
{
//按下鼠标左键发射子弹
bullet_x=position_x;
bullet_y=position_y-43;
mciSendString("close fgmusic",NULL,0,NULL); //先把前面一次的音乐关闭
mciSendString("open C:\Users\admin\Desktop\飞机大战游戏素材\f_gun.mp3 alias fgmusic",NULL,0,NULL); //打开音乐
mciSendString("play fgmusic",NULL,0,NULL); //仅播放一次
}
}
}
}
void gameover()
{
EndBatchDraw();
getch();
closegraph();
}
int main()
{
startup(); //数据初始化
while(1) //游戏循环执行
{
show(); //显示画面
updateWithoutInput(); //与用户输入无关的更新
updateWithInput(); //与用户输入有关的更新
}
gameover(); //游戏结束,进行后续处理
return 0;
}
四、实现界面展示(截图)
五、代码托管链接
https://gitee.com/heleiya/he_lei.git
六、实验总结(提出问题+解决办法+感想)
为什么游戏每次发出音效前游戏画面会有卡顿现象?
因为是直接将游戏源码编译运行,尝试将游戏源码组建成exe程序后运行,问题解决。
做一个游戏不容易,需要我更加认真的去学习,一步一步来,游戏完美运行的时候还是很有成就感的。