求snake C语言代码,有一定的功能需求。
/* champing的Snake程序*/
#定义N 200
# include & ltgraphics.h & gt
# include & ltstdlib.h & gt
# include & ltdos.h & gt
#定义左0x4b00
#定义右0x4d00
#向下定义0x5000
#定义高达0x4800
#定义ESC 0x011b
int i,key
int得分= 0;/*分数*/
int gamespeed = 100000;/*自己调整游戏速度*/
结构食品
{
?int x;/*食物横坐标*/
?int y;/*食物的纵坐标*/
?int yes/*判断食物的变量是否会出现*/
}食物;/*食物的结构*/
结构蛇
{
?int x[N];
?int y[N];
?int节点;/*蛇的结数*/
?int方向;/*蛇的移动方向*/
?int life/*蛇的命,0是活的,1是死的*/
}蛇;
void Init(void);/*图形驱动程序*/
void Close(无效);/*图表结束*/
void DrawK(无效);/*开始屏幕*/
void game over(void);/*结束游戏*/
void玩法(void);/*玩游戏的具体流程*/
void PrScore(void);/*输出结果*/
/*主函数*/
无效总管(无效)
{
?init();/*图形驱动程序*/
?DrawK();/*开始屏幕*/
?游戏性();/*玩游戏的具体流程*/
?close();/*图表结束*/
}
/*图形驱动程序*/
void初始化(void)
{
?int gd = DETECT,GM;
?init graph(& amp;gd,& ampgm," c:\ \ TC ");
?clear device();
}
/*开始屏幕,左上角坐标为(50,40),右下角坐标为(610,460 */
void DrawK(无效)
{
/*setbkcolor(浅绿色);*/
set color(11);
setlinestyle(SOLID_LINE,0,THICK _ WIDTH);/*设置线型*/
?
for(I = 50;我& lt= 600;I += 10)/*画一个栅栏*/
{
?矩形(I,40,i + 10,49);/*高于*/
?矩形(I,451,i + 10,460);/*低于*/
}
for(I = 40;我& lt= 450;i += 10)
{
?矩形(50,I,59,I+10);/*左*/
?矩形(601,I,610,I+10);/*右*/
}
}
/*玩游戏的具体流程*/
无效游戏(void)
{
randomize();/*随机数生成器*/
food . yes = 1;/*1表示新的食物需要出现,0表示食物已经存在*/
snake . life = 0;/*活着*/
snake . direction = 1;/*向右方向*/
snake . x[0]= 100;snake . y[0]= 100;/*蛇头*/
snake . x[1]= 110;snake . y[1]= 100;
snake . node = 2;/*节数*/
PrScore();/*输出分数*/
而(1)/*可以反复玩游戏,按ESC结束*/
{
?而(!Khit ())/*蛇在不按键的情况下自行移动*/
?{
?If(food.yes == 1)/*需要新的食物*/
?{
food . x = rand()% 400+60;
food . y = rand()% 350+60;
而(food.x % 10!= 0)/*食物随机出现后,食物必须在整个格子里,蛇才能吃*/
food . x++;
而(food.y % 10!= 0)
food . y++;
food . yes = 0;/*屏幕上有食物*/
?}
?
?If(food.yes == 0)/*如果屏幕上有食物,就会显示出来*/
?{
setcolor(绿色);
矩形(food.x,food.y,food.x + 10,food . y-10);
?}
?
?for(I = snake . node-1;我& gt0;I-)/*蛇的每一个环节都向前移动,这是蛇的关键算法*/
?{
snake . x[I]= snake . x[I-1];
snake . y[I]= snake . y[I-1];
?}
?
?/*1,2,3,4表示右,左,上,下,这个判断可以移动蛇头*/
?开关(蛇形方向)
?{
case 1:snake . x[0]+= 10;打破;
案例二:snake . x[0]-= 10;打破;
案例三:snake . y[0]-= 10;打破;
案例四:snake . y[0]+= 10;打破;
?}
?
?for(I = 3;我& ltsnake .节点;I++)/*从蛇的第四节判断自己是不是打中了自己,因为蛇头有两节,第三节是不可能转身的*/
?{
if(snake . x[I]= = snake . x[0]& amp;& ampsnake.y[i] == snake.y[0])
{
game over();/*显示失败*/
snake . life = 1;
打破;
}
?}
?
?if(snake . x[0]& lt;55 | | snake . x[0]& gt;595 | | snake . y[0]& lt;55||
?snake . y[0]& gt;455)/*蛇有没有撞到墙上*/
?{
game over();/*这个游戏结束了*/
snake . life = 1;/*蛇死*/
?}
?
?If(snake.life == 1)/*以上两个判断后,如果蛇死了,跳出内循环重新开始*/
打破;
?if(snake . x[0]= = food . x & amp;& ampSnake.y[0] == food.y)/*吃完食物*/
?{
set color(0);/*从图片中移除食物*/
矩形(food.x,food.y,food.x + 10,food . y-10);
snake . x[snake . node]=-20;snake . y[snake . node]=-20;
/*先把新段放到看不见的地方,在下一个循环中取前一段的位置*/
snake . node++;/*蛇的身体有很长的一段*/
food . yes = 1;/*新食物需要出现在屏幕上*/
得分+= 10;
PrScore();/*输出新分数*/
?}
?
?set color(4);/*画一条蛇*/
?
?for(I = 0;我& ltsnake .节点;i++)
矩形(snake.x[i],snake.y[i],snake.x[i] + 10,
snake . y[I]-10);
?
?延迟(gamespeed);
?set color(0);/*用黑色去掉蛇的最后一段*/?
?矩形(snake.x[snake.node-1],snake.y[snake.node-1],
?snake . x[snake . node-1]+10,snake . y[snake . node-1]-10);
?} ?/*endwhile(!kbhit)*/
?
?If(snake.life == 1)/*如果蛇死了,跳出循环*/
?打破;
?
?key = BIOS key(0);/*接收按钮*/
?
?If(key == ESC)/*按ESC退出*/
?打破;
?其他
?if(key = = UP & amp;& amp蛇,方向!=4)
/*判断是否向相反方向移动*/
snake . direction = 3;
?其他
?if(key = = RIGHT & amp;& amp蛇,方向!= 2)
snake . direction = 1;
?其他
?if(key = = LEFT & amp;& amp蛇,方向!= 1)
snake . direction = 2;
?其他
?if(key = = DOWN & amp;& amp蛇,方向!= 3)
snake . direction = 4;
}/*endwhile(1)*/
}
/*游戏结束*/
无效游戏结束(无效)
{
clear device();
PrScore();
setcolor(红色);
settextstyle(0,0,4);
outtextxy(200,200,“游戏结束”);
getch();
}
/*输出结果*/
无效PrScore(无效)
{ ?
char str[10];
setfillstyle(SOLID_FILL,黄色);
酒吧(50,15,220,35);
set color(6);
settextstyle(0,0,2);
sprintf(str," score:%d ",score);
outtextxy(55,20,str);
}
/*图表结束*/
无效关闭(无效)
{ ?
getch();
closegraph();
}