基于C语言的飞行射击小游戏

本项目通过设计一个飞行射击小游戏,掌握利用C语言进行操作的方法。在本项目的设计中,运用了多种函数。
关键词:游戏设计;函数使用

目 录
绪 论 1
1 开发环境的搭建与技术介绍 2
1.1 VS2017简介 2
1.1.1 VS2017的安装 2
1.1.2 VS2017的编译环境介绍 2
2. 需求分析 3
2…1目标游戏要求 3
2. 2环境需求 3
2.3性能需求 3
3. 项目技术点 4
3.1启动欢迎界面 4
3.2游戏运行界面 4
3.2.1主要思想 4
3.2.2代码详解 5
3.2.3函数定义 5
3.2.3.1界面函数 5
3.2.3.2绘制与清除飞机函数 5
3.2.3.3运行刷新函数 6
3.2.3.4碰撞检测函数 6
3.2.3.5结束函数 6
3.2.3.6随机位置生成函数 6
3.2.3.界面控制常量 6
3.2.4结构体 6
3.2.4.1创建己方飞机位置结构体 7
3.2.4.2创建敌方飞机位置结构体 7
3.2.4.3创建己方飞机炮弹结构体 7
3.2.4.4创建敌方飞机炮弹结构体 7
3.2.4.5建敌方飞机横坐标随机参数及飞机大小 7
3.2.4.6创建敌方飞机移动随机参数 7
3.2.5开辟内存 7
3.2.5.1开辟指针型己方及敌方内存 8
3.2.5.2开辟指针型己方及敌方飞机炮弹内存 8
3.2.6光标操作 8
3.2.7简单绘制 8
3.2.7.1绘制墙壁 8
3.2.7.2绘制清除飞机和炮弹 8
3.2.8碰撞判断 8
3.2.8.1我方碰撞 8
3.2.8.2敌方碰撞 8
3.2.9主要业务逻辑 8
3.2.9.3敌方飞机移动 8
3.2.9.2重绘 8
3.2.10结束游戏 8
3.2.11绘制总控 8

3.3结束界面 8
3.4其他功能 8
3.5总代码 9

4 游戏效果及测试 10
4.1 运行效果 10
4.1.1 菜单主界面 10
4.1.2 人机对战结果 11
4.2 游戏测试 11
4.2.1 功能性测试例 11
4.2.2 游戏性能测试 11
2

绪 论
在计算机技术飞速发展的今天,游戏设计已经是一个较为热门的职业。飞行射击小游戏具有上手快,简单易行,特别适合当今人们碎片化时间的特点。
在本学期的《C语言课程设计》学习结束后,为体现本课程的学习成果,并锻炼基本的算法思想和实践针对稍大项目动手编程的能力,逐步掌握C语言的编程特点和思路,提高自己的开发应用能力,设计并实现了一款基于C语言的飞行射击小游戏。
在本项目开发过程中,主要经历项目的文档编写、游戏界面设计、代码编写、系统测试这些步骤。最后实现了一个界面美观、操作方便,功能丰富的飞行射击小游戏。本游戏的实现以C语言为开发环境,综合运用了函数,循环、等知识点。
通过本项目的实施,本人基本掌握了稍大或者大型项目程序设计方法及基本工程实现基础知识;能够运用程序设计基本原理、基础知识识别问题,并清楚、准确的表达出问题;能够结合特定问题的具体需求,使用软件工具和C语言进行项目设计和和编程实现;能根据项目功能模块运行情况进行代码优化和修正。综上,总体上较好的实现了本课程的教学目标,提升了自身的编程能力和工程实践能力。

1 开发环境的搭建与技术介绍
本章主要介绍了项目所使用的技术、开发软件和环境。其中开发环境使用了微软公司的开源集成编译工具VS2017,采用的开发语言是C语言。
1.1 VS2017简介
Microsoft Visual Studio是VS的全称。VS是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台
1.1.1 VS2017的安装
首先进入官网选择社区版Community下载,之后安装:installer界面,工作负载勾选使用C++的桌面开发和VS扩展开发。在安装位置选择,语言包选择(默认中文简体)后,安装SDK,最后完成环境搭建。

