【项目简介】
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<iostream>
#include <conio.h>
#include <cstdlib>
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<<endl;}
cout<<"得分: "<<de_fen<<" "<<"剩余生命: "<<sheng_ming<<" "<<endl;
cout<<"剩余关卡:"<<sheng_yu<<" "<<" speed:"<<speed<<" "<<endl;
}
void wu_cao_zuo()
{
if(zidan_weizhi_i>-1) zidan_weizhi_i--;//子弹向上移动
if(speed<sheng_yu) speed++;//速度增加
if(speed==sheng_yu)
{
if(diji_weizhi_i<gao_du) {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<<"你赢啦"<<endl;break;} //剩余关卡为0时游戏胜利
if(sheng_ming==0) {cout<<"你失败了"<<endl;break;}//剩余生命为0时游戏失败
}
cout<<"******游戏结束啦*****"<<endl;
return 0;}
【程序最终运行情况】
1.开始运行
代表游戏开始,空格键表示攻击。从“我”发出“凸”,“敌机”随机生成并从顶端下落。当“凸”遇到“敌机”时界面清除,子弹和飞机一起消失,得分加1,当“敌机”到达下边界时则生命减1,击中敌机两次后,敌机速度会提高。
2.暂停游戏
当鼠标左键点击界面时,点击处会变成白点然后游戏暂停,再次操作键盘游戏会继续进行。
3.游戏失败
如果剩余剩余生命为1时 敌机落入我方最后一行代表游戏失败,也可以理解为剩余生命为0时游戏失败。显示“你失败了”并且游戏结束。
4.游戏胜利
如果剩余关卡为0时则代表游戏结束,显示“你赢了”并且游戏结束。
(注:可以更改初始化函数里的剩余生命以及剩余关卡或者更改if(de_fen%2==0)整除的数大小来改变每击中几个敌通过一关来改变关卡难度)
基础知识点:
谭浩强.C++面向对象程序设计(第三版)北京:清华出版社.2020
【12】for循环推广应用:文章来源:https://uudwc.com/A/9L66O
刘春茂,李琪.C语言程序设计案例(第一版)北京:清华出版社.2018文章来源地址https://uudwc.com/A/9L66O