【项目简介】
1、设计思想:本项目主要是为了实现打飞机游戏,主要包括5个函数模块,和1个主函数框架。分别是chu_shi_hua();、you_cao_zuo;、wu_cao_zuo();、show();、main();等。项目完成过程中主要运用了C/C++中的输入输出流、调用函数、for循环函数、“清屏”函数、随机函数、以及无限循环函数等基本知识点。其中最难的三个函数模块设计思想如下:
(1)、构建主函数:首先得确定一堆数据的初始值,然后利用无限循环刷新函数实现游戏的运行。其中包含四个函数模块分别为数据初始化、游戏界面显示、无操作时函数、有操作时函数(按键)以及结束游戏语句即剩余关卡为0时游戏胜利,剩余生命为0时游戏失败。
(2)、编写游戏界面函数:为了让界面动起来,我选择了刷新函数,然后通过定义行和列来确定游戏中物体的位置,并在刷新的过程中实现行或者列的递增。
(3)、编写无操作函数:该函数里包含了速度的递增和击中与未击中和随机生成敌人语句。其中没击中两个敌人则速度加1 是通过的分判断例如if(de_fen%2==0) {level++;sheng_yu-=1;}。而击中敌人则隐藏子弹并且重新生成敌人,未击中则在生命减一的条件下随机生成一个敌人。
本项目是由小组成员共同协作完成,其中数据初始化模块由林正燃完成,无按键操作函数模块由薛泽鹏完成,其余函数由曹晶完成。
2、设计框架
(1)总体设计及功能框架
(2)打飞机游戏流程图
【使用工具】
Dev-C++
【数据结构】
int gao_du; //界面高度:20
int kuan_du; //界面宽度:25
int diji_weizhi_j; //敌机位置 列:rand()%宽度;
int diji_weizhi_i; // 行:0
int wo_weizhi_i; //我的位置:列:宽度/2
int wo_weizhi_j; // 行:高度-1;
int zidan_weizhi_i; //子弹位置:列:我的位置的列
int zidan_weihzi_j; // 行:-1;
int de_fen; //得分:0
int level; //速度等级:0
int speed=0; //速度:0
int sheng_yu=9; //剩余关卡:9
int sheng_ming=5; //剩余生命:10
【最终程序】
#include
#include
#include
using namespace std;
int gao_du,kuan_du;
int dij_weizhi_j,diji_weizhi_i;
int wo_weizhi_i ,wo_weizhi_j ;
int zidan_weizhi_i,zidan_weihzi_j;
int de_fen,level;
int speed=0,sheng_yu=9,sheng_ming=5;
void chu_shi_hua()//确定一堆初始值
{gao_du=20; kuan_du=25;
dij_weizhi_j=4; diji_weizhi_i=0;
wo_weizhi_i =gao_du-1; wo_weizhi_j=kuan_du/2;
zidan_weizhi_i=-1; zidan_weihzi_j=wo_weizhi_j;
diji_weizhi_i=0; dij_weizhi_j=rand()%kuan_du;//随机生成敌机
de_fen=0; level=0;}
void show()//显示画面
{system("cls");//就是执行命令清屏的意思。
int i,j;
for (i=0; i<=gao_du;i++)
{for (j=0; j<=kuan_du;j++)
{ if(i==wo_weizhi_i &&j==wo_weizhi_j) cout<<"我";//weizhi_i,weizhi_j分别表示我所在位置的行和列
else if(i==zidan_weizhi_i&&j==zidan_weihzi_j) cout<<"凸";//同上
else if(i==diji_weizhi_i&&j==dij_weizhi_j) cout<<"敌机";
else if(i==gao_du) cout<<'-';
else if(j==kuan_du) cout<<'&';//输出边界
else cout<<' ';}
cout< cout<<"得分: "< cout<<"剩余关卡:"< } void wu_cao_zuo() { if(zidan_weizhi_i>-1) zidan_weizhi_i--;//子弹向上移动 if(speed if(speed==sheng_yu) { if(diji_weizhi_i else {diji_weizhi_i=0;dij_weizhi_j=rand()%kuan_du;} speed=0;} if(zidan_weizhi_i==diji_weizhi_i&&zidan_weihzi_j==dij_weizhi_j)//击中 {zidan_weizhi_i=-1;//隐藏子弹 diji_weizhi_i=0;//重新生成敌机 dij_weizhi_j=rand()%kuan_du; de_fen++; if(de_fen%2==0) //每击中两个通过一关 {level++;sheng_yu-=1;}} if (wo_weizhi_i ==diji_weizhi_i&&wo_weizhi_j==dij_weizhi_j||diji_weizhi_i==gao_du-1) //击中 {sheng_ming--; diji_weizhi_i=0; dij_weizhi_j=rand()%kuan_du;} //生命值减一并且在随机生成一个敌机 } void you_cao_zuo() {char ch; if (_kbhit())//按键时 kbhit() 在执行时,检测是否有按键按下。 {ch=_getch(); if(ch=='a') wo_weizhi_j--; if(ch=='d') wo_weizhi_j++; if(ch=='w') wo_weizhi_i--; if(ch=='s') wo_weizhi_i++; if(ch==' ') {zidan_weizhi_i=wo_weizhi_i -1;zidan_weihzi_j=wo_weizhi_j;}//子弹从我的位置发出 }} int main() { chu_shi_hua(); //确定一堆初始值 while (true) //无线循环以下操作 { show(); //显示屏幕 wu_cao_zuo(); //该函数是指在没有键盘输入时要做的 you_cao_zuo(); //该函数时有键盘输入时要做的 if(sheng_yu<=0) {cout<<"你赢啦"< if(sheng_ming==0) {cout<<"你失败了"< } cout<<"******游戏结束啦*****"< return 0;} 【程序最终运行情况】 1.开始运行 代表游戏开始,空格键表示攻击。从“我”发出“凸”,“敌机”随机生成并从顶端下落。当“凸”遇到“敌机”时界面清除,子弹和飞机一起消失,得分加1,当“敌机”到达下边界时则生命减1,击中敌机两次后,敌机速度会提高。 2.暂停游戏 当鼠标左键点击界面时,点击处会变成白点然后游戏暂停,再次操作键盘游戏会继续进行。 3.游戏失败 如果剩余剩余生命为1时 敌机落入我方最后一行代表游戏失败,也可以理解为剩余生命为0时游戏失败。显示“你失败了”并且游戏结束。 4.游戏胜利 如果剩余关卡为0时则代表游戏结束,显示“你赢了”并且游戏结束。 (注:可以更改初始化函数里的剩余生命以及剩余关卡或者更改if(de_fen%2==0)整除的数大小来改变每击中几个敌通过一关来改变关卡难度) 基础知识点: 谭浩强.C++面向对象程序设计(第三版)北京:清华出版社.2020 【12】for循环推广应用: 刘春茂,李琪.C语言程序设计案例(第一版)北京:清华出版社.2018