图1.1 VS2017安装界面
1.1.2 VS2017的编译环境介绍
微软发布了Visual Studio 2017这个版本,加入了开始界面。修复了 C++ 编译器 bug,现可正确折叠内联变量动态初始值设定项。vctip.exe 中的安全性改进。一个更改,让企业 IT 管理员和部署工程师可以配置 Microsoft 更新客户端和 SCCM 等工具,以确定 Microsoft 更新目录和 WSUS 上托管的 VS2017 更新的适用性。

2 需求分析和概要设计
本章首先介绍了飞行射击小游戏的理念和目标,详细阐述了游戏开发中实现的功能模块及对应的函数。
2.1 需求分析
本游戏属于休闲类的益智小游戏,适用于碎片化的时间操作。
2.1目标游戏要求
一个实时运行的一个实时运行的游戏,每秒都会运行成千上万事件,绘图事件,键盘事件都会以极高的频率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。因此,其逻辑设计应当相当严谨,须将所有可能发生的事件及意外情况考虑在设计中。

2.2环境需求
系统运行环境为操作系统Windows XP 或以上;分辨率的最佳效果800*600;系统开发工具使用VS2017。
2.3性能需求
应保证制作出来的游戏可被顺畅运行;
3.项目技术点
3.1启动欢迎界面
3.2游戏运行界面
3.2.1主要思想
核心主要依靠Sleep函数进行控制游戏的速度,由于CPU运行速度非常快,所以使用Sleep来减慢速度。其实使用Sleep相当于每隔一段时间绘制一张的图片,每个100毫秒绘制一次,也就是界面刷新一次

代码详解
函数定义
1、界面函数
这部分代码用来控制游戏界面

2、绘制与清除飞机函数

界面控制常量

结构体
开辟内存

光标操作

简单绘制

碰撞判断
主要业务逻辑

结束游戏
绘制总控

结束界面
结束界面显示
按任意键结束

总代码
见附件

4 游戏效果及测试
本章节主要展示了游戏的运行效果,并对游戏做了简单的测试。

4.1 运行效果
运行效果主要截取了3个界面,分别是开始页面、人机对战,人机对战结果。
4.1.1 开始页面

4.1.2 人机对战结果

4.2 游戏测试
4.2.1 功能性测试例
测试项目 结果
启动游戏 成功
人机对战 成功
移动己方飞机 成功
对方飞机移动 成功
发射子弹 成功
击中得分 成功
结果判定 成功
游戏结束 成功

4.2.2 游戏性能测试

参考文献
[1] 叶安胜, 鄢涛. C语言综合项目实战[M]. 北京:科学出版社, 2015
[2] 王家华. 软件工程[M]. 东北大学出版社,2007
[3] 苏冬娜,高俊涛. 基于计算机软件安全开发的JAVA编程语言研究[J]. 网络安全技术与应用,2017(49)
[4] https://blog.csdn.net/viafcccy/article/details/84262393 搜狗查询window.h
[5] https://baike.sogou.com/v74028107.htm?fromTitle=unsigned+int 百度查询unsigned
[6] https://blog.csdn.net/dark_cy/article/details/89103875 百度查询GetStdHandle
[7] https://baike.sogou.com/v72432554.htm?fromTitle=SetConsoleTextAttribute 查询
[8] https://blog.csdn.net/u010003835/article/details/45644057 查询MessageBox

致 谢
经过一学期的课程设计的学习,在老师的悉心指导下,我基本上完成了飞行射击小游戏的设计与实现,在设计期间,我查阅了大量的关于C语言的书籍,对C语言有了更进一步的认识,在编写程序时运用了平时课堂上学到的知识,对软件工程等有了更加深刻的理解,也让我学会了动画效果的展现,虽然实际效果欠佳。
本次游戏的设计与实现让我们进一步熟练了一下已学的知识,课堂上所学的内容在游戏中都得到了体现,也让我在以后的学习中更加坚定成为一名好程序员。课程设计是大学生活的一堂实践课程,也是一次令人难忘的经历。是一次对所学到知识的综合性的考验。
在此感谢老师,在这一学期中,老师认真教学,我们获得巨大的知识和各种帮助。同时老师无比认真的精神深深的感染了每一个人,将是我们学习的榜样。
附全代码#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<Windows.h>
#include<time.h>

