贪吃蛇实验报告Word文档下载推荐.docx
《贪吃蛇实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《贪吃蛇实验报告Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。
坐标位置
2.状态:
存在,或被吃。
故我们用以下结构表示:
structFood{
structPointposition;
2.4.12.4.22.4.3
==&
&
[i].y==gotolabel;
}
附录A:
程序源代码
/*writer:
neolone(LB)*/
#include<
>
#defineTRUE1
#defineFALSE0
#defineUP0x4800
#defineDOWN0x5000
#defineLEFT0x4B00
#defineRIGHT0x4D00
#defineESC0x011B
#defineSPEED10x0231
#defineSPEED20x0332
#defineSPEED30x0433
#defineQUIT0x0B30
#defineENTER0x1C0D
#defineMAX_LENGTH100/*maxlengthofsnakenodess*/
#defineGAME_SPEED100/*gamespeed*/
/*datastructure*/
};
intlength;
intdirection;
intlive;
}snake;
intexist;
}food;
intscore=0,max,max1,max2,max3,left=200,top=200,right=300,bottom=300,lastx,lasty,keyCode,keyCode2,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;
[0].x=250;
[0].y=250;
[1].x=250;
[1].y=260;
=2;
=1;
=UP;
score=0;
=0;
initgraph(&
gdriver,&
gmode,"
C:
\\tc20\\BGI"
);
randomize();
/*suijishufashengqi*/
drawWall();
voidclose(){
FILE*fp;
closegraph();
if((fp=fopen("
"
"
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()){
gameOver();
return;
}
if(!
createFood();
=1;
drawFood();
drawSnake();
for(d=0;
d<
sp;
d++)
delay(GAME_SPEED);
if(bioskey
(1)!
=0){
keyCode=bioskey(0);
switch(keyCode){
caseESC:
gameOver();
return;
default:
lastx=[].x;
lasty=[].y;
if(!
oppositeDirection(keyCode)){
=keyCode;
}
}
moveSnake();
if(foodEat()){
=FALSE;
score+=10;
expandSnake();
voiddrawWall(){
rectangle(left,top,right+10,bottom+10);
voidcreateFood(){
inti;
label:
for(i=0;
i<
=;
i++){
if[i].x==&
voiddrawFood(){
setfillstyle(1,2);
bardrawSnake(){
intj;
setfillstyle(1,4);
for(j=0;
j<
j++)
bar[j].x,[j].y,[j].x+10,[j].y+10);
voiddrawScore(void){
setfillstyle(1,16);
bar(45,45,150,80);
setcolor(WHITE);
sprintf(text,"
writer:
neolone"
outtextxy(170,50,text);
score:
%5d"
score);
outtextxy(50,50,text);
inttouchWall(){
intx1=[0].x;
inty1=[0].y;
if(x1<
left||x1>
right||y1<
top||y1>
bottom)
returnTRUE;
returnFALSE;
inttouchSelf(){
for(i=3;
;
i++)
if[0].x==[i].x&
[0].y==[i].y)
voidgameOver(){
intx2,y2;
x2=180;
y2=250;
Gameover!
!
yourscoreis%d,%d"
score,sel);
outtextxy(x2,y2,text);
delay(1000);
switch(sel%4)
case1:
if(score>
max1)
{
max1=score;
break;
case2:
max2)
max2=score;
case3:
max3)
max3=score;
default:
break;
voidmoveSnake(){
intk;
bar[].x,[].y,[].x+10,[].y+10);
for(k=;
k>
=0;
k--)
[k+1].x=[k].x;
[k+1].y=[k].y;
if==UP)
[0].y-=10;
elseif==DOWN)
[0].y+=10;
elseif==LEFT)
[0].x-=10;
elseif==RIGHT)
[0].x+=10;
;
intoppositeDirection(intkeyCode){
if(keyCode==UP&
==DOWN){
return1;
elseif(keyCode==DOWN&
==UP){
elseif(keyCode==LEFT&
==RIGHT){
elseif(keyCode==RIGHT&
==LEFT){
return0;
intfoodEat(){
if[0].x==&
[0].y==return1;
voidexpandSnake(){
if(keyCode==UP){
lastx-=10;
elseif(keyCode==DOWN){
lastx+=10;
elseif(keyCode==LEFT){
lasty-=10;
elseif(keyCode==RIGHT){
lasty+=10;
[].x=lastx;
[].y=lasty;
++;
voidselect()
{
setfillstyle(1,7);
/*实现选择速度的可视化菜单*/
bar(420,220,490,310);
setfillstyle(1,9);
bar(430,230,480,240);
setfillstyle(1,5);
speed1"
outtextxy(430,230,text);
bar(430,250,480,260);
speed2"
outtextxy(430,250,text);
bar(430,270,480,280);
speed3"
outtextxy(430,270,text);
bar(430,290,480,300);
quit"
outtextxy(430,290,text);
sel=1;
t=1;
while(t){
delay(10);
if(bioskey
(1)!
keyCode=bioskey(0);
switch(keyCode){
caseUP:
sel--;
break;
caseDOWN:
sel++;
caseENTER:
t=0;
break;
}
switch(sel%4){
case0:
setfillstyle(1,5);
bar(430,230,480,240);
case1:
setcolor(WHITE);
sprintf(text,"
outtextxy(430,230,text);
bar(430,250,480,260);
outtextxy(430,250,text);
bar(430,270,480,280);
outtextxy(430,270,text);
bar(430,290,480,300);
outtextxy(430,290,text);
break;
case2:
case3:
setfillstyle(1,9);
default:
/*ch=getch();
*/
if(times==1)/*读取历史最高分*/
r"
))==NULL)
sprintf(text,"
Cannotopenthefile"
exit(0);
fscanf(fp,"
&
max1,&
max2,&
max3);
fclose(fp);
times=0;
switch(sel%4){/*选择速度*/
l=0;
close();
sp=5;
init();
sprintf(text,"
Hightestscore:
%d"
max1);
outtextxy(50,90,text);
sp=3;
max2);
sp=1;
max3);