完整word版贪吃蛇实验报告.docx
《完整word版贪吃蛇实验报告.docx》由会员分享,可在线阅读,更多相关《完整word版贪吃蛇实验报告.docx(57页珍藏版)》请在冰点文库上搜索。
完整word版贪吃蛇实验报告
《计算机程序设计》课程设计报告
课题名称贪吃蛇游戏
班级
学号
姓名
指导教师
设计时间至
设计地点
常熟理工学院计算机科学与工程学院
常熟理工学院计算机科学与工程学院
1
需求解析...................................................................................
1
2
系统解析和设计......................................................................
1
数据构造的设计和选择的原因......................................
1
系统模块区分和模块构造..............................................
2
流程图..............................................................................
2
数据种类、全局变量和函数说明..................................
3
3
程序测试和运转结果..............................................................
4
4
课程报告小结..........................................................................
5
分数重叠显示...................................................................
5
速度太快...........................................................................
5
食品可能出此刻蛇身上...................................................
5
附录A:
程序源代码...................................................................
6
《C程序设计》课程设计
1需求解析
【论述课程设计应当达成的功能】
使用键盘的上下左右,来控制蛇的运动方向,ESC键退出,并显示得分。
2系统解析和设计
2.1数据构造的设计和选择的原因
本游戏中波及的主要数据构造是怎样表示运动的蛇、食品状态等问题。
2.1.1从游戏参照画面中我们能够看到,贪吃蛇的身体是一节节的,由一个个大小同样的方
块构成,那么我们能够用一个(x,y)坐标为左上角的、固定宽度的正方形来表示一节蛇身。
为表示连续的多节身体,那么我们能够采纳数组(或链表,或线性表)等数据构造来表示。
下边以数组方式为例:
structPoint{
intx,y;
}
structPointnodes[MAX_LENGTH];//蛇身数组,MAX_LENGTH为最大蛇长
贪吃蛇是在不停的运动的,我们研究蛇的运动能够发现这样的特色:
1.蛇头由键盘控制,键盘不操作时,保持原有方向运动;(用intdirection;表示)
2.运动时,蛇身后边一节挪动到前面一节的地点。
当我们用nodes[0]表示蛇头的时候,nodes[1]
运动到nodes[0]处;nodes[2]运动到nodes[1]处...。
3.吃到一个食品此后,蛇身会增添一节。
即该数组中的有效数据个数加一。
(用intlength;
表示)
依据上边的状况,我们能够设计蛇的数据构造以下:
structSnake{
structPointnodes[MAX_LENGTH];//蛇身数组,保留每节蛇身的坐标。
MAX_LENGTH
为最大蛇长
intlength;//目前蛇长
intdirection;//蛇头运动方向
intlive;//蛇活的,仍是已经死了?
}
2.1.2对于食品,有两个属性:
1.坐标地点
2.状态:
存在,或被吃。
故我们用以下构造表示:
structFood{
structPointposition;//食品的地点
intexist;//存在?
仍是被吃?
}
1
常熟理工学院计算机科学与工程学院
2.2系统模块区分和模块构造
voidmain(){
init();
/*初始化*/
l=1;
while(l)
/*循环游戏
*/
{
select();
gamePlay();
/*游戏速度和结束的选择菜单
/*游戏主程序*/
*/
}
close();
/*封闭游戏
*/
}
2.3流程图
《C程序设计》课程设计
2.4数据种类、全局变量和函数说明
2.4.1数据种类
structPoint{
/*一个寄存点坐标的构造体
*/
intx,y;
/*被多个构造体调用的基本参数,因此一致用
point构造体来表示*/
};
structSnake{
/*用来模拟蛇状态的构造体
*/
structPointnodes[MAX_LENGTH];
/*用来寄存蛇每一节的地点
*/
intlength;
/*蛇长*/
intdirection;
/*蛇挪动的方向*/
intlive;
/*蛇能否活着*/
}snake;
/*比较形象的把蛇抽象为一个数据种类
*/
structFood{
/*用来模拟食品状态的构造体
*/
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);
挪动蛇
intoppositeDirection(intkeyCode);
判断能否方向有误
intfoodEat(void);
判断能否吃到食品
voidexpandSnake(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食品可能出此刻蛇身上
解决方法:
挨次判断,若重叠则从头生成食品
voidcreateFood(){
inti;
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)
gotolabel;
5
常熟理工学院计算机科学与工程学院
}
附录A:
程序源代码
/*writer:
neolone(LB)*/
#include
#include
#include
#include
#include
#include
#include
#defineTRUE1
#defineFALSE0
#defineUP0x4800
#defineDOWN0x5000
#defineLEFT0x4B00
#defineRIGHT0x4D00
#defineESC0x011B
#defineSPEED10x0231
#defineSPEED20x0332
#defineSPEED30x0433
#defineQUIT0x0B30
#defineENTER0x1C0D
#defineMAX_LENGTH100#defineGAME_SPEED100
/*maxlengthofsnakenodess*/
/*gamespeed*/
/*datastructure*/
structPoint{
intx,y;
};
structSnake{
structPointnodes[MAX_LENGTH];
intlength;
intdirection;
intlive;
}snake;structFood{
structPointposition;
《C程序设计》课程设计
intexist;
}food;
int
score=0,max,max1,max2,max3,left=200,top=200,right=300,bottom=300,lastx,lasty,keyCode,keyC
ode2,sp,l,sel,times=1;
chartext[80];
/*functionsdeclaration*/
voidinit(void);
voidgamePlay(void);
voidclose(void);
voiddrawWall(void);
voidcreateFood(void);
voiddrawFood(void);
voiddrawSnake(void);
voiddrawScore(void);
inttouchWall(void);
inttouchSelf(void);
voidgameOver(void);
voidmoveSnake(void);
intoppositeDirection(intkeyCode);
intfoodEat(void);
voidexpandSnake(void);
voidselect(void);
/*------------------------*/
voidmain(){
init();
l=1;
while(l)
{
select();
gamePlay();
}
close();
}
voidinit(){
intgdriver=VGA,gmode=VGAHI;
7
常熟理工学院计算机科学与工程学院
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();/*suijishufashengqi*/
drawWall();
}
voidclose(){
FILE*fp;
closegraph();
if((fp=fopen("data.txt","w"))==NULL)/*封闭时保留最高分*/
{
exit(0);
}
else
{
fprintf(fp,"%d,%d,%d",max1,max2,max3);
fclose(fp);
}
printf("pessanykeytocontinue");
}
voidgamePlay(){
intkeyCode,d;
getch();
while(TRUE){
drawScore();
drawWall();
if(touchWall()||touchSelf()){
《C程序设计》课程设计
gameOver();
return;
}
if(!
food.exist)createFood();
food.exist=1;
drawFood();
drawSnake();
for(d=0;ddelay(GAME_SPEED);
if(bioskey
(1)!
=0){
keyCode=bioskey(0);
switch(keyCode){
caseESC:
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();
}
}
}
voiddrawWall(){
rectangle(left,top,right+10,bottom+10);
}
voidcreateFood(){
inti;
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)
9
常熟理工学院计算机科学与工程学院
gotolabel;
}
}
voiddrawFood(){
setfillstyle(1,2);
bar(food.position.x,food.position.y,food.position.x+10,food.position.y+10);
}
voiddrawSnake(){
intj;
setfillstyle(1,4);
for(j=0;j<=snake.length-1;j++)
{
bar(snake.nodes[j].x,snake.nodes[j].y,snake.nodes[j].x+10,snake.nodes[j].y+10);
}
}
voiddrawScore(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);
}
inttouchWall(){
intx1=snake.nodes[0].x;
inty1=snake.nodes[0].y;
if(x1right||y1bottom)
returnTRUE;
《C程序设计》课程设计
else
returnFALSE;
}
inttouchSelf(){
inti;
for(i=3;i{
if(snake.nodes[0].x==snake.nodes[i].x&&snake.nodes[0].y==snake.nodes[i].y)
returnTRUE;
}
returnFALSE;
}
voidgameOver(){
FILE*fp;
intx2,y2;
x2=180;
y2=250;
setcolor(WHITE);
sprintf(text,"Gameover!
!
yourscoreis%d,%d",score,sel);
outtextxy(x2,y2,text);
delay(1000);
getch();
switch(sel%4)
{
case1:
if(score>max1)
{
max1=score;
}
break;
case2:
if(score>max2)
{
max2=score;
}
break;
case3:
11
常熟理工学院计算机科学与工程学院
if(score>max3)
{
max3=score;
}
break;
default:
{
break;
}
}
}
voidmoveSnake(){
intk;
setfillstyle(1,16);
lastx=snake.nodes[snake.length-1].x;
lasty=snake.nodes[snake.length-1].y;
bar(snake.nodes[snake.length-1].x,snake.nodes[snake.length-1].y,snake.nodes[snake.length-1].x+10,snake.nodes[snake.length-1].y+10);
for(k=snake.length-2;k>=0;k--)
{
snake.nodes[k+1].x=snake.nodes[k].x;
snake.nodes[k+1].y=snake.nodes[k].y;
}
if(snake.direction==UP)
snake.nodes[0].y-=10;
elseif(snake.direction==DOWN)
snake.nodes[0].y+=10;
elseif(snake.direction==LEFT)
snake.nodes[0].x-=10;
elseif(snake.direction==RIGHT)
snake.nodes[0].x+=10;
else
;
}
intoppositeDirection(intkeyCode){
if(keyCode==UP&&snake.direction==DOWN){
return1;
}
elseif(keyCode==DOWN&&snake.direction==UP){
return1;
}
《C程序设计》课程设计
elseif(keyCode==LEFT&&snake.direction==RIGHT){
return1;
}
elseif(keyCode==RIGHT&&snake.direction==LEFT){
return1;
}
else
return0;
}
intfoodEat(){
if(snake.nodes[0].x==food.position.x&&snake.nodes[0].y==food.position.y)
return1;
else
return0;
}
voidexpandSnake(){
if(keyCode==UP){
lastx-=10;
}
elseif(keyCode==DOWN){
lastx+=10;
}
elseif(keyCode==LEFT){
lasty-=10;
}
elseif(keyCode==RIGHT){
lasty+=10;
}
else
;
snake.nodes[snake.length].x=lastx;
snake.nodes[snake.length].y=lasty