//界面函数
void Cursor(int x, int y); //光标定位函数
void Draw(); //绘制初始化界面
void copy(); //绘制图标游戏名及版本号
void DrawWall(); //绘制墙壁
void runGame(); //游戏运行
void score(); //得分系统

//绘制与清除飞机函数
void DrawFly(); //绘制己方飞机
void CleanFly(); //清除己方飞机
void DrawDisFly(); //绘制敌方飞机
void CleanDisFly(); //清除敌方飞机
void DrawFlyBoo(); //绘制己方飞机炮弹
void DrawFlyBoo(int x, int y); //重载绘制带位置参数的己方炮弹
void CleanFlyoo(); //清除己方炮弹
void CleanFlyBoo(int x,int y); //重载清除带位置参数的己方炮弹
void DrawDisFlyBoo(); //绘制敌方飞机炮弹
void DrawDisFlyBoo(int x,int y); //重载绘制带位置参数的敌方炮弹
void CleanDisFlyBoo(); //清除敌方炮弹
void CleanDisFlyBoo(int x,int y); //重载清除带位置参数的敌方炮弹

//运行刷新函数
void ReDrawFly(); //重新绘制己方飞机
void ReDrawDisFly(); //重新绘制敌方飞机
void ReDrawFlyBoo(); //重新绘制己方炮弹
void ReDrawDisFlyBoo(); //重新绘制敌方炮弹
void DisFlyMove(); //控制敌方炮弹移动

//碰撞检测函数
void isFlyBoo(); //判断敌方飞机炮弹是否碰撞到己方飞机
void isDisFlyBoo(); //判断己方飞机炮弹是否碰撞到敌方飞机
void isUpFly(); //判断己方飞机是否升级
void isUpDisFly(); //判断敌方飞机是否升级

//结束函数
void OverDisFly(); //结束敌方飞机生命
void OverFly(); //结束己方飞机生命

//随机位置生成函数
void ProductDisFlyRander(); //生成敌方飞机横坐标随机位置
void MoveDisFlyRander(); //生成敌方飞机移动随机值

//界面控制
static const int Wall_x = 130; //设置墙壁宽度值
static const int Wall_y = 40; //设置墙壁高度值

//创建己方飞机位置结构体
struct _Fly{
int x, y;
};

//创建敌方飞机位置结构体
struct Dis_Fly{
int x, y;
};

//创建己方飞机炮弹结构体
struct FlyBoo{
int x, y;
struct FlyBoo *next;
};

//创建敌方飞机炮弹结构体
struct DisFlyBoo{
int x, y;
struct DisFlyBoo *next;
};

//设置刷新间隔时间SleepTime, 循环计数标志i, 当前循环计数标志i_now, 每次击中敌方飞机得分XXadd, 总得分XXscore, 当前击中敌方飞机得分XXscore_noe。
int SleepTime = 100, i = 0,i_now = 0, XXadd = 100, XXscore = 0, XXscore_now = 0;

//开辟指针型己方及敌方内存
_Fly* fly = (_Fly*)malloc(sizeof(_Fly));
Dis_Fly* disfly = (Dis_Fly*)malloc(sizeof(Dis_Fly));

//开辟指针型己方及敌方飞机炮弹内存
FlyBoo* flyboo = (FlyBoo*)malloc(sizeof(FlyBoo));
DisFlyBoo* disflyboo = (DisFlyBoo*)malloc(sizeof(DisFlyBoo));

//创建敌方飞机横坐标随机参数及飞机大小
struct DisFlyRander{
int disflyRander_x;
int disflybig;
}disflyRander;

//创建敌方飞机移动随机参数
struct DisFlyMoveRander{
int moveRander;
}disflymoveRander;

void ProductDisFlyRander(){
srand((unsigned)time(NULL));
disflyRander.disflyRander_x = (rand() % (Wall_x - 3 * disflyRander.disflybig) + disflyRander.disflybig) / 2 * 2 + 1;
//创建横坐标并使创建的横坐标在不可超出墙壁并处在偶数坐标格中(使用/2*2使得处在偶数格中)
}

