贪吃蛇实验报告Word格式.docx
- 文档编号:21846539
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:21
- 大小:67.57KB
贪吃蛇实验报告Word格式.docx
《贪吃蛇实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《贪吃蛇实验报告Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
intlength;
//当前蛇长
intdirection;
//蛇头运动方向
intlive;
//蛇活的,还是已经死了?
2.1.2关于食物,有两个属性:
1.坐标位置
2.状态:
存在,或被吃。
故我们用以下结构表示:
structFood{
structPointposition;
//食物的位置
intexist;
//存在?
还是被吃?
2.2系统模块划分和模块结构
voidmain(){
init();
/*初始化*/
l=1;
while(l)/*循环游戏*/
{
select();
/*游戏速度和结束的选择菜单*/
gamePlay();
/*游戏主程序*/
}
close();
/*关闭游戏*/
2.3流程图
2.4数据类型、全局变量和函数说明
2.4.1数据类型
structPoint{/*一个存放点坐标的结构体*/
/*被多个结构体调用的基本参数,所以统一用point结构体来表示*/
};
structSnake{/*用来模拟蛇状态的结构体*/
/*用来存放蛇每一节的位置*/
/*蛇长*/
/*蛇移动的方向*/
/*蛇是否活着*/
}snake;
/*比较形象的把蛇抽象为一个数据类型*/
structFood{/*用来模拟食物状态的结构体*/
/*食物的位置*/
/*食物是否存在*/
}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程序测试和运行结果
----------------------------------------------------------------------------选择速度开始或退出
----------------------------------------------------------------------------------------游戏运行中
--------------------------------------------------------------------------------------------------------游戏结束
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;
附录A:
程序源代码
/*writer:
neolone(LB)*/
#include<
graphics.h>
stdlib.h>
time.h>
stdio.h>
dos.h>
conio.h>
bios.h>
#defineTRUE1
#defineFALSE0
#defineUP0x4800
#defineDOWN0x5000
#defineLEFT0x4B00
#defineRIGHT0x4D00
#defineESC0x011B
#defineSPEED10x0231
#defineSPEED20x0332
#defineSPEED30x0433
#defineQUIT0x0B30
#defineENTER0x1C0D
#defineMAX_LENGTH100/*maxlengthofsnakenodess*/
#defineGAME_SPEED100/*gamespeed*/
/*datastructure*/
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*/
voidselect(void);
/*------------------------*/
while(l)
voidinit(){
intgdriver=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();
/*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()){
gameOver();
return;
}
if(!
food.exist)createFood();
food.exist=1;
drawFood();
drawSnake();
for(d=0;
sp;
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);
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<
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);
setcolor(WHITE);
sprintf(text,"
writer:
neolone"
outtextxy(170,50,text);
score:
%5d"
score);
outtextxy(50,50,text);
inttouchWall(){
intx1=snake.nodes[0].x;
inty1=snake.nodes[0].y;
if(x1<
left||x1>
right||y1<
top||y1>
bottom)
returnTRUE;
returnFALSE;
inttouchSelf(){
for(i=3;
snake.length-1;
i++)
if(snake.nodes[0].x==snake.nodes[i].x&
snake.nodes[0].y==snake.nodes[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(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;
;
intoppositeDirection(intkeyCode){
if(keyCode==UP&
snake.direction==DOWN){
return1;
elseif(keyCode==DOWN&
snake.direction==UP){
elseif(keyCode==LEFT&
snake.direction==RIGHT){
elseif(keyCode==RIGHT&
snake.direction==LEFT){
return0;
intfoodEat(){
if(snake.nodes[0].x==food.position.x&
snake.nodes[0].y==food.position.y)
voidexpandSnake(){
if(keyCode==UP){
lastx-=10;
elseif(keyCode==DOWN){
lastx+=10;
elseif(keyCode==LEFT){
lasty-=10;
elseif(keyCode==RIGHT){
lasty+=10;
snake.nodes[snake.length].x=lastx;
snake.nodes[snake.length].y=lasty;
snake.length++;
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);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪吃 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)