贪吃蛇实习报告

贪吃蛇实习报告
贪吃蛇实习报告

计算机实习报告

姓名:王宁

班级: 2009211106

学号: 09210181

班内序号:31

指导老师:丘广晖

题目:贪吃蛇

邮箱:348266485@https://www.360docs.net/doc/cc16049447.html,

贪吃蛇实验报告

一.功能说明

1.1总体功能说明

概况:一条蛇在密闭的围墙内,在围墙内出现食物,通过按键控制蛇向上下左右四个方向移动,蛇撞到食物,则食物被吃掉,蛇的身体增加一节。如果蛇在移动的过程中,撞到墙壁或身体的交叉(蛇头撞到自己的身体),则游戏结束。

特色:①暂停功能:能随时通过按键来暂停游戏,再按一次则继续游戏。

②速度调节功能:当分数达到某个值后,对蛇的移动速度进行一定的提升。

③毒果:增加另一种的毒果食物,蛇吃到该种食物后gameover。

④音效功能:吃掉食物、撞墙、在游戏结束时有不同的音效。

1.2用户界面

主要是在围墙可以控制蛇吃到果实,同时分数就会升一分。侧边栏标出了主要的功能键和等级,积分。

1.3使用方法

上下左右键控制蛇的运动,还有任意键控制游戏开始,空格键控制暂停,当游戏的得分超过一定数,蛇的速度就会加快,

二.程序设计说明2.1 总体设计框架

2.2 关键算法描述

算法一:

自定义函数:

void movesnake(HANDLE hOutput,int snakex[],int snakey[],int len,WORD wColors[]);

移动蛇的函数,参数主要是蛇的坐标

void fruit(HANDLE hOutput,int snakex[],int snakey[],int *x ,int *y,WORD wColors[]);

产生水果的函数,参数主要是蛇的坐标,和水果的坐标。使用了数组和指针

void p_fruit(HANDLE hOutput,int snakex[],int snakey[],int *x ,int *y,WORD wColors[]); void put_fruit(int *x,int *y,int len,int snakex[],int snakey[]);

放置果实的函数

int level(HANDLE handle,int s,int p,char buf[],WORD wColors[]);

等级判断函数,传递了一个存放分数的数组,速度,分数参数

算法二:

系统函数

textout(HANDLE handle,int x,int y,WORD Wcolors[],”“)

专门用来输出一些字符,图案,主要参数就是字符的横纵坐标

_kbhit()

检测是否有按键按下

_getch()

获取按键的值

Sleep(n)

是程序休眠n毫秒

srand( (unsigned)time( NULL ));

随机数的种子函数,以时间做参数

rand()

产生伪随机数序列,后面一般会跟%n,代表取0到n的整数。

2.3 程序设计的难点和关键点

⑴蛇的图形的输出及蛇的移动方向。蛇头要用一个二维数组表示,身体要随蛇头一起运动。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,而且转弯的时候会出现断裂。

⑵检测蛇有无撞到食物、围墙或是自己的身体。当蛇开始移动之后,需要判断蛇头情况,然后根据位置是空白、食物、围墙还是蛇的身体来做出相应的反应。可以用一个二维数组来表示整个场景,对不同的地方赋予不同的值。

⑶果实的随机产生。当食物被吃掉后,要重新随机产生。利用随机函数rand产生随机数并将该随机数布置到符合场景大小的范围中来,而且不能和蛇身重叠了,所以要判断蛇身后在出现果实,以此作为食物位置的横纵坐标。

2.4 调试的方法

问题一:蛇头吃到果实的表示,起初简单认为只要果实和蛇头初始坐标重合,就代表吃到了果实,可是忽略了任何图形和文字在c++中横坐标都占两格,也就是果实和蛇头都有两个横坐标,但蛇头从果实的边缘擦过,他也会吃了果实,但是坐标没有重合,下一个果实也就不会出现,然后我就想到把它们的坐标都变成偶数就可以实现了重合。

问题二:当撞到墙或者自己之后,蛇不会停下,而是继续往前走,然后我就用了一个停止函数getch()。

问题三:果实出现的时候,不能和蛇身重合,所以需要从蛇头一节一节的判断之后,才可以出现果实。

2.5 程序性能评价

从运行效果来看,优点主要是蛇运动顺畅,屏幕初始化美观,不足是蛇的长度,屏幕的长宽度有限,只能玩几关就不可以玩了。

从程序设计上来说,优点主要有简洁,明了,音乐的设置,速度升级,毒果的设置难度,各种文字移动和色彩的闪耀,不足是没有奖励机制,没有更多的功能。

三.心得体会

刚开始时,一直失败,好多错误,其实就是些基本的错误,比如变量的定义,整型变量的范围,结构体的运用,指针的定义,函数的调用等等,通过这些问题才发现自己学习的知识是那么不牢固。再有就是些更深难度的函数,自己以前没有学过,比如textout,getch(),rand()等等,都需要自己学习老师给的范例,而且我发现要是编写一个稍大的程序,必须先画一个流程图,否则自己是不会知道怎么下手的,而且一个大程序是需要渐进编写的,边写边改的,不可能一步就能考虑周全。

当时蛇出现并且能动时,我的心情激动无比,虽然里面也借鉴了老师给的例子一部分,可是毕竟是自己自学,编出来的,所以没有什么是不能做的,起初想想都觉得自己是不可能编出那么复杂的游戏,可是当自己真的编出来的时候,才会相信自己是有能力的。

而且我们这次所学的函数,还有一些其它的小技巧,我想对以后的编程都会有帮助的。

相关主题
相关文档
最新文档