void MoveDisFlyRander(){
srand((unsigned)time(NULL));
disflymoveRander.moveRander = rand() % 3 - 1;
//使生成-1,0,1的随机数控制敌方飞机向左,静止或向右运动
}

void Cursor(int x, int y){

COORD cursor;                                        //实例化结构体
HANDLE hOutput;                                     //实例化句柄
cursor.X = x;                                      //传入横坐标参数
cursor.Y = y;                                      //传入纵坐标参数
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);         //获取输出框界面句柄
SetConsoleCursorPosition(hOutput, cursor);          //定位坐标位置

}

void copy(){
Cursor(0,Wall_y / 2 - 6 );
printf(" ********************** * *\n");
printf(" * * *\n");
printf(" * * *\n");
printf(" * * *\n");
printf(" * * *\n");
printf(" * **\n");
printf(" * **\n");
printf(" * **\n");
printf(" * **\n");
printf(" * **\n");
printf(" * **\n");
printf(" *********************** ** 。 。 。\n");
Cursor(Wall_x-20, Wall_y );
printf(“打飞机 V 1.0”);
Cursor(0, Wall_y); //使光标处在左下角
}

void DrawWall(){
for (int i = 1; i < Wall_x; i+=2){
Cursor(i, 0); //定位上方墙壁
printf(“┰”); //绘制上方墙壁
Cursor(i, Wall_y); //定位下方墙壁
printf(“┸”); //绘制下方墙壁
}
}
void DrawFly(){
Cursor(fly->x, fly->y); //定位己方待绘制飞机位置
printf(“◢■◣”); //绘制己方飞机
}

void CleanFly(){
Cursor(fly->x, fly->y); //定位己方待清除飞机位置
printf(" "); //清除己方飞机
}

void DrawDisFly(){
Cursor(disfly->x, disfly->y); //定位敌方待绘制飞机位置
printf(“◥□◤”); //绘制敌方飞机
}

void CleanDisFly(){
Cursor(disfly->x, disfly->y); //定位敌方待清除飞机位置
printf(" "); //清除敌方飞机
}

void DrawFlyBoo(){
Cursor(flyboo->x, flyboo->y); //定位己方待绘制炮弹位置
printf(“★”); //绘制己方炮弹
}

void DrawFlyBoo(int x, int y){
Cursor(x, y); //定位己方待绘制炮弹位置
printf(“★”); //绘制己方炮弹
}

