《计算机程序设计》课程设计报告
课 题 名 称
贪吃蛇游戏
班
学
姓
级
号
名
软件 1 班
090610114
罗斌
指 导 教 师
宋东兴
设 计 时 间
11/1/1 至 11/1/3
设 计 地 点
常熟理工学院
常熟理工学院计算机科学与工程学院
常熟理工学院计算机科学与工程学院
目录
1 需求分析................................................................................... 1
2 系统分析和设计.......................................................................1
2.1 数据结构的设计和选择的理由......................................1
2.2 系统模块划分和模块结构..............................................2
2.3 流程图.............................................................................. 2
2.4 数据类型、全局变量和函数说明..................................3
3 程序测试和运行结果...............................................................4
4 课程报告小结...........................................................................5
4.1 分数重叠显示................................................................... 5
4.2 速度太快........................................................................... 5
4.3 食物可能出现在蛇身上................................................... 5
附录 A:程序源代码...................................................................6
《C 程序设计》课程设计
1 需求分析
【阐述课程设计应该完成的功能】
使用键盘的上下左右,来控制蛇的运动方向,ESC 键退出,并显示得分。
2 系统分析和设计
2.1 数据结构的设计和选择的理由
本游戏中涉及的主要数据结构是如何表示运动的蛇、食物状态等问题。
2.1.1 从游戏参考画面中我们可以看到,贪吃蛇的身体是一节节的,由一个个大小相同的方
块组成,那么我们可以用一个(x,y)坐标为左上角的、固定宽度的正方形来表示一节蛇身。为
表示连续的多节身体,那么我们可以采用数组(或链表,或线性表)等数据结构来表示。下
面以数组方式为例:
struct Point {
int x, y;
}
struct Point nodes[MAX_LENGTH];
//蛇身数组,MAX_LENGTH 为最大蛇长
贪吃蛇是在不断的运动的,我们研究蛇的运动可以发现这样的特点:
1. 蛇头由键盘控制,键盘不操作时,保持原有方向运动;(用 int direction;表示)
2. 运动时,蛇身后面一节移动到前面一节的位置。当我们用 nodes[0]表示蛇头的时候,nodes[1]
运动到 nodes[0]处;nodes[2]运动到 nodes[1]处...。
3. 吃到一个食物以后,蛇身会增加一节。即该数组中的有效数据个数加一。(用 int length;
表示)
根据上面的情况,我们可以设计蛇的数据结构如下:
struct Snake {
struct Point nodes[MAX_LENGTH];
//蛇身数组,保存每节蛇身的坐标。MAX_LENGTH
为最大蛇长
int length;
int direction; //蛇头运动方向
int live;
//当前蛇长
//蛇活的,还是已经死了?
}
2.1.2 关于食物,有两个属性:
1. 坐标位置
2. 状态:存在,或被吃。
故我们用以下结构表示:
struct Food {
struct Point position;
int exist;
//食物的位置
//存在?还是被吃?
}
1
常熟理工学院计算机科学与工程学院
/*初始化*/
/*循环游戏*/
/*游戏速度和结束的选择菜单*/
/*游戏主程序*/
/*关闭游戏*/
2.2 系统模块划分和模块结构
void main() {
init();
l=1;
while(l)
{
select();
gamePlay();
}
close();
}
2.3 流程图
《C 程序设计》课程设计
2.4 数据类型、全局变量和函数说明
2.4.1 数据类型
struct Point {
int x, y;
/*被多个结构体调用的基本参数,所以统一用 point 结构体来表示*/
/*一个存放点坐标的结构体*/
};
struct Snake {
struct Point nodes[MAX_LENGTH];
int length;
int direction;
int live;
} snake;
struct Food {
struct Point position;
int exist;
} food;
2.4.2 全局变量
Score
left,top,right,bottom
lastx,lasty
keyCode
2.4.3 函数说明
void init(void);
void gamePlay(void);
void close(void);
void drawWall(void);
void createFood(void);
void drawFood(void);
void drawSnake(void);
void drawScore(void);
int touchWall(void);
int touchSelf(void);
void gameOver(void);
void moveSnake(void);
int oppositeDirection(int keyCode);
int foodEat(void);
void expandSnake(void);
/*用来模拟蛇状态的结构体*/
/*用来存放蛇每一节的位置*/
/*蛇长*/
/*蛇移动的方向*/
/*蛇是否活着*/
/*比较形象的把蛇抽象为一个数据类型*/
/*用来模拟食物状态的结构体*/
/*食物的位置*/
/*食物是否存在*/
\\得分
\\游戏区域范围
\\用来保存最后一节蛇的位置
\\用来保存按下的键
\\初始化程序,给一些初始值赋值
\\游戏主循环
\\关闭游戏
\\画墙
\\创造一个食物
\\画出食物
\\画出蛇
\\画出分数
\\判断是否碰到墙
\\判断是否碰到自己
\\游戏结束
\\移动蛇
\\判断是否方向有误
\\判断是否吃到食物
\\把蛇增长一节
3
常熟理工学院计算机科学与工程学院
3 程序测试和运行结果
----------------------------------------------------------------------------选择速度开始或退出
----------------------------------------------------------------------------------------游戏运行中
《C 程序设计》课程设计
--------------------------------------------------------------------------------------------------------游戏结束
4 课程报告小结
【遇到的问题及解决方法分析等】
4.1 分数重叠显示
解决方法:每次都用一块黑的矩形覆盖
setfillstyle(1,16);
bar(45,45,150,80);
4.2 速度太快
解决方法:循环 delay
for(d=0;d<4;d++)
delay(GAME_SPEED);
4.3 食物可能出现在蛇身上
解决方法:依次判断,若重叠则重新生成食物
void createFood() {
int i;
label:
food.position.x=left+10*((int)rand()%11);
food.position.y=top+10*((int)rand()%11);
for(i=0;i<=snake.length-1;i++){
if(snake.nodes[i].x==food.position.x&&snake.nodes[i].y==food.position.y)
goto label;
5
常熟理工学院计算机科学与工程学院
}
附录 A:程序源代码
neolone(LB)*/
/*writer:
#include
#include
#include
#include
#include
#include
#include
#define TRUE 1
#define FALSE 0
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4B00
#define RIGHT 0x4D00
#define ESC 0x011B
#define SPEED1 0x0231
#define SPEED2 0x0332
#define SPEED3 0x0433
#define QUIT 0x0B30
#define ENTER 0x1C0D
#define MAX_LENGTH 100
#define GAME_SPEED 100
/* max length of snake nodess */
/* game speed */
/* data structure */
struct Point {
};
struct Snake {
int x, y;
struct Point nodes[MAX_LENGTH];
int length;
int direction;
int live;
} snake;
struct Food {
struct Point position;