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

  • 相关阅读:
    Log4j中conversionPattern的含义
    log4j.xml写入数据库,只有SQL和参数,无其他信息
    windows下根据进程ID强制杀死进程
    github简单使用教程
    junit mockito
    获取oracle 随机数
    循环插入oracle 存储过程
    2.1. 创建GitHub账号
    oracle 复制表结构表数据
    命令模式
  • 原文地址:https://www.cnblogs.com/hlywzj/p/10954688.html
Copyright © 2011-2022 走看看