void CleanFlyBoo(){
Cursor(flyboo->x, flyboo->y); //定位己方待清除炮弹位置
printf(" “); //清除己方炮弹
}
void CleanFlyBoo(int x,int y){
Cursor(x, y); //定位己方待清除炮弹位置
printf(” "); //清除己方炮弹
}

void DrawDisFlyBoo(){
Cursor(disflyboo->x, disflyboo->y); //定位敌方待绘制炮弹位置
printf(“☆”); //绘制敌方炮弹
}

void DrawDisFlyBoo(int x, int y){
Cursor(x, y); //定位敌方待绘制炮弹位置
printf(“☆”); //绘制敌方炮弹
}

void CleanDisFlyBoo(){
Cursor(disflyboo->x, disflyboo->y); //定位敌方待清除炮弹位置
printf(" "); //清除敌方炮弹
}

void CleanDisFlyBoo(int x,int y){
Cursor(x, y); //定位敌方待清除炮弹位置
printf(" "); //清除敌方炮弹
}

void ReDrawFly(){
if (GetAsyncKeyState(VK_LEFT) && fly->x > 4){ //当用户键入左键
CleanFly(); //清除原有己方飞机
fly->x -= 2; //向左移动单位网格长度
DrawFly(); //重新绘制己方飞机
}
else if (GetAsyncKeyState(VK_RIGHT) && fly->x < Wall_x - 4){ //当用户键入右键
CleanFly(); //清除原有己方飞机
fly->x += 2; //向右移动单位网格长度
DrawFly(); //重新绘制己方飞机
}
else{
DrawFly(); //若用户没有键入按键,进行刷新己方飞机,防止得分刷新覆盖
}
}

void ReDrawDisFly(){
DrawDisFly(); //当敌方飞机死亡时,进行重新绘制

}

void ReDrawFlyBoo(){
FlyBoo* temp_flyboo = (FlyBoo*)malloc(sizeof(FlyBoo)); //开辟指针型己方临时飞机炮弹内存
temp_flyboo->next = NULL; //将其链接接口赋值为空

//清除原有己方飞机炮弹
temp_flyboo = flyboo; //通过临时变量进行下游查找遍历
do{ //至少进行一次遍历,普适第一枚己方炮弹
CleanFlyBoo(temp_flyboo->x,temp_flyboo->y); //清除己方飞机炮弹
temp_flyboo = temp_flyboo->next; //指向下游节点
} while (temp_flyboo != NULL); //遍历至最后一枚己方炮弹

//将每个炮弹进行向上移动
temp_flyboo = flyboo; //通过临时变量进行下游查找遍历
do{ //至少进行一次遍历,普适第一枚己方炮弹
temp_flyboo->y -= 1; //将每一枚己方炮弹纵坐标减一
temp_flyboo = temp_flyboo->next; //指向下游节点
} while (temp_flyboo != NULL); //遍历至最后一枚己方炮弹

//依照当前己方飞机链接新炮弹
FlyBoo* next_flyboo = (FlyBoo*)malloc(sizeof(FlyBoo)); //开辟指针型递进己方飞机炮弹内存
next_flyboo->x = fly->x + 2; //通过当前己方飞机横坐标位置定位己方炮弹横坐标位置
next_flyboo->y = fly->y - 1; //通过当前己方飞机纵坐标位置定位己方炮弹纵坐标位置
next_flyboo->next = flyboo; //将炮弹首部控制在前端
flyboo = next_flyboo;

//将己方炮弹全部重绘
temp_flyboo = flyboo; //通过临时变量进行下游查找遍历
do{ //至少进行一次遍历,普适第一枚己方炮弹
DrawFlyBoo(temp_flyboo->x, temp_flyboo->y); //绘制己方炮弹
temp_flyboo = temp_flyboo->next; //指向下游节点
} while (temp_flyboo != NULL); //遍历至最后一枚己方炮弹

//判断己方炮弹是否超出画布
if (i > 5){ //避免己方初始炮弹无二阶next指向
temp_flyboo = flyboo; //通过临时变量进行下游查找遍历
while (temp_flyboo->next->next != NULL) //查找至炮弹第后三个,避免无法指定释放内存炮弹上游指向为空
temp_flyboo = temp_flyboo->next; //指向下游节点

 if (temp_flyboo->next->y <= 1){                                   //当己方飞机炮弹末端纵坐标小于墙面时CleanFlyBoo(temp_flyboo->next->x, temp_flyboo->next->y); //清除己方飞机炮弹free(temp_flyboo->next);                                   //释放己方飞机炮弹末端内存空间temp_flyboo->next = NULL;                                   //使被释放空间上游节点指向为空}
}
i++;                                                              //运行循环次数递增

}

void ReDrawDisFlyBoo(){
DisFlyBoo* temp_disflyboo = (DisFlyBoo*)malloc(sizeof(DisFlyBoo)); //开辟指针型敌方临时飞机炮弹内存
temp_disflyboo->next = NULL; //将其链接接口赋值为空

//清除原有敌方飞机炮弹
temp_disflyboo = disflyboo; //通过临时变量进行下游查找遍历
do{ //至少进行一次遍历,普适第一枚敌方炮弹
CleanDisFlyBoo(temp_disflyboo->x,temp_disflyboo->y); //清除敌方飞机炮弹
temp_disflyboo = temp_disflyboo->next; //指向下游节点
} while (temp_disflyboo != NULL); //遍历至最后一枚敌方炮弹

//将每个炮弹进行向上移动
temp_disflyboo = disflyboo; //通过临时变量进行下游查找遍历
do{ //至少进行一次遍历,普适第一枚敌方炮弹
temp_disflyboo->y += 1; //将每一枚敌方炮弹纵坐标减一
temp_disflyboo = temp_disflyboo->next; //指向下游节点
} while (temp_disflyboo != NULL); //遍历至最后一枚敌方炮弹

//依照当前敌方飞机链接新炮弹
DisFlyBoo* next_disflyboo = (DisFlyBoo*)malloc(sizeof(DisFlyBoo)); //开辟指针型递进敌方飞机炮弹内存
next_disflyboo->x = disfly->x + 2; //通过当前敌方飞机横坐标位置定位敌方炮弹横坐标位置
next_disflyboo->y = disfly->y + 1; //通过当前敌方飞机纵坐标位置定位敌方炮弹纵坐标位置
next_disflyboo->next = disflyboo; //将炮弹首部控制在前端
disflyboo = next_disflyboo;

//将敌方炮弹全部重绘
temp_disflyboo = disflyboo; //通过临时变量进行下游查找遍历
do{ //至少进行一次遍历,普适第一枚敌方炮弹
DrawDisFlyBoo(temp_disflyboo->x, temp_disflyboo->y); //绘制敌方炮弹
temp_disflyboo = temp_disflyboo->next; //指向下游节点
} while (temp_disflyboo != NULL); //遍历至最后一枚敌方炮弹

//判断敌方炮弹是否超出画布
if (i > 5){ //避免敌方初始炮弹无二阶next指向
temp_disflyboo = disflyboo; //通过临时变量进行下游查找遍历
while (temp_disflyboo->next->next != NULL) //查找至炮弹第后三个,避免无法指定释放内存炮弹上游指向为空
temp_disflyboo = temp_disflyboo->next; //指向下游节点

 if (temp_disflyboo->next->y >= Wall_y - 1){                       //当敌方飞机炮弹末端纵坐标小于墙面时CleanDisFlyBoo(temp_disflyboo->next->x, temp_disflyboo->next->y);    //清除敌方飞机炮弹free(temp_disflyboo->next);                                    //释放敌方飞机炮弹末端内存空间temp_disflyboo->next = NULL;                                //使被释放空间上游节点指向为空}
}

}

void DisFlyMove(){
MoveDisFlyRander(); //调用随机函数生成运动随机数
if (!(disfly->x > Wall_x - 5 && disflymoveRander.moveRander > 0) && !(disfly->x < 5 && disflymoveRander.moveRander < 0)){
//控股敌方飞机运动至墙面边界时无法持续滑动
CleanDisFly(); //将原有敌方飞机清除
disfly->x += disflymoveRander.moveRander; //向指定随机方向进行运动
DrawDisFly(); //重新绘制敌方飞机
}
}

void score(){
if ((XXscore != XXscore_now)||(i<=(i_now+3))){ //当飞机的得分更新或显示次数小于三次时
Cursor(0, Wall_y - i + i_now); //将光标指向墙面左下角并向上递减输出
printf("%d !!! %d !!! %d", XXscore, XXscore, XXscore); //输出当前得分
}
}

void isFlyBoo(){
DisFlyBoo* temp_disflyboo = (DisFlyBoo*)malloc(sizeof(DisFlyBoo)); //开辟指针型临时敌方飞机炮弹内存
temp_disflyboo = disflyboo; //通过临时变量进行下游遍历查找
do{
if ((temp_disflyboo->x >= fly->x) && (temp_disflyboo->x <= fly->x + 6) && (temp_disflyboo->y == fly->y - 1)) //当敌方飞机炮弹位于己方飞机平面坐标时
OverFly(); //执行结束己方飞机生命函数
temp_disflyboo = temp_disflyboo->next; //指向下游节点
} while (temp_disflyboo != NULL); //遍历至最后一枚敌方炮弹

}

void isDisFlyBoo(){
FlyBoo* temp_flyboo = (FlyBoo*)malloc(sizeof(FlyBoo)); //开辟指针型临时己方飞机炮弹内存
temp_flyboo = flyboo; //通过临时变量进行下游遍历查找
do{
if ((temp_flyboo->x >= disfly->x) && (temp_flyboo->x <= disfly->x + 6) && (temp_flyboo->y == disfly->y + 1)) //当己方飞机炮弹位于敌方飞机平面坐标时
OverDisFly(); //执行结束敌方飞机生命函数
temp_flyboo = temp_flyboo->next; //指向下游节点
} while (temp_flyboo != NULL); //遍历至最后一枚己方炮弹
}

void isUpFly(){
//待创建
}

void isUpDisFly(){
//待创建
}

void OverDisFly(){
CleanDisFly(); //清除敌方飞机
ProductDisFlyRander(); //生成敌方飞机待生成位置随机函数
disfly->x = disflyRander.disflyRander_x + 2; //指定敌方飞机所在横坐标
disfly->y = 2; //指定敌方飞机所在纵坐标
DrawDisFly(); //绘制敌方飞机
XXscore += XXadd; //更新当前得分
i_now = i; //更新当前循环计数器
XXscore_now = XXscore; //更新当前分数计数器

}

void Draw(){
system(“mode con cols=132 lines=42”); //改变DOS大小
copy(); //绘制商标信息
system(“pause”); //使用户按任意键继续
system(“cls”); //清屏,防止欠覆盖留白
DrawWall(); //绘制墙体

//初始化己方飞机
fly->x = Wall_x / 2; //依照墙体指定己方飞机横坐标
fly->y = Wall_y - 1; //依照墙体指定己方飞机纵坐标
DrawFly(); //绘制己方飞机

//初始化敌方飞机
ProductDisFlyRander(); //生成敌方飞机待生成位置随机函数
disfly->x = disflyRander.disflyRander_x + 2; //依照随机数指定敌方飞机横坐标
disfly->y = 2; //依照随机数指定敌方飞机纵坐标
DrawDisFly(); //绘制敌方飞机

//绘制己方飞机炮弹
disflyRander.disflybig = 6; //指定敌方飞机初始大小
flyboo->x = fly->x + 2; //依照当前己方飞机横坐标指定己方飞机炮弹横坐标
flyboo->y = fly->y - 1; //依照当前己方飞机纵坐标指定己方飞机炮弹纵坐标
flyboo->next = NULL; //将初始飞机炮弹下游指向位置赋值为空
DrawFlyBoo(); //绘制己方飞机炮弹

//绘制敌方飞机炮弹
disflyboo->x = disfly->x + 2; //依照当前敌方飞机横坐标指定敌方飞机炮弹横坐标
disflyboo->y = disfly->y + 1; //依照当前敌方飞机纵坐标指定敌方飞机炮弹纵坐标
disflyboo->next = NULL; //将初始飞机炮弹下游指向位置赋值为空
DrawDisFlyBoo(); //绘制敌方飞机炮弹
}

void runGame(){
while (1){ //进行游戏循环
isFlyBoo();
isDisFlyBoo();
ReDrawFly();
ReDrawDisFly();
ReDrawFlyBoo();
ReDrawDisFlyBoo();
DisFlyMove();
isUpFly();
isUpDisFly();
score();
Sleep(SleepTime);
}
}

void OverFly(){
Sleep(600); //给予失败证据提示
system(“cls”); //清屏
for (int i = 0; i <= 500; i++) //进行失败效果制作
printf("Game Over! "); //输出游戏失败
system(“pause”); //等待用户按任意键退出游戏
exit(0); //结束游戏关闭程序
}

int main(){

Draw();                                                  //进行初始化绘制
runGame();                                              //进行游戏运行

}

2021-06-11相关推荐

  1. 【离散数学】 SEU - 28 - 2021/06/11 - Lattice and Boolean Algebra

    Discrete Mathematical Structures (6th Edition) 2021/06/09 - Lattice and Boolean Algebra Lattice and ...

  2. 2021双11上云狂欢节 | 爆款产品底价全面开售

    一年一度的双11狂欢节终于来啦!怎样用最少的钱获得最多的福利?下面这份攻略收藏好,这波活动快冲! 双11主会场:http://click.aliyun.com/m/1000304310/ 01 领取双 ...

  3. 2021年11月国产数据库排行榜:openGauss闯入前三,Kingbase流行度与日俱增,TDengine厚积薄发

    点击蓝字 关注我们 2021年11月的国产数据库流行度排行榜已在墨天轮发布,本月共有163家数据库参与排名.就前15名的总体情况来看,除openGauss反超OceanBase闯入前三,TDengin ...

  4. 2021年11月线上消费信贷市场用户洞察:头部效应明显,绿色金融成新风口

    根据易观千帆数据显示,2021年11月,中国线上消费信贷市场用户活跃人数达到5697万人.尽管消费需求的下降叠加部分消费场景趋严致使近半年来活跃人数走低,但环比看已出现回升迹象,从7月份的-7.7%恢 ...

  5. 2021年11月墨天轮国产数据库排行榜:openGauss闯入前三,Kingbase流行度与日俱增,TDengine厚积薄发

    2021年11月的国产数据库流行度排行榜已在墨天轮发布,本月共有163家数据库参与排名.就前15名的总体情况来看,除openGauss反超OceanBase闯入前三,TDengine厚积薄发来到第15 ...

  6. Mculover666的博客文章导航(嵌入式宝藏站)(2021.06.17更新)

    一.MCU系列 1. 开发环境 [Keil MDK](一)Keil MDK 5.28 的下载.安装.破解 [Keil MDK](二)Keil MDK中芯片器件包的安装 [Keil MDK](三)Kei ...

  7. 2021年11月份中国最具影响力的50位钧瓷匠人排行榜

    数据来源 钧瓷内参,钧瓷数据库 排名算法 上榜和排名算法与10项规则有关,其中和个人的知名度,影响力,用户评价,平台指数正相关: 制作流程 协同制作--协同评审--联合发布 制作成员 人民日报人民号, ...

  8. 2021年11月中国主要城市进出口总额排行榜:太原市进出口总额同比和环比均呈下降趋势(附月榜TOP35详单)

        榜单解读:     2021年11月全国进出口总额为5793.39亿美元,同比增长26.06%,环比增长12.3%,出口额占进出口总额比重为56.19%,贸易差值为717.11亿美元,呈现贸易 ...

  9. 2021.4.11 字节跳动实习笔试题---情报解密

    2021.4.11 字节跳动实习笔试题-情报解密 题目内容 题目内容: 给你一个字符串,该字符串中有数字,字母(字母只有大写字母)以及一些其他的字符(例如:%,.等),如果首字母为字母或者数字的话,就 ...

  10. Drupal7 将到2021年11月结束支持,请注意升级

    Drupal Association 宣布, 2011年1月释出的 Drupal 7 将到2021年11月结束支持,这意味着 Drupal 安全团队将不会继续为 Drupal 7 核心或模块.主题等提 ...

最新文章

  1. MySql 隐式转换
  2. iOS之深入解析UmbrellaFramework的封装与应用
  3. linux系统性能测试之虚拟内存管理篇
  4. iOS打电话发短信发邮件总结
  5. 数据--dp,线段树优化
  6. python turtle画动物_如何用python画简单的动物
  7. axios的介绍与页面配置---axios工作笔记003
  8. php 的cookie设置时间,php cookie时间设置的方法
  9. 给next添加彩色标签
  10. 选择mysql开发的原因_MySQL开发技巧
  11. matlab怎么算方差和标准差,matlab用var函数算出的方差和标准差求解释~
  12. 华为网络配置(ACL)
  13. NetDxf读取DXF文件
  14. Android 使用Notification进行消息提示
  15. 辽宁大学计算机专业基础考试题型,2018年辽宁大学854计算机专业基础考研大纲...
  16. 拉普拉斯-Laplacian
  17. Linux系统安装Anaconda3保姆级教程
  18. 查看浏览器dns缓存
  19. 小孩发烧请慎用抗病毒类药物!
  20. 2.4G与5GWiFi频段的区别

热门文章

  1. 使用Qt给微信头像添加国旗
  2. Endnote 插入文献导致word崩溃!!解决方法
  3. python数据分析入门之高效的学习路径
  4. 计算机语言运行速度排名,2019年的编程语言排行榜你知道吗
  5. temp不停生成临时文件 win10_c盘temp文件夹自动生成大量TMP文件。
  6. 知识追踪常见建模方法之IRT项目反应理论
  7. 网站一直不被收录怎么办,让网站收录更好的五个方法
  8. RecyclerView系列:GridLayoutManager的构造函数中的orientation理解
  9. 厦大计算机 专硕 分数线,厦门大学2020年专硕复试分数线
  10. 人体姿态估计之CPN中文文献翻译