南京工程学院毕业设计说明书(论文)
ptemp->next = head; ptemp->pre = NULL; head = ptemp;
if (eat = Eated(head, fd))
{
CreatFood(fd,head);
score += grade; /*吃到了,就加分*/ scorelimit += grade;
if (scorelimit / 50 && grade <= 10) /*这个用来增加等级。*/
{ /*每过一次50分,等级
增加一次,10级是上限 */
GotoRood(START_X, START_Y - 1); printf(\ scorelimit = score % 50; }
GotoRood(START_X + 10, START_Y - 1);
printf(\ }
if (GameOver(head)) /*游戏是否结束....*/ {
BuildSnk(head); /*留下最后的英姿。。。吃货该死..*/ GotoRood(START_X + SCREEN_WIDTH / 2, START_Y + SCREEN_LENGTH
/ 2);
puts(\小菜鸟,你输了\\n\ return; }
CollisionTest(head); /*碰撞测试*/ BuildSnk(head);
Sleep((10 - grade) * 50); /*延时...程序会暂停(10 - grade)*50ms 的
时间, windows.h里的函数*/
}
- 18 -
南京工程学院毕业设计说明书(论文)
} 程序分析:
gaming()函数是游戏的主要部分,难点在表示蛇的新位置并消除前一次的图形。采用的方法是每次移动的时候从最后一节开始到倒数第二节(因蛇头为两节),将前一节的坐标赋值给后一节的坐标,移动后只要把最后一节用背景色去除即可,因为新位置0到n-l节还是要出现在画面上的。然后蛇头按照方向键来更改位置。
另外,食物的随机出现要确保它的位置在10的倍数位置上,因为蛇的坐标都是以10为模的,这样的话就可以让蛇吃到,蛇吃到食物的判断是蛇头的坐标和食物的坐标相等。 其算法过程为:
(1)设置初始值。为防止食物总出现在一个位置上,要设置随机数发生器,真正产生随机数。初始时,蛇只有蛇头,设定一个开始的方向。
(2)循环执行,直到按Esc键退出。 (3)没有按键的情况下,循环执行。
如果没有食物,随机出现食物;如果有食物,则显示食物,蛇移动身体,根据蛇的方向改变坐标值,并判断蛇是否自己吃了自己,如果出现这种情况,则蛇死,调用游戏结束函数GameOver(),结束本次游戏,重新开始。如果蛇吃到了食物,蛇身体长一节,数组元素增加一个,身体节数、分数都进行相应的改变。在新位置画出蛇。
(4)如果有按键,则识别键值。如果按键为Esc键则结束游戏,程序运行结束;如果所按键为方向键,则根据该键改变代表蛇方向的变量direction的值,要考虑相反方向键无效。
4.4其他函数的代码: 4.4.1 构建蛇身
void BuildSnk(SNAKE *head) /*构造蛇身*/ {
SNAKE *p = head;
- 19 -
南京工程学院毕业设计说明书(论文)
}
while (p != NULL) {
GotoRood(p->x, p->y); printf(\ p = p->next; }
4.4.2蛇的移动方向函数
void Move(int *d) /*移动方向。。。 上下左右 上:72 下:80 左:75 右:77*/
{
char ch; while(_kbhit()) {
ch = getch(); if (ch == 72) {
if ((*d == left || *d == right) && *d != down) *d = up; }
else if (ch == 80)
{
if ((*d == left || *d == right) && *d != up)
*d = down;
}
else if (ch == 75) {
if ((*d == up || *d == down) && *d != right) *d = left;
- 20 -
}
南京工程学院毕业设计说明书(论文)
else if (ch == 77)
{
if ((*d == up || *d == down) && *d != left)
}
*d = right;
}
程序分析:
这里我们首先要明确一个函数kbhit()函数(VC++6.0下为_kbhit()),该函数的功能及返回值为:检查当前是否有键盘输入,若有则返回一个非0值,否则返回0。那么接下来所有的问题便可迎刃而解了
这里用到的是C语言当中的if语句和复合运算符,例如 if (ch == 72)
{
if ((*d == left || *d == right) && *d != down) *d = up; }
其中,ch == 72 和(*d == left || *d == right) && *d != down为真的意思是说,如果贪吃蛇之前的运动为向左或者向右但是绝对不会是向下时,那么贪吃蛇接下来的运动只会是向上。同理,贪吃蛇向左、向右、向下的实现也是一样的。
第五章 结 论
我做的是贪吃蛇游戏。简单的一个,但对我一个初学者来说却是一个很大的困难。更加是第一次做毕业设计,所以在后期编写程序时老是停滞不前,最主要是不知从何开始,这个时候才知道上课老师们不厌其烦的教导是多么的宝贵,这个时候才后悔上课的时候没有认真的听讲。可是现在一切都晚了,还好时间还算是充裕,只好拿出书本重新复习一下。特别是结构体,指针的部分,几乎是一片空白。不过经过几天的努力,大体上把课本上的知识点看了一遍,知识点也都基
- 21 -
南京工程学院毕业设计说明书(论文)
本是撑握了,所以下一步就是开始正式的编写程序了。不过毕竟是个新手,还是不知如何下手,于是就在网上下了一篇类似的程序,经过仔细的研究,终于读懂了C语言编程的基本过程和方法。 经过一波三折,终于开始正式编程。
编程是一件很枯燥很无聊的事情,但是出于完成作业,得到学分的压力,还必须强破自己坚持下去,按照老师所说的模块化思想,分部分的进行编写。而且编程是一件高精度、模范化的事情,稍有疏乎都会影响全局,也可能因为某一处的小的错误而导致整个程序的无法运行。所以认真仔细就是非常重要的了。开始的时候真的感觉编程是一件很无聊的事情,不过当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。又经过几天的努力,终于把程序完成了,尽管程序还是有很多错误和漏洞,不过还是很高兴的。无论如何是自己的劳动成果,是自己经过努力得到的成绩,同时也是学习C语言的一次实践作业,自己进步的证明。
虽然说,设计的过程是艰苦的,但是其中所带给我的快乐却是不言而喻的。但看到贪吃蛇游戏活灵活现地呈现在屏幕上时,给我的感觉是皇天不负苦心人,台上十分钟,台下十年功啊!!
- 22 -