2.1 程序功能介绍
贪吃蛇游戏是一款经典的小游戏。 一条蛇在封闭的墙壁里。 一块食物随机出现在墙上。 您可以通过按键盘上的四个光标键来控制蛇的上、下、左、右移动。 如果蛇用头撞倒食物,食物就会被吃掉。 如果掉落,蛇的身体会长成一段,同时记录10点。 然后食物就会出现,等待蛇吃。 如果蛇在移动时撞到墙壁或穿过身体,游戏就会结束。
2.2 总体方案设计说明
一个游戏必须有开始部分、运行部分和结束部分(实际上开始部分和运行部分是一体的)。
2.2.1 设计思路
这个程序的关键是表现蛇的形状和蛇的运动。 用一个小矩形代表蛇身体的一部分。 对于身体的每个部分,添加一个矩形块,并使用两个部分来代表蛇的头部。 移动时必须从蛇头开始,所以蛇不能向相反方向移动,即蛇尾不能变成蛇头。 如果不按任何键,蛇会自行朝当前方向前进。 当玩家按下有效的方向键时,蛇的头部会向指定方向移动,一步移动其身体的一部分。 因此,当按下有效的方向键时,蛇的头部就会向指定的方向移动。 首先确定蛇头的位置,然后蛇的身体随着蛇头移动。 图形是通过从蛇头的新位置绘制蛇来实现的。 此时,由于青萍的缺失,原来的蛇的位置与新蛇的位置相差了一个单位。 所以看起来社会多了一个身体部分,所以蛇的最后一部分被背景颜色覆盖。食物的出现和消失也被绘制并用矩形块覆盖。
2.2.2 数据结构设计及使用说明
开始部分:
游戏运行在图形模式下,所以第一步必须要初始化图形模式,然后要有一个启动界面,就像一本书有一个封面一样。 我为游戏设置了标题画面。 除了游戏标题画面之外,我还设置了一个欢迎画面。 标题画面之后,必须初始化游戏的运行部分,包括绘制游戏运行时的背景以及初始化游戏的一些重要变量。
运行部分:
作为游戏的核心部分,功能很多,也就是模块很多。 首先我来模拟一下贪吃蛇的游戏模式:在某个世界里突然出现一条蛇。 它很短,而且运动神经异常。 它无法阻止其多动症。 在它的世界里,只有食物。 它非常饥饿和贪婪。 同样,不知什么原因,食物从天而降,但不幸的是它并没有落到它的嘴里。 饥饿的主角,无论有毒与否,都径直向食物爬去,也不问食物从何而来; 它吃了食物,超乎想象的同化能力让食物很快成为它身体的一部分,它的身体也变得更长。 当它吃掉第一粒食物的时候,上帝给了它第二粒食物,所以它吃了第二粒食物,它又长长了,然后又出现了第三粒……它的身体一直在变长,它也不在乎。 。 他的长身体的问题是他很难转身并继续吃东西。 现在他只要张大嘴,让食物有一个绿色通道就可以了。 但有一天下午,它咬了自己,它想起自己是一条毒蛇,于是就晕了过去(没有中毒死); 或者当它冲向食物时,它失去控制并撞到了墙上。
第一循环:第一步,食物出现; 第二步,蛇继续移动; 第三步,检查蛇是否撞到自己或墙壁; 从第四步开始,游戏有两个分支(A,B):
A:第四步,蛇不接触自身或墙壁,蛇继续向前移动,画出蛇的动作; 第五步,判断蛇是否吃过食物,如果蛇吃了食物,它的身体变长,原来的食物消失; 第六步,让玩家输入控制指令,让蛇在下一个循环的第二步中改变运动方向; 第七步,第二轮第一步,重复第一轮步骤;
B:第四步,如果蛇碰到了自己或者墙壁,游戏就会终止。
结束部分:
游戏结束时显示“GAME OVER”,这是常见的规则,我的游戏也不例外。 除了游戏结束画面之外,我还设置了游戏退出画面,“善始善终”。
通过上面的粗略划分,我把整个程序分成了(13+2)个模块(实际上是函数)
2.2.3 程序结构(流程图)
图 2.1 流程图
根据需要处理的任务需求,规划输入数据和输出结果,并决定存储数据的数据结构。
C语言中的数据结构主要体现在数据类型上。 因此,在设计C语言编程时,应该对程序中使用到的变量、数组、指针等进行整体规划,以及它们的类型。 这个非常重要。 如果这期间选择了不合适的变量或数组,以后修改起来会非常困难。
现在分析贪吃蛇游戏中的元素,并在程序中得到它们对应的描述:
蛇:
基本描述:长度、颜色、位置。
对应的数据和数据类型: 长度——虽然可以用坐标来表示,但是这样的话,计算量会很大,所以换算成一个更大的单位——节数,由每节固定描述长度; 坐标 - 整数; color--整数类型; 位置——X、Y坐标。
新增描述:蛇的运动方向、蛇的生命。
对应的数据和数据类型:这些描述是为了连接程序的按键输入部分和游戏结束判断部分。 只有四个方向:上、下、左、右。 可以设置四个对应的整数:3、4、2、1。人生只有两种情况:死或生,对应0或1。
食物:
基本描述:颜色、位置。
对应的数据和数据类型:由于颜色设置是固定的,所以不再讨论。 位置—X、Y 坐标。
添加描述:食物的存在。
对应的数据和数据类型:这是为了避免食物重复出现而设置的,与绘制食物的功能有关。 只有两个值:0 或 1(没有食物或存在食物)
其他元素:墙,因为它作为显示中的背景存在,所以没有说明实际的墙是由四条直线组成的框架,通过坐标来描述。
还需要变量:键盘上输入的键值(如全局变量、整数); 经常使用的循环变量; 自定义填充图案; 解释性文本的字符数组; 比赛成绩; 游戏速度(贪吃蛇速度)。
图2.2 蛇不停运动关键算法流程图
2.2.4 各模块功能及程序说明
主要模块的实现思路和算法流程图说明:
关键点——蛇不停地移动():
蛇的不断移动意味着蛇的下一段取代了上一段的位置。 在计算机中,蛇的下一节的位置坐标成为上一节的位置坐标。 上面,蛇的位置坐标被定义为数组类型。 一组坐标对应于一个部分的位置。 假设有 i+1 个部分,从第 0 部分到第 i 部分。 第i个截面的坐标取第i-1个截面的坐标。 第i-1节的坐标取第i-2节的坐标...直到第1节取第0节的坐标。第0节的坐标,即蛇头的坐标,需要在一定时间内改变方向,变化量就是蛇各节的长度。 蛇的坐标旋转需要一个循环语句来继续它。
2.2.5 程序结果
运行程序得到如下初始界面图:
图2.3 程序结果图
用一个小矩形代表蛇身体的一部分。 对于身体的每个部分,添加一个矩形块。 蛇的头部由两部分表示:
图2.4 程序结果图
蛇在不接触自身或墙壁的情况下继续移动:
图2.5 程序结果图
游戏结束时,显示“GAME OVER”
图2.6 程序结果图
2.3 程序源码及注释
#N 200
#
#
#
#左边
# 正确的
#向下
#向上
#ESC键
int i,键;
int 分数=0;/*分数*/
int =50000;/*调整游戏速度*/
食物
int x;/*食物的横坐标*/
int y;/*食物的纵坐标*/
int yes;/*决定食物是否应该出现的变量*/
}食物;/*食物结构*/
蛇
int x[N];
整数y[N];
int node;/*蛇节点数量*/
int ;/*蛇移动方向*/
int life;/* 蛇的生命,0活着,1死*/
}蛇;
void Init(void);/*图形驱动*/
void Close(void);/*图形结束*/
void DrawK(void);/*启动画面*/
void (void);/*游戏结束*/
void (void);/*玩游戏的具体流程*/
void (void);/*输出结果*/
/*主功能*/
无效主(无效)
init();/*图形驱动*/
DrawK();/*启动画面*/
();/*玩游戏的具体流程*/
Close();/*图形结束*/
/*图形驱动*/
无效初始化(无效)
int gd=,gm;
();
(&gd,&gm,"c:\\文件\\\\tc20h\\bgi");
();
/*启动画面,左上角(50, 40)和右下角(610, 460)坐标的墙*/
无效DrawK(无效)
/*();*/
(11);
(,0,);/*设置线型*/
for(i=50;i455)/*蛇是否撞墙*/
();/*游戏结束*/
蛇.life=1; /*蛇死了*/
if(snake.life==1)/*经过以上两个判断,如果蛇死了,则跳出内循环,重新开始*/
休息;
if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃完食物后*/
(0);/*移除屏幕上的食物*/
(食物.x,食物.y,食物.x+10,食物.y-10);
Snake.x[snake.node]=-20;snake.y[snake.node]=-20;
/*新的首先被放置在不可见的位置,下一次循环会占据上一个的位置*/
Snake.node++;/*蛇的身体有一段长*/
food.yes=1;/*新食物需要出现在屏幕上*/
分数+=10;
();/*输出新分数*/
(4);/*画一条蛇*/
for(i=0;(蛇.x[i],蛇.y[i],蛇.x[i]+10,
蛇.y[i]-10);
延迟();
(0);/*用黑色去掉蛇的最后一段*/
(snake.x[snake.node-1],snake.y[snake.node-1],
Snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
} /*(!kbhit)*/
if(snake.life==1)/*如果蛇死了,则跳出循环*/
休息;
key=(0);/*接收密钥*/
if(key==ESC)/*按ESC键退出*/
休息;
别的
if(key==UP&&snake.!=4)
/*判断是否向相反方向移动*/
蛇.=3;
别的
if(key==RIGHT&&snake.!=2)
蛇.=1;
别的
if(key==LEFT&&snake.!=1)
蛇.=2;
别的
if(key==DOWN&&snake.!=3)
蛇.=4;
}/*(1)*/
/*游戏结束*/
无效(无效)
();
();
(红色的);
(0,0,4);
(200,200,“游戏结束”);
getch();
/*输出结果*/
无效(无效)
字符str[10];
(,);
酒吧(50,15,220,35);
(6);
(0,0,2);
(str,"分数:%d",分数);
(55,20,str);
/*图形结束*/
无效关闭(无效)
getch();
();
第三章 课程设计总结
课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要组成部分。 是对我们实际工作能力的一个具体的训练和检验过程。 随着科学技术的飞速发展,如今的计算机应用在生活中可以说是无处不在。 因此,作为21世纪的大学,掌握程序开发技术非常重要,而C语言是最常用、功能最强大的高级语言,因此设计好C语言课程是非常有必要的。 回顾这次课程设计,我们的感触还是很多的。 确实,从拿到题目到完成整个编程,从理论到实践,在整整半个月的时间里,我们可以学到很多东西,而且不仅可以巩固之前学过的知识,还学到了很多以前没有学到的知识。书本上学过的。 通过本次课程设计,我们了解到理论与实践相结合非常重要。 仅有理论知识是远远不够的。 只有将所学的理论知识与实践相结合,从理论中得出结论,才能真正服务于社会,从而提高自己的实践能力和独立思考能力。设计过程中遇到问题可以说是非常困难的。 毕竟这是我第一次做,难免会遇到各种各样的问题。 同时,我在设计过程中也发现了自己的不足。 我对以前学过的一些知识理解不够深入,掌握得还不够牢固,比如结构体、指针、链表……通过这次课程设计
最后我们回顾了之前所学的知识。
我所做的就是制作贪吃蛇游戏。 虽然很简单,但是对于我这个初学者来说却是一个很大的困难。 这是我第一次设计课程,所以第一天我在机房里泡了一个下午,但毫无进展。 最重要的是我不知道从哪里开始。 这时我才意识到老师们孜孜不倦的教导是多么的可贵。 我后悔上课时没有认真听讲。 但现在已经太晚了。 好在时间还充裕,只好把书拿出来重新温习一遍。 尤其是结构和指针部分几乎是空白。 不过,经过几天的努力,我大致把课本上的知识点都看完了,也基本掌握了,那么下一步就是开始正式编程了。 但我毕竟是新手,还是不知道如何下手,所以就在网上下载了一个类似的程序。 经过认真研究,我终于了解了C语言编程的基本流程和方法。通过
经过一番周折,正式节目终于开始了。
编程是一件很枯燥无味的事情,但是出于完成作业和拿学分的压力,你必须强迫自己坚持下去,按照老师提到的模块化思想分部分写。 而且编程是一个高精度、标准化的事情。 稍有疏忽就会影响全局,或者一处的小错误可能会导致整个程序无法运行。 所以小心非常重要。 一开始,我确实觉得编程是一件很枯燥的事情,但是当一个程序运行成功的时候,那种喜悦是难以言喻的,成就感是无法比拟的。 经过几天的努力,我终于完成了程序。 虽然程序还有很多错误和漏洞,但我还是很高兴。无论如何,这都是自己的劳动成果,是自己努力的结果。
这是学习C语言的一项实际作业,也是你进步的证明。
通过这次课程设计,我对C语言有了进一步的了解。 为了学好它,我需要注重实践。 只有通过不断的电脑操作,我才能学得更好。 我也发现自己还有很多不足。 首先,我的指法不太好,经常按错字母,通过学习有所提高; 其次,我对C语言的一些标准库函数了解不多,对函数调用的正确使用不熟悉,对C语言经常出现的错误也不太了解。 通过实践学习,我认识到要学好计算机,必须注重实际操作。 不仅仅是学习C语言,还包括其他语言和其他计算机知识。 练习,以便在以后的学习过程中
这学期我会更加注重实际操作,以便学好计算机。
在课程设计过程中,我在增长知识、提高能力的同时,也学到了很多人生哲理。 我知道如何制定计划,如何执行计划,以及如何克服执行过程中的心理问题。 心情不好。