2019 春第1次课程设计实验报告

Posted hlywzj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019 春第1次课程设计实验报告相关的知识,希望对你有一定的参考价值。

一、实验项目名称

飞机大战

二、实验项目功能描述(用自己的语言描述)

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程序后运行,问题解决。
做一个游戏不容易,需要我更加认真的去学习,一步一步来,游戏完美运行的时候还是很有成就感的。

以上是关于2019 春第1次课程设计实验报告的主要内容,如果未能解决你的问题,请参考以下文章

2019春第四次课程设计实验报告

2019春第三次课程设计实验报告

2019春第三次课程设计实验报告

2019春第二次课程设计实验报告

2019春第二次课程设计实验报告

2019春第三次课程设计实验报告