飞机大战小游戏
·一、需求设计
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<stdio.h> #include<string.h> #include<conio.h>//清屏所需头文件 #include<windows.h>//清屏所需头文件 #include<stdlib.h>
//*********定义全局变量*********
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 <= high -1; i++) { map[i][1] = 4; for (j = 2; j <= width - 1; j++) map[i][j] = 0; map[i][width] = 4; } //下方围墙的初始化 i = high; for (j = 1; j <= width; 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 <= position_y + 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();//与输入无关的更新
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;
}
}
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 <= high; i++) { for (j = 1; j <= width; 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); }