用C语言(wintc)编了一个小游戏——贪吃蛇。当你吃食物时,你得分。撞墙。游戏结束。

#定义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 = 50000/*自己调整游戏速度*/

结构食品

{

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();

}