·一、需求设计
1.为检测C语言的学习成果,根据所学的C语言知识,设计程序:飞机大战小游戏;
2.自行定义变量,函数或结构体,编写源代码并进行编译运行测试;
3.根据编写的代码,自行攥写实验报告;
·二、 系统设计
1 实验题目:
飞机大战小游戏
2 游戏描述
飞机大战是一款惊险刺激的射击游戏,通过控制飞机的上下左右移动,发射子弹,击退敌机并赢得分数,玩游戏既可以锻炼人的反应能力,也可以起到放松身心的作用.
进行C语言面向对象程序设计课程设计主要是在学习C语言这门面向对象语言的基础上,并通过实践加深对 C语言面向对象程序设计语言特点的认识与理解。同时,可以提高运用C编程语言解决实际问题的能力;锻炼实际的编程能力;还能提高调查研究、查阅技术文 献、资料以及编写软件设计文档的能力。
3 功能要求
【1】 实现游戏难度的选择,飞机模型以及界面的外观设计等的功能。
【2】 实现方向操移动的操作和敌机随机生成功能。
【3】 分数计算功能。
【4】 游戏的开始,暂停,结束以及分数显示的功能。
三、概要设计
1 简要设计及所涉及的知识
运用二维数组的加减和循环来设计游戏.通过下,xy的加减实现位置的移动;然后用一系列函数,实现各功能;
2 功能描述
(1) 难度选择: 1为困难,2为一般,3为简单,Enter开始游戏;
(2) 操作:按1235控制飞机左下右上移动,空格发射子弹,按8暂停,按0停止游戏并输出分数;;
(3) 游戏的测评方式为计分制,每击中一架敌机分数加1,无分数限制;
·四 详细设计
1定义全局变量
(1) long long int speed = 0;//控制敌机的速度
(2) int position_x, position_y;//飞机的所在位置
(3) int high, width;//地图的大小
(4) int bullet_x, bullet_y;//子弹的位置
(5) int enemy_x, enemy_y;//敌人的位置
(6) int map[MAX][MAX];
(7) /地图符号说明:0表示空白,1表示战机的区域,2表示敌人战机的位置。
(8) 3表示上下围墙,4表示左右围墙,5表示子弹的位置*/
(9) int score,time,degree,choice;//分数,时间,难度,重新开始
2 定义功能函数
(1) void starup();//初始化所有的信息
(2) void startMap();//地图内容初始化
(3) void HideCursor();//隐藏光标 ,不会出现光标的闪烁
(4)void gotoxy(int x, int y);//清理一部分屏幕
(5)void updateWithoutInput();//与输入无关的更新
(6)void updateWithInput();//与输入有关的更新
(7)void show();//展示的内容
(8)int menu();//菜单初始化
(9)void showend();//结束菜单
(10)void stop();//暂停游戏
3 制作流程
飞机大战的主要实现的功能是让飞机移动,飞机的移动可以通过二维数组实现,首先对飞机的坐标设置初值为屏幕的中间位置,通过横纵坐标的加减实现左右移动,每移动一个单位清屏一次;
第二个过程是随机产生敌机,我们可以定义一个随机数组[]0][y],y是随机产生的,通过x++实现敌机的前进;在定义一个void函数,当输入空格键时,在当前飞机所在的位置产生一个子弹[x][y],之后x递减,从而实现子弹的前进;
第三,当敌机和子弹的坐标相同时,子弹击中敌机,此时将此刻的敌机和子弹同时清除,分数加1,并随机生成一架敌机,;或当飞机飞出规定区域后,清除该敌机并随机生成;
实现这三个功能后即可完成基本的操作;之后需要考虑的是敌机速度的调控,在每次敌机x++之前添加一次循环.飞机前进的速度与循环的次数成正比;这样就实现了速度的快慢;
剩下的问题就是完善其他简单的内容,如难度选择,分数的输出,界面设置及游戏的暂停和终止等;
五、系统实现与测试
5 .1 开始游戏测试
图5-1-1 游戏开始及难度选择界面
5.2难度选择
图5-2-1 难度1 困难模式
图5-2-2 难度2 一般模式
图5-2-3 难度3 简单模式
难度选择后,按Enter开始游戏
5.3 游戏开始
图5-3-1 游戏开始界面
图5-3-2 游戏正在进行的截图
按1 2 3 5 进行←↓→↑移动,按 空格 发射子弹射击
5.4 游戏暂停
图5-4-1 暂停界面
按8 暂停游戏 ,再次输入8 继续游戏
5.5 游戏结束
图5-5-1 游戏结束界面
按0结束游戏,并会输出游戏得分,按任意键退出游戏;
5.6 综合说明
游戏开始后,先进行难度选择.1 2 3依次为困难,一般和简单,玩家可根据自身喜好进行难度选择;难度选择好后按Enter开始游戏,进入游戏后,按1 2 3 5 进行←↓→↑移动,按 空格 发射子弹射击,对准敌机进行射击,
六、结论与心得
通过这段时间学习的C语言课程设计,学会了很多同时也收获了很多,学会了如何根据根据问题去思考解决的思路,和编写代码;虽然这个过程有点枯燥乏味,有时半天都没思路,想不出该怎么写怎么算,但是等到真的想到思路的时候,会发现自己之前的付出是值得的,那种喜悦感非常棒;
而且还收获了好多知识,不光有上学期学到的C语言知识,还有还有好多编程方面的技巧和经验,这些东西对以后的学习和工作会有很大的帮助;最后通过本次大作业可有让自己对所学过的知识加以整理和检验,既可以整理C语言和编程知识,还可以检验自己的一些缺点和不足,为以后的学习和工作打下基础;
七、 源代码
1、int main();//主函数
#include#include<string.h> #include //清屏所需头文件 #include //清屏所需头文件 #include
//*定义全局变量*
long long int speed = 0;//控制敌机的速度
int position_x, position_y;//飞机的所在位置
int high, width;//地图的大小
int bullet_x, bullet_y;//子弹的位置
int enemy_x, enemy_y;//敌人的位置
int map[MAX][MAX];
/地图符号说明:0表示空白,1表示战机的区域,2表示敌人战机的位置。
3表示上下围墙,4表示左右围墙,5表示子弹的位置*/
int score,time,degree,choice;//分数,时间,难度,重新开始
//*定义功能函数**
void starup();//初始化所有的信息
void startMap();//地图内容初始化
void HideCursor();//隐藏光标 ,不会出现光标的闪烁
void gotoxy(int x, int y);//清理一部分屏幕
void updateWithoutInput();//与输入无关的更新
void updateWithInput();//与输入有关的更新
void show();//展示的内容
int menu();//菜单初始化
void showend();//结束菜单
void stop();//暂停游戏
#define MAX 100
int main()
{
int a;
if(menu())
starup();
while (1)
{
HideCursor();
startMap();
show();
updateWithoutInput();
updateWithInput();
}
return 0;
}
2、void starup();//初始化所有的信息
void starup()//初始化所有的信息
{
high = 20;
width = 30;
position_x = high / 2;
position_y = width / 2;
bullet_x = 0;
bullet_y = position_y;
enemy_x = 2;
enemy_y = position_y - 1;
score = 0;
}
3、void startMap();//地图内容初始化
void startMap()//地图内容初始化
{
int i, j;
for (i = 1; i 1; i++)
{
map[i][1] = 4;
for (j = 2; j 1; j++)
map[i][j] = 0;
map[i][width] = 4;
}
//下方围墙的初始化
i = high;
for (j = 1; j )
map[i][j] = 3;
map[bullet_x][bullet_y] = 5;
/*这里是战机大小的初始化开始*/
map[position_x - 1][position_y] = 1;
i = position_x;
for (j = position_y - 2; j 2; j++)
map[i][j] = 1;
map[position_x + 1][position_y - 1] = 1;
map[position_x + 1][position_y + 1] = 1;
/*** 初始化结束 **/
/* 敌人战机的初始化 */
map[enemy_x][enemy_y] = 2;
map[enemy_x - 1][enemy_y - 1] = 2;
map[enemy_x - 1][enemy_y + 1] = 2;
/* 敌人战机初始化结束*/
}
4、void HideCursor();//隐藏光标 ,不会出现光标的闪烁
void HideCursor()//隐藏光标 ,不会出现光标的闪烁
{
CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
5、void gotoxy(int x, int y);//清理一部分屏幕
void gotoxy(int x, int y)//清理一部分屏幕
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle, pos);
}
6、void updateWithoutInput();//与输入无关的更新
undefined
void updateWithoutInput()//与输入无关的更新
{
if (bullet_x > 0)//实现子弹的前进
bullet_x--;
if (((bullet_x == enemy_x) && (bullet_y == enemy_y))||((bullet_x == enemy_x-1) && (bullet_y == enemy_y-1))||((bullet_x == enemy_x+1) && (bullet_y == enemy_y+1)))//当敌人的飞机被击中时,同时清子弹和飞机
{
score++;
enemy_x = 0;
enemy_y = rand() % width;//随机产生新敌机
bullet_x = 0;
}
else if (enemy_x > high)//当飞机超出区域
{
enemy_x = 0;
enemy_y = rand() % width;//随机产生新敌机
}
if (speed == 1)
for (int i = 1; i 10*(15*degree-10); i++)//用来控制敌机的速度 ,通过循环的次数实现
{
for (int j = 1; j 10000; j++)
{
speed = 1;
}
}
speed = 0;
if (speed == 0)
{
enemy_x++;
speed = 1;
}
}
undefined
7、void updateWithInput();//与输入有关的更新
void updateWithInput()//与输入有关的更新
{
char input;
if (kbhit())
{
input = getch();
if (input == '1')
position_y--;
if (input == '2')
position_x++;
if (input == '3')
position_y++;
if (input == '5')
position_x--;
if (input =='8')
stop();
if( input=='0')
showend();
if (input == ' ')
{
bullet_x = position_x - 1;
bullet_y = position_y;
}
}
}
8、void show();//展示的内容
void show()//展示的内容
{
gotoxy(0, 0);
int i, j;
for (i = 1; i )
{
for (j = 1; j )
{
if (map[i][j] == 0)
printf(" ");// 活动空间
if (map[i][j] == 1)
printf("*");//控制的飞机
if (map[i][j] == 2)
printf("#");//敌方飞机
if (map[i][j] == 3)
printf("~");//下边界
if (map[i][j] == 4)
printf("|");//左右边界
if (map[i][j] == 5)
printf(":");//子弹
}
printf("\n");
}
printf("\n你的得分:%d\n\n", score);
printf("操作说明: 1235分别操作 左下右上四个的移动\n");
printf("**空格是发出子弹**\n");
}
9、int menu();//菜单初始化
int menu()
{
printf("******************************\n") ;
printf("* *\n") ;
printf("* 欢迎来到飞机大战 *\n") ;
printf("* *\n") ;
printf("* Hard == 1 *\n") ;
printf("* Normal == 2 *\n") ;
printf("* Easy == 3 *\n") ;
printf("* *\n") ;
printf("* Enter开始游戏 *\n") ;
printf("* *\n") ;
printf("* *\n") ;
printf("******************************\n") ;
scanf("%d",°ree);
system("cls");
return degree;
}
10、void showend();//结束菜单
void showend()
{
int s;
system("cls");
printf("******************************\n") ;
printf("* *\n") ;
printf("* Gime Over ! *\n") ;
printf("* *\n") ;
printf("* Your scores are %d! *\n",score);
printf("* *\n") ;
printf("* Very Good ! *\n") ;
printf("* *\n") ;
printf("* 按任意键退出 *\n") ;
printf("* *\n") ;
printf("* *\n") ;
printf("* *\n") ;
printf("******************************\n") ;
exit(0);
}
11、void stop();//暂停游戏
void stop()
{
int s;
system("cls");
printf("******************************\n") ;
printf("* *\n") ;
printf("* Gime Pause ! *\n") ;
printf("* *\n") ;
printf("* Your scores are %d! *\n",score);
printf("* *\n") ;
printf("* 按8继续游戏 *\n") ;
printf("* *\n") ;
printf("* 按任意键退出 *\n") ;
printf("* *\n") ;
printf("* *\n") ;
printf("* *\n") ;
printf("******************************\n") ;
scanf("%d",&s);
if(s!=8)
exit(0);
}
Original: https://www.cnblogs.com/zhang-a-d/p/14846105.html
Author: 他乡一故知
Title: 经典实验–飞机大战小游戏
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/616938/
转载文章受原作者版权保护。转载请注明原作者出处!