当前位置:首页 > 正文

贪吃蛇游戏函数c语言代码_贪吃蛇c语言代码详解

更新时间:2025-02-02 18:04 阅读量:67925

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