以下为《《计算机程序设计》课程设计贪吃蛇实验 告》的无排版文字预览,完整格式请下载
下载前请仔细阅读文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

《计算机程序设计》课程设计 告
课 题 名 称 贪吃蛇游戏
班 级 软件1班
学 ***4
姓 名 罗某某
指 导 教 师 宋某某
设 计 时 间 11/1/1 至 11/1/3
设 计 地 点 常熟***
常熟***计算机科学与***
目录
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. 蛇头由键盘控制,键盘不操作时,保持原有方向运动;(用 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;//蛇活的,还是已经死了.1.2 关于食物,有两个属性:1. 坐标位置2. 状态:存在,或被吃。故我们用以下结构表示:struct Food { struct Point position;/食物的位置 int exist; //存在被吃/p>
2.2 系统模块划分和模块结构
void main() {
init(); /*初始化*/
l=1;
while(l) /*循环游戏*/
{
select(); /*游戏速度和结束的选择菜单*/
gamePlay(); /*游戏主程序*/
}
close(); /*关闭游戏*/
}
2.3 流程图
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 程序测试和运行结果
—————————————————————————-选择速度开始或退出
—————————————————————————————-游戏运行中
——————————————————————————————————–游戏结束
4 课程 告小结
【遇到的问题及解决方法分析等】
4.1分数重叠显示
解决方法:每次都用一块黑的矩形覆盖
setfillstyle(1,16);
bar(45,45,150,80);
4.2速度太快
解决方法:循环delay
for(d=0;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
if(snake.nodes[i].x==food.position.x&&snake.nodes[i].y==food.position.y)
goto label;
}
附录A:程序源代码
/*writer: neolone(LB)*/
#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/* max length of snake nodess */
#define GAME_SPEED 100 /* game speed */
/* data structure */
struct Point {
int x, y;
};
struct Snake {
struct Point nodes[MAX_LENGTH];
int length;
int direction;
int live;
} snake;
struct Food {
struct Point position;
int exist;
} food;
int score=0,max,max1,max2,max3,left=200,top=200,right=300,bottom=300,lastx,lasty,keyCode,keyCode2,sp,l,sel,times=1;
char text[80];
/* functions declaration */
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);
void select(void);
/*————————*/
void main() {
init();
l=1;
while(l)
{
select();
gamePlay();
}
close();
}
void init() {
int gdriver=VGA ,gmode=VGAHI ;
snake.nodes[0].x=250;
snake.nodes[0].y=250;
snake.nodes[1].x=250;
snake.nodes[1].y=260;
snake.length=2;
snake.live=1;
snake.direction=UP;
score=0;
food.exist=0;
initgraph (&gdriver,&gmode,”C:\tc20\BGI”);
randomize();/*sui ji shu fa sheng qi*/
drawWall();
}
void close() {
FILE *fp;
closegraph();
if((fp=fopen(“data.txt”,”w”))==NULL) /*关闭时保存最高分*/
{
exit(0);
}
else
{
fprintf(fp,”%d,%d,%d”,max1,max2,max3);
fclose(fp);
}
printf(“pess any key to continue”);
}
void gamePlay() {
int keyCode,d;
getch();
while(TRUE) {
drawScore();
drawWall();
if (touchWall() || touchSelf()) {
gameOver();
return;
}
if (!food.exist) createFood();
food.exist=1;
drawFood();
drawSnake();
for(d=0;d
delay(GAME_SPEED);
if (bioskey(1) != 0) {
keyCode = bioskey(0);
switch(keyCode) {
case ESC:
gameOver();
return;
default:
lastx=snake.nodes[snake.length-1].x;
lasty=snake.nodes[snake.length-1].y;
if (!oppositeDirection(keyCode)) {
snake.direction = keyCode;
}
}
}
moveSnake();
if (foodEat()) {
food.exist = FALSE;
score += 10;
expandSnake();
}
}
}
void drawWall() {
rectangle(left,top,right+10,bottom+10);
}
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
if(snake.nodes[i].x==food.position.x&&snake.nodes[i].y==food.position.y)
goto label;
}
}
void drawFood() {
setfillstyle(1,2);
bar(food.position.x,food.position.y,food.position.x+10,food.position.y+10);
}
void drawSnake() {
int j;
setfillstyle(1,4);
for(j=0;j
{
bar(snake.nodes[j].x,snake.nodes[j].y,snake.nodes[j].x+10,snake.nodes[j].y+10);
}
}
void drawScore(void) {
setfillstyle(1,16);
bar(45,45,150,80);
setcolor(WHITE);
sprintf(text,”writer:neolone”);
outtextxy(170,50,text);
sprintf(text,”score:%5d”,score);
outtextxy(50,50,text);
}
int touchWall() {
int x1=snake.nodes[0].x;
int y1=snake.nodes[0].y;
if(x1right||y1bottom)
return TRUE;
else
return FALSE;
}
int touchSelf() {
int i;
for (i=3;i
{
if(snake.nodes[0].x==snake.nodes[i].x&&snake.nodes[0].y==snake.nodes[i].y)
return TRUE;
}
return FALSE;
}
void gameOver() {
FILE *f
>>>>>>内容过长,仅展示头部和尾部部分文字预览,全文请查看图片预览。
times=0;
}
switch(sel%4) { /*选择速度*/
case 0:
l=0;
gameOver();
close();
break;
case 1:
sp=5;
init();
sprintf(text,”Hightest score:%d”,max1);
outtextxy(50,90,text);
break;
case 2:
sp=3;
init();
sprintf(text,”Hightest score:%d”,max2);
outtextxy(50,90,text);
break;
case 3:
sp=1;
init();
sprintf(text,”Hightest score:%d”,max3);
outtextxy(50,90,text);
break;
default :
break;
}
}
[文章尾部最后500字内容到此结束,中间部分内容请查看底下的图片预览]
以上为《《计算机程序设计》课程设计贪吃蛇实验 告》的无排版文字预览,完整格式请下载
下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。
相关资源:snake:蛇-恶意软件存储动物园-其它代码类资源-CSDN文库
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!