贪吃蛇游戏函数c语言代码_贪吃蛇c语言代码详解
C语言的贪吃蛇源代码
#include?stdio.h?
#include?stdlib.h?
#include?conio.h?
#include?string.h?
#include?time.h?
char?GameMap[H][L];?//游戏地图?
int?key;?//按键保存?
int?sum?=?1,?over?=?0;?//蛇的长度,?游戏结束(自吃或碰墙)?
struct?Snake?//蛇的每个节点的数据类型?
{?
int?x,?y;?//左边位置?
}Snake[H*L];?
const?char?Shead?=?'@';?//蛇头?
const?char?Sbody?=?'#';?//蛇身?
const?char?Sfood?=?'*';?//食物?
const?char?Snode?=?'.';?//'.'在地图上标示为空?
void?Initial();?//地图的初始化?
void?Create_Food();?//在地图上随机产生食物?
void?Show();?//刷新显示地图?
void?Button();?//取出按键,并判断方向?
void?Move();?//蛇的移动?
void?Check_Border();?//检查蛇头是否越界?
void?Check_Head(int?x,?int?y);?//检查蛇头移动后的位置情况?
int?main()?
Initial();?
Show();?
return?0;?
}?
void?Initial()?//地图的初始化?
int?i,?j;?
int?hx,?hy;?
system("title?贪吃蛇");?//控制台的标题?
memset(GameMap,?'.',?sizeof(GameMap));?//初始化地图全部为空'.'?
system("cls");?
srand(time(0));?//随机种子?
hx?=?rand()%H;?//产生蛇头?
hy?=?rand()%L;?
GameMap[hx][hy]?=?Shead;?
Snake[0].x?=?hx;?Snake[0].y?=?hy;?
Snake[0].now?=?-1;?
Create_Food();?//随机产生食物?
for(i?=?0;?i?H;?i++)?//地图显示?
{?
for(j?=?0;?j?L;?j++)?
printf("%c",?GameMap[i][j]);?
printf("\n");?
printf("\n小小C语言贪吃蛇\n");?
printf("按任意方向键开始游戏\n");?
getch();?//先接受一个按键,使蛇开始往该方向走?
Button();?//取出按键,并判断方向?
void?Create_Food()?//在地图上随机产生食物?
int?fx,?fy;?
while(1)?
fx?=?rand()%H;?
fy?=?rand()%L;?
if(GameMap[fx][fy]?==?'.')?//不能出现在蛇所占有的位置?
GameMap[fx][fy]?=?Sfood;?
?break;?
void?Show()?//刷新显示地图?
{?
Button();?//先判断按键在移动?
Move();?
if(over)?//自吃或碰墙即游戏结束?
printf("\n**游戏结束**\n");?
printf("??_\n");?
getchar();?
system("cls");?//清空地图再显示刷新吼的地图?
for(i?=?0;?i?H;?i++)?
void?Button()?//取出按键,并判断方向?
if(kbhit()?!=?0)?//检查当前是否有键盘输入,若有则返回一个非0值,否则返回0?
while(kbhit()?!=?0)?//可能存在多个按键,要全部取完,以最后一个为主?
?key?=?getch();?//将按键从控制台中取出并保存到key中?
switch(key)?
{?//左?
??break;?
??//右?
??//上?
??//下?
void?Move()?//蛇的移动?
int?i,?x,?y;?
int?t?=?sum;?//保存当前蛇的长度?
//记录当前蛇头的位置,并设置为空,蛇头先移动?
x?=?Snake[0].x;?y?=?Snake[0].y;?GameMap[x][y]?=?'.';?
Snake[0].x?=?Snake[0].x?+?dx[?Snake[0].now?];?
Snake[0].y?=?Snake[0].y?+?dy[?Snake[0].now?];?
Check_Border();?//蛇头是否越界?
Check_Head(x,?y);?//蛇头移动后的位置情况,参数为:?蛇头的开始位置?
if(sum?==?t)?//未吃到食物即蛇身移动哦?
for(i?=?1;?i?sum;?i++)?//要从蛇尾节点向前移动哦,前一个节点作为参照?
if(i?==?1)?//尾节点设置为空再移动?
GameMap[?Snake[i].x?][?Snake[i].y?]?=?'.';?
if(i?==?sum-1)?//为蛇头后面的蛇身节点,特殊处理?
Snake[i].x?=?x;?
?Snake[i].y?=?y;?
?Snake[i].now?=?Snake[0].now;?
else?//其他蛇身即走到前一个蛇身位置?
Snake[i].x?=?Snake[i+1].x;?
?Snake[i].y?=?Snake[i+1].y;?
?Snake[i].now?=?Snake[i+1].now;?
?
GameMap[?Snake[i].x?][?Snake[i].y?]?=?'#';?//移动后要置为'#'蛇身?
void?Check_Border()?//检查蛇头是否越界?
if(Snake[0].x?0?||?Snake[0].x?=?H?
||?Snake[0].y?0?||?Snake[0].y?=?L)?
over?=?1;?
void?Check_Head(int?x,?int?y)?//检查蛇头移动后的位置情况?
if(GameMap[?Snake[0].x?][?Snake[0].y?]?==?'.')?//为空?
GameMap[?Snake[0].x?][?Snake[0].y?]?=?'@';?
else?
if(GameMap[?Snake[0].x?][?Snake[0].y?]?==?'*')?//为食物?
GameMap[?Snake[0].x?][?Snake[0].y?]?=?'@';?
Snake[sum].x?=?x;?//新增加的蛇身为蛇头后面的那个?
?Snake[sum].y?=?y;?
?Snake[sum].now?=?Snake[0].now;?
?GameMap[?Snake[sum].x?][?Snake[sum].y?]?=?'#';?
sum++;?
Create_Food();?//食物吃完了马上再产生一个食物?
}
贪吃蛇c语言代码
#includestdio.h
#includestdlib.h
#includeWindows.h
#includeconio.h
#includetime.h
int score=0;//当前分数
//记录蛇的结点
int len = 0;//蛇的长度
//记录水果信息
int fx=0;//食物的横坐标
int fy=0;//食物的纵坐标
int fcount=0;//食物的数目
//主要函数操作
void createfood();//生成食物
void PrintgameMap(int x[],int y[]);//画游戏地图
void move(int x[],int y[]);//移动蛇
int main()
{
srand(time(NULL));
len++;
createfood();
PrintgameMap(x,y);
move(x,y);
return 0;
void createfood()
if(0==fcount)
int i,j;
int have=0;//为0表示食物不是食物的一部分
for(i=0;ilen;i++)
for(j=0;jlen;j++)
if(x[i]==fxy[j]==fy)
have=1;
break;
else
have=0;
if(1==have)//若为蛇的一部分,执行下一次循环
continue;
else//否则生成新的水果
fcount++;
fx=tfx;
fy=tfy;
//游戏地图
void PrintgameMap(int x[],int y[])
int snake = 0,food=0;
int i, j;
//画游戏地图,并画出蛇的初始位置
gamemap[i][j] = '=';
gamemap[i][j] = '#';
gamemap[i][j] = ' ';
//判断蛇是否在当前位置
int k;
for ( k = 0; k len; k++)
if (i == x[k]j == y[k])
snake = 1;
snake = 0;
if(fcountfx==ify==j)
food=1;
food=0;
//若蛇在当前位置
if (1==snake )
printf("*");
else if(1==food)
printf("f");
//若蛇不在当前位置并且当前位置没有水果
printf("%c", gamemap[i][j]);
printf("\n");
printf("score:%d",score);
//移动
void move(int x[],int y[])
char s;
s=getch();
int move=0,beat=0;
while (1)
memcpy(cx, x, sizeof(int)*len);
memcpy(cy, y, sizeof(int)*len);
//头
if (s=='w')
x[0]--;
move=1;
if(x[0]=0)
printf("Game over\n");
else if (s=='s')
x[0]++;
else if (s=='a')
y[0] --;
if(y[0]=0)
else if (s=='d')
y[0]++;
//身体
int i;
for ( i = 1; i len; i++)
x[i] = cx[i - 1];
y[i] = cy[i - 1];
for(i=1;ilen;i++)//要是咬到了自己
if(x[0]==x[i]y[0]==y[i])
beat=1;
beat=0;
if(1==beat)
if(1==move)
if(fcountx[0]==fxy[0]==fy)//如果吃到了果子
//拷贝当前蛇头地址到第二个结点
memcpy(x+1,cx,sizeof(int)*len);
memcpy(y+1,cy,sizeof(int)*len);
fcount--;
fx=0;
fy=0;
score++;
system("cls");
PrintgameMap( x, y);
if(kbhit())//判断是否按下按键
求贪吃蛇C语言代码
//
#include "stdafx.h"
#includewindows.h
int length=1;//蛇的当前长度,初始值为1
char direction;//蛇运动方向
char direction_before='s';//上一个状态蛇的运动方向
int live_death=1;//死活状态,0死,1活
int eat_flag=0;//吃食物与否的状态.0没吃 1吃了
int max=0;
int delay;//移动延迟时间
void gotoxy(int x, int y)//x为列坐标,y为行坐标
COORD pos = {x,y};
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut, pos);
void hidden()//隐藏光标
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(hOut,cci);
cci.bVisible=0;//赋1为显示,赋0为隐藏
SetConsoleCursorInfo(hOut,cci);
void update_score()
printf("我的分数:%d",length);
printf("最高记录:%d",max);
void create_window()
gotoxy(0,0);
printf("╔══════════════════╦═══════════════════╗");
printf("║ ║ ║");
printf("╠══════════════════╩═══════════════════╣");
printf("║ ║");
printf("╚══════════════════════════════════════╝");
void update_line()
if(eat_flag==0)//吃了食物就不用记住上一个状态的蛇尾,否则会被消掉
tail_before[0]=line[0][0];//记住上一个状态的蛇尾
tail_before[1]=line[0][1];
for(i=0;ilength-1;i++)//更新蛇头以后部分
line[i][0]=line[i+1][0];
line[i][1]=line[i+1][1];
line[length-1][0]=head[0];//更新蛇头
line[length-1][1]=head[1];
void initial()
FILE *fp;
gotoxy(head[0],head[1]);
printf("蛇");
line[0][0]=head[0];//把蛇头装入路线
line[0][1]=head[1];
if((fp=fopen("highest","r"))==NULL)
fp=fopen("highest","w");
fprintf(fp,"%d",0);
max=0;
fclose(fp);
}//第一次使用时,初始化奖最高分为0
fp=fopen("highest","r");
fscanf(fp,"%d",max);
update_score();
int flag,i;
srand((unsigned)time(NULL));
for(;;)
food[0]=rand()%(x_max+1);
}//产生一个偶数横坐标
food[1]=rand()%(y_max);
if(food[1]y_min)
for(i=0,flag=0;ilength;i++)//判断产生的食物是否在蛇身上,在flag=1,否则为0
if(food[0]==line[i][0] food[1]==line[i][1])
{ flag=1; break; }
if(flag==0)// 食物不在蛇身上 结束循环
gotoxy(food[0],food[1]);
void show_snake()
if(eat_flag==0)//没吃食物时消去蛇尾
gotoxy(tail_before[0],tail_before[1]);
printf(" ");//消除蛇尾
eat_flag=0;//吃了食物就回到没吃状态
char different_direction(char dir)
switch(dir)
case 'a': return 'd';
case 'd': return 'a';
case 'w': return 's';
case 's': return 'w';
void get_direction()
direction_before=direction;//记住蛇上一个状态的运动方向
while(kbhit()!=0) //调试
direction=getch();
if( direction_before == different_direction(direction) || (direction!='a' direction!='s' direction!='d' direction!='w') ) //新方向和原方向相反,或获得的方向不是wasd时,保持原方向
direction=direction_before;
switch(direction)
case 'w': head[1]--; break;
case 's': head[1]++; break;
void live_state()//判断蛇的生存状态
int i,flag;
for(i=0,flag=0;ilength-1;i++)//判断是否自己咬到自己
if( head[0]==line[i][0] head[1]==line[i][1])
flag=1;
if(head[0]=x_min || head[0]=x_max || head[1]=y_min || head[1]=y_max || flag==1)
create_window();
printf("游戏结束!\n");
live_death=0;
fprintf(fp,"%d",max);//保存最高分
void eat()
if(head[0]==food[0]head[1]==food[1])
length++;
eat_flag=1;
if(lengthmax)
max=length;
if(delay100)
void main()
int x=0,y=0;
// int i;
hidden();//隐藏光标
initial();
get_direction();
eat();
update_line();
live_state();//判断生死状态
if(live_death==1)
show_snake();
Sleep(delay);
求贪吃蛇的c语言代码
#include?graphics.h
#include?stdlib.h
#include?dos.h
#define?ESC?0x011b
int?i,key;
int?score=0;/*得分*/
struct?Food
int?x;/*食物的横坐标*/
int?y;/*食物的纵坐标*/
int?yes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
struct?Snake
int?x[N];
int?y[N];
int?node;/*蛇的节数*/
int?direction;/*蛇移动方向*/
int?life;/*?蛇的生命,0活着,1死亡*/
}snake;
void?Init(void);/*图形驱动*/
void?Close(void);/*图形结束*/
void?DrawK(void);/*开始画面*/
void?GameOver(void);/*结束游戏*/
void?GamePlay(void);/*玩游戏具体过程*/
void?PrScore(void);/*输出成绩*/
/*主函数*/
void?main(void)
Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/
/*图形驱动*/
void?Init(void)
int?gd=DETECT,gm;
initgraph(gd,gm,"c:\\tc");
cleardevice();
void?DrawK(void)
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
/*玩游戏具体过程*/
void?GamePlay(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;
PrScore();/*输出得分*/
while(1)/*可以重复玩游戏,压ESC键结束*/
?while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
?{
if(food.yes==1)/*需要出现新食物*/
?while(food.x!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
?while(food.y!=0)
food.y++;
food.yes=0;/*画面上有食物了*/
if(food.yes==0)/*画面上有食物了就要显示*/
??setcolor(GREEN);
??rectangle(food.x,food.y,food.x+10,food.y-10);
?for(i=snake.node-1;i0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
?{
??snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
switch(snake.direction)
case?1:snake.x[0]+=10;break;
if(snake.x[i]==snake.x[0]snake.y[i]==snake.y[0])
??GameOver();/*显示失败*/
??snake.life=1;
??break;
?}
GameOver();/*本次游戏结束*/
snake.life=1;?/*蛇死*/
if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
?break;
if(snake.x[0]==food.xsnake.y[0]==food.y)/*吃到食物以后*/
?setcolor(0);/*把画面上的食物东西去掉*/
?rectangle(food.x,food.y,food.x+10,food.y-10);
??/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;/*蛇的身体长一节*/
food.yes=1;/*画面上需要出现新的食物*/
score+=10;
PrScore();/*输出新得分*/
for(i=0;isnake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
??snake.y[i]-10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最后一节*/
rectangle(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)/*如果蛇死就跳出循环*/
?break;
key=bioskey(0);/*接收按键*/
if(key==ESC)/*按ESC键退出*/
?break;
/*判断是否往相反的方向移动*/
?else
?snake.direction=1;
?if(key==LEFTsnake.direction!=1)
?else
}/*endwhile(1)*/
/*游戏结束*/
void?GameOver(void)
cleardevice();?
PrScore();
setcolor(RED);
getch();
/*输出成绩*/
void?PrScore(void)
char?str[10];
setfillstyle(SOLID_FILL,YELLOW);
sprintf(str,"score:%d",score);
/*图形结束*/
void?Close(void)
closegraph();