用c语言写snake

# include & ltstdio.h & gt

# include & ltgraphics.h & gt

# include & ltstdlib.h & gt

# include & ltdos.h & gt/*引用的库函数*/

#定义左0x4b00

#定义右0x4d00

#向下定义0x5000

#定义高达0x4800

#define ESC 0x011b/*宏定义键名*/

#定义N 200

int i,key

int级别;/*游戏等级*/

int得分= 0;/*分数*/

int gamespeed/*游戏速度*/

结构食品

{

int x;/*食物横坐标*/

int y;/*食物的纵坐标*/

int yes/*判断食物的变量是否会出现*/

}食物;/*食物的结构*/

结构蛇

{

int x[N];

int y[N];

int节点;/*蛇的结数*/

int方向;/*蛇的移动方向*/

int life/*蛇的命,0是活的,1是死的*/

}蛇;/*蛇的结构*/

void choice levle(void);/*选择游戏级别*/

void Init(void);/*图形驱动程序*/

void Close(无效);/*图表结束*/

void DRAW(无效);/*游戏区*/

void game over(void);/*结束游戏*/

void玩法(void);/*玩游戏的具体流程*/

void PrScore(void);/*输出结果*/

/*主函数*/

无效总管(无效)

{

init();/*图形驱动程序*/

choice leve();/*选择游戏级别*/

DRAW();/*游戏区*/

游戏性();/*玩游戏的具体流程*/

close();/*图表结束*/

}

/*图形驱动程序*/

void初始化(void)

{

int gd=DETECT,GM;

init graph(& amp;gd,& ampgm," \ \ turbo 2 ");/*初始化图形系统*/

clear device();/*清除图形界面*/

}

/*选择游戏级别*/

无效选择值(无效)

{字符

名称[20];setcolor(黄色);settextstyle(0,0,6);outtextxy(150,150,“蛇”);setcolor(绿色);settextstyle(0,0,1);outtextxy(200,250,"请

放入你的英文名:“);outtextxy(200,270,"选择级别从

1-9.");outtextxy(300,320,“姓名:杨子龙”);/*生产商名称*

/outtextxy(300,350,"编号:0902060226 ");/*制片人的学生证*

/outtextxy(300,380,“类别:计算机科学

0602");/*生产者类*/getch();printf("请普京你的

姓名:“);获取(名称);printf("请选择

levle:“);scanf("%d ",& amp水平);gamespeed = 100000-400 *级别-300 *级别*级别;if(level & gt;9 | | level & lt1){ clear device();

/*清除图形界面*/setcolor(黄色);/*设置字体颜色*/settextstyle(0,0,2);

/*设置字体类型*/outtextxy (150,200,“级别输入错误”);

/*显示文本*/getch();level = 1;}

}

无效绘制(无效)

{ clear device();/*清屏*/set color(2);setlinestyle(SOLID_LINE,0,THICK _ WIDTH);/*设置线型*/rectangle(45,45,465,325);}

/*玩游戏的具体流程*/

无效游戏(void)

{ set color(5);setlinestyle(SOLID_LINE,0,THICK _ WIDTH);/*

设置线型*/randomize();/*随机数生成器*/food . yes = 1;/*1表示新的食物需要出现,0表示食物已经存在*

/snake . life = 0;/* alive */snake . direction = 1;/*向右的方向*/snake . x[0]= 320;

snake . y[0]= 240;/*蛇头*/snake . x[1]= 330;snake . y[1]= 240;

/*第二段蛇的位置*/snake . node = 3;/*节数*/PrScore();/*输出分数*/while(1)/*可以反复玩游戏,按ESC键。

梁*/{while(!Khit ())/*蛇不按键自己移动*/{if(food.yes==1)/*新的食物需要出现*

/{ food . x = rand()% 360+70;food . y = rand()% 250+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;我-)/*蛇的每一个环节都向前移动*/

{

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

{ snake . x[0]= 450;

/*蛇头越过左边界,就从右边界进入*/snake . y[0]= snake . y[0];/*纵坐标不变*/for(I = snake . node-1;

我& gt0;I-){ snake . x[I]= snake . x[I-1];snake . y[I]= snake . y[I-1];

/*蛇的其他结向前移动*/}

{

setfillstyle(SOLID_FILL,0);/*设置填充模式和颜色,0表示黑色*/

bar(50,55,455,315);/*bar是函数*/

}

}

其他

if(snake . x[0]& gt;450)

{ snake . x[0]= 50;

/*如果蛇头越过右边界,蛇头从左边界进入*/snake . y[0]= snake . y[0];/*纵坐标不变*/for(i=snake.node-

1;我& gt0;I-){ snake . x[I]= snake . x[I-1];snake . y[I]= snake . y[I-1];

/*蛇的其他结向前移动*/}

{

setfillstyle(SOLID_FILL,0);/*设置填充模式和颜色,0表示黑色*/

bar(50,55,455,315);/*bar是函数*/

}

}

其他

if(snake . y[0]& lt;60)

{ snake . y[0]= 320;

/*如果蛇头越过上边界,则从下边界进入*/snake . x[0]= snake . x[0];/*横坐标不变*/for(I = snake . node-1;

我& gt0;I-){ snake . x[I]= snake . x[I-1];snake . y[I]= snake . y[I-1];

/*蛇的其他结向前移动*/}

{

setfillstyle(SOLID_FILL,0);/*设置填充模式和颜色,0表示黑色*/

bar(50,55,455,315);/*bar是函数*/

}

}

其他

if(snake . y[0]& gt;320)

{ snake . y[0]= 60;

/*如果蛇头越过下边界,则从上边界进入*/snake . x[0]= snake . x[0];/*横坐标不变*/for(I = snake . node-1;

我& gt0;I-){ snake . x[I]= snake . x[I-1];snake . y[I]= snake . y[I-1];

/*蛇的其他结向前移动*/}

{

setfillstyle(SOLID_FILL,0);/*设置填充模式和颜色,0表示黑色*/

bar(50,55,455,315);/*bar是函数*/

}

}

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;/*每吃一次食物,分数累计到10分*/

如果(分数%100==0)

{ level++;gamespeed = 100000-400 * level-

300 *级*级;/*每吃10的食物,就提升一级,速度加快*/PrScore();/*输出新分数*/setcolor(黄色);

/*设置字体颜色*/settextstyle(0,0,4);/*设置字体类型*/outtextxy (150,200," level up ");

/*显示文本*/if(level = = 10){ level = 1,gamespeed = 100000-400 * level-

300 *级*级;}

延时(6000000);

延时(6000000);

延时(6000000);

延时(6000000);

延时(6000000);

延时(6000000);

延时(6000000);

bar(50,55,455,315);/*bar是函数*/

}

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(!Khit) */*用黑色去掉蛇的最后一段*/

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 1[20];/*设置字符数组*/

setfillstyle(SOLID_FILL,0);

吧(50,15,390,35);/*填充矩形框*/

set color(6);/*设置文本颜色*/

settextstyle(0,0,2);/*设置数组显示位置*/

sprintf(str1,"分数%d级别%d ",分数,级别);/*显示数组内容*/

outtextxy(55,20,str 1);

setcolor(黄色);/*设置字体颜色*/

settextstyle(0,0,2);/*设置字体类型*/

outtextxy(250,400," EXIT = ESC ");/*显示文本*/

}

无效关闭(无效)

{

closegraph();

}