《计算机程序设计》课程设计报告
课 题 名 称贪吃蛇游戏
班级软件1班
姓名 neolone
目录
1 需求分析... 1
2 系统分析和设计... 1
2.1 数据结构的设计和选择的理由... 1
2.2 系统模块划分和模块结构... 2
2.3 流程图... 3
2.4 数据类型、全局变量和函数说明... 3
3 程序测试和运行结果... 4
4 课程报告小结... 5
4.1分数重叠显示... 5
4.2速度太快... 5
4.3食物可能出现在蛇身上... 5
附录A:程序源代码... 6
1 需求分析
【阐述课程设计应该完成的功能】
使用键盘的上下左右,来控制蛇的运动方向,ESC键退出,并显示得分。
2 系统分析和设计
2.1 数据结构的设计和选择的理由
本游戏中涉及的主要数据结构是如何表示运动的蛇、食物状态等问题。
2.1.1从游戏参考画面中我们可以看到,贪吃蛇的身体是一节节的,由一个个大小相同的方块组成,那么我们可以用一个(x,y)坐标为左上角的、固定宽度的正方形来表示一节蛇身。为表示连续的多节身体,那么我们可以采用数组(或链表,或线性表)等数据结构来表示。下面以数组方式为例:
struct Point {
int x,y;
}
struct Point nodes[MAX_LENGTH];//蛇身数组,MAX_LENGTH为最大蛇长
贪吃蛇是在不断的运动的,我们研究蛇的运动可以发现这样的特点:
1. 蛇头由键盘控制,键盘不操作时,保持原有方向运动;(用intdirection;表示)
2.运动时,蛇身后面一节移动到前面一节的位置。当我们用nodes[0]表示蛇头的时候,nodes[1]运动到nodes[0]处;nodes[2]运动到nodes[1]处...。
3. 吃到一个食物以后,蛇身会增加一节。即该数组中的有效数据个数加一。(用int length;表示)
根据上面的情况,我们可以设计蛇的数据结构如下:
struct Snake {
struct Pointnodes[MAX_LENGTH];//蛇身数组,保存每节蛇身的坐标。MAX_LENGTH为最大蛇长
intlength;//当前蛇长
intdirection; //蛇头运动方向
intlive;//蛇活的,还是已经死了?
}
2.1.2关于食物,有两个属性:
1. 坐标位置
2. 状态:存在,或被吃。
故我们用以下结构表示:
struct Food {
struct Pointposition; //食物的位置
intexist;//存在?还是被吃?
}
2.2 系统模块划分和模块结构
void main() {
init();
l=1;
while(l)
{
select();
gamePlay();
}
close();
}
2.3 流程图
2.4 数据类型、全局变量和函数说明
2.4.1数据类型
struct Point{
intx,y;
};
struct Snake{
structPointnodes[MAX_LENGTH];
intlength;
intdirection;
intlive;
} snake;
struct Food{
structPointposition;
intexist;
} food;
2.4.2全局变量
Score\得分
left,top,right,bottom\游戏区域范围
lastx,lasty\用来保存最后一节蛇的位置
keyCode\用来保存按下的键
2.4.3函数说明
voidinit(void);\初始化程序,给一些初始值赋值
voidgamePlay(void);\游戏主循环
voidclose(void);\关闭游戏
voiddrawWall(void);\画墙
voidcreateFood(void);\创造一个食物
voiddrawFood(void);\画出食物
voiddrawSnake(void);\画出蛇
voiddrawScore(void);\画出分数
inttouchWall(void);\判断是否碰到墙
inttouchSelf(void);\判断是否碰到自己
voidgameOver(void); \游戏结束
voidmoveSnake(void);\移动蛇
int oppositeDirection(intkeyCode);\判断是否方向有误
intfoodEat(void); \判断是否吃到食物
voidexpandSnake(void);\把蛇增长一节
3 程序测试和运行结果
----------------------------------------------------------------------------选择速度开始或退出
----------------------------------------------------------------------------------------游戏运行中
--------------------------------------------------------------------------------------------------------游戏结束
4 课程报告小结
【遇到的问题及解决方法分析等】
4.1分数重叠显示
解决方法:每次都用一块黑的矩形覆盖
setfillstyle(1,16);
bar(4 5,45,150,80);
4.2速度太快
解决方法:循环delay
for(d=0;d<4;d++)
delay(GAME_SPEED);
4.3食物可能出现在蛇身上
解决方法:依次判断,若重叠则重新生成食物
void createFood() {
inti;
label:
food.position.x=left+10*((int)rand());
food.position.y=top+10*((int)rand());
for(i=0;i<=snake.length-1;i++){
if(snake.nodes[i].x==food.position.x&&snake.nodes[i].y==food.position.y)
gotolabel;
}
附录A:程序源代码
这是资源地址,源代码http://download.csdn.net/source/3483954
设计报告http://download.csdn.net/source/3483963