c语言贪吃蛇最简单代码100行(简单的c语言代码贪吃蛇)
C语言的贪吃蛇源代码
?
//******友情提示:如想速度快点,请改小_sleep(500)函数中参数*****??
#include?stdio.h??
#include?stdlib.h??
#include?conio.h??
#include?string.h??
#include?time.h??
const?int?H?=?8;???//地图的高??
const?int?L?=?16;??//地图的长??
char?GameMap[H][L];???//游戏地图??
int??key;??//按键保存??
int??sum?=?1,?over?=?0;??//蛇的长度,?游戏结束(自吃或碰墙)??
int??dx[4]?=?{0,?0,?-1,?1};??//左、右、上、下的方向??
int??dy[4]?=?{-1,?1,?0,?0};??
struct?Snake???//蛇的每个节点的数据类型??
{??
?int?x,?y;??//左边位置??
?int?now;???//保存当前节点的方向,?0,1,2,3分别为左右上下??
}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()??//刷新显示地图??
{??
?int?i,?j;??
?while(1)??
?{????
??_sleep(500);?//延迟半秒(1000为1s),即每半秒刷新一次地图??
??Button();???//先判断按键在移动??
??Move();??
??if(over)??//自吃或碰墙即游戏结束??
??{???
???printf("\n**游戏结束**\n");??
???printf("?????_\n");??
???getchar();??
??????break;??
??}??
??system("cls");???//清空地图再显示刷新吼的地图??
??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");??
?}??
}??
void?Button()??//取出按键,并判断方向??
{??
?if(kbhit()?!=?0)?//检查当前是否有键盘输入,若有则返回一个非0值,否则返回0??
?{???
??while(kbhit()?!=?0)??//可能存在多个按键,要全部取完,以最后一个为主??
??????key?=?getch();?//将按键从控制台中取出并保存到key中??
??switch(key)??
??{???//左??
???case?75:??Snake[0].now?=?0;??
??????????break;??
????????????//右??
????????????case?77:??Snake[0].now?=?1;???????
??????????break;??
????????????//上??
???case?72:??Snake[0].now?=?2;??
??????????break;??
????????????//下??
???case?80:??Snake[0].now?=?3;??
??????????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();??//食物吃完了马上再产生一个食物??
??}??
??else?
???over?=?1;??
}
如何用C语言写贪吃蛇
#includeconio.h #includegraphics.h #includetime.h #includestring.h #includemalloc.h #includestdio.h int grade=5,point=0,life=3; void set(),menu(),move_head(),move_body(),move(),init_insect(),left(),upon(),right(),down(),init_graph(),food_f(),ahead(),crate(); struct bug { int x; int y; struct bug *last; struct bug *next; }; struct fd { int x; int y; int judge; }food={0,0,0}; struct bug *head_f=NULL,*head_l,*p1=NULL,*p2=NULL; void main() { char ch; initgraph(800,600); set(); init_insect(); while(1) { food_f(); Sleep(grade*10); setcolor(BLACK); circle(head_l-x,head_l-y,2); setcolor(WHITE); move_body(); if(kbhit()) { ch=getch(); if(ch==27) { ahead(); set(); } else if(ch==-32) { switch(getch()) { case 72:upon();break; case 80:down();break; case 75:left();break; case 77:right();break; } } else ahead(); } else { ahead(); } if(head_f-x==food.xhead_f-y==food.y) { Sleep(100); crate(); food.judge=0; point=point+(6-grade)*10; if(food.x30||food.y30||food.x570||food.y570) life++; menu(); } if(head_f-x5||head_f-x595||head_f-y5||head_f-y595) { Sleep(1000); life--; food.judge=0; init_graph(); init_insect(); menu(); } for(p1=head_f-next;p1!=NULL;p1=p1-next) { if(head_f-x==p1-xhead_f-y==p1-y) { Sleep(1000); life--; food.judge=0; init_graph(); init_insect(); menu(); break; } } if(life==0) { outtextxy(280,300,"游戏结束!"); getch(); return; } move(); }; } void init_graph() { clearviewport(); setlinestyle(PS_SOLID,1,5); rectangle(2,2,600,598); setlinestyle(PS_SOLID,1,1); } void set() { init_graph(); outtextxy(640,50,"1、开始 / 返回"); outtextxy(640,70,"2、退出"); outtextxy(640,90,"3、难度"); outtextxy(640,110,"4、重新开始"); switch(getch()) { case '1': menu();setcolor(GREEN);circle(food.x,food.y,2);setcolor(WHITE);return; case '2': exit(0);break; case '3': outtextxy(700,90,":1 2 3 4 5");grade=getch()-48;set();break; case '4': food.judge=0,grade=5;point=0;life=3;init_insect();menu();break; default: outtextxy(250,300,"输入错误!"); set();break; } } void menu() { char str[20],str1[]={"分数:"},str2[]={"难度:"},str3[]={"生命值:"}; init_graph(); sprintf(str,"%d",point); strcat(str1,str); outtextxy(640,50,str1); sprintf(str,"%d",grade); strcat(str2,str); outtextxy(640,70,str2); sprintf(str,"%d",life); strcat(str3,str); outtextxy(640,90,str3); outtextxy(640,110,"设置:ESC"); } void init_insect() { head_f=(struct bug *)malloc(sizeof(struct bug)); head_f-last=NULL; head_f-x=300; head_f-y=300; p2=head_f-next=p1=(struct bug *)malloc(sizeof(struct bug)); p1-last=head_f; p1-x=295; p1-y=300; p1=p1-next=(struct bug *)malloc(sizeof(struct bug)); p1-next=NULL; p1-x=290; p1-y=300; p1-last=p2; head_l=p1; } void move() { for(p1=head_f;p1!=NULL;p1=p1-next) { circle(p1-x,p1-y,2); } } void move_head() { } void move_body() { for(p1=head_l,p2=p1-last;p2!=NULL;p1=p2,p2=p2-last) { p1-x=p2-x; p1-y=p2-y; } } void ahead() { p1=head_f; p2=p1-next; p2=p2-next; if(p1-x==p2-x) { if(p1-yp2-y) head_f-y+=5; else head_f-y-=5; } else { if(p1-xp2-x) { head_f-x+=5; } else head_f-x-=5; } } void upon() { p1=head_f-next; p1=p1-next; head_f-y-=5; if(p1-x==head_f-xp1-y==head_f-y) { head_f-y+=5; ahead(); } } void down() { p1=head_f-next; p1=p1-next; head_f-y+=5; if(p1-x==head_f-xp1-y==head_f-y) { head_f-y-=5; ahead(); } } void left() { p1=head_f-next; p1=p1-next; head_f-x-=5; if(p1-x==head_f-xp1-y==head_f-y) { head_f-x+=5; ahead(); } } void right() { p1=head_f-next; p1=p1-next; head_f-x+=5; if(p1-x==head_f-xp1-y==head_f-y) { head_f-x-=5; ahead(); } } void food_f() { if(!food.judge) { food.x=(rand()%117+1)*5; food.y=(rand()%117+1)*5; food.judge=1; if(food.x30||food.y30||food.x570||food.y570) { setcolor(RED); circle(f
c语言贪吃蛇代码
基本思路:
蛇每吃一个食物蛇身子就增加一格,用UP, DOWN, LEFT, RIGHT控制蛇头的运动,而蛇身子跟着蛇头走,每后一格蛇身子下一步走到上一格蛇身子的位置,以此类推。
#include stdio.h
#include conio.h
#include windows.h
#define BEG_X 2
#define BEG_Y 1
#define WID 20
#define HEI 20
HANDLE hout;
typedef enum {UP, DOWN, LEFT, RIGHT} DIR;
typedef struct Snake_body
{
COORD pos;//蛇身的位置
struct Snake_body *next;//下一个蛇身
struct Snake_body *prev;//前一个蛇身
}SNAKE, *PSNAKE;
PSNAKE head = NULL;//蛇头
PSNAKE tail = NULL;//蛇尾
//画游戏边框的函数
void DrawBorder()
{
int i, j;
COORD pos = {BEG_X, BEG_Y};
for(i = 0; i HEI; ++i)
{
SetConsoleCursorPosition(hout, pos);
for(j = 0; j WID; ++j)
{
if(i == 0)//第一行
{
if(j == 0)
printf("┏");
else if(j == WID - 1)
printf("┓");
else
printf("━");
}
else if(i == HEI - 1)//最后一行
{
if(j == 0)
printf("┗");
else if(j == WID - 1)
printf("┛");
else
printf("━");
}
else if(j == 0 || j == WID - 1)//第一列或最后一列
printf("┃");
else
printf(" ?");
}
++pos.Y;
}
}
//添加蛇身的函数
void AddBody(COORD pos)
{
PSNAKE pnew = (PSNAKE)calloc(1, sizeof(SNAKE));
pnew-pos = pos;
if(!head)
{
head = tail = pnew;
}
else
{
pnew-next = head;//新创建蛇身的next指向原先的蛇头
head-prev = pnew;//原先的蛇头的prev指向新创建的蛇身
head = pnew;//把新创建的蛇身作为新的蛇头
}
SetConsoleCursorPosition(hout, head-pos);
printf("◎");
}
//蛇身移动的函数
void MoveBody(DIR dir)
{
PSNAKE ptmp;
COORD pos = head-pos;
switch(dir)
{
case UP:
if(head-pos.Y BEG_Y + 1)
--pos.Y;
else
return;
break;
case DOWN:
if(head-pos.Y BEG_Y + HEI - 2)
++pos.Y;
else
return;
break;
case LEFT:
if(head-pos.X BEG_X + 2)
pos.X -= 2;
else
return;
break;
case RIGHT:
if(head-pos.X BEG_X + (WID - 2) * 2)
pos.X += 2;
else
return;
break;
}
AddBody(pos);//添加了一个新的蛇头
ptmp = tail;//保存当前的蛇尾
tail = tail-prev;
if(tail)
tail-next = NULL;
SetConsoleCursorPosition(hout, ptmp-pos);
printf(" ?");
free(ptmp);
}
int main()
{
int ctrl;
DIR dir = RIGHT;//初始蛇的方向是向右的
COORD pos = {BEG_X + 2, BEG_Y + HEI / 2};
system("color 0E");
system("mode con cols=90 lines=30");
hout = GetStdHandle(STD_OUTPUT_HANDLE);
printf(" ? ?------------贪吃蛇的移动------------");
DrawBorder();
//自定义几个蛇的身体
AddBody(pos);
pos.X += 2;
AddBody(pos);
pos.X += 2;
AddBody(pos);
pos.X += 2;
AddBody(pos);
pos.X += 2;
AddBody(pos);
pos.X += 2;
AddBody(pos);
pos.X += 2;
AddBody(pos);
//控制蛇的移动
while(ctrl = getch())
{
switch(ctrl)
{
case 'w':
if(dir == DOWN)
continue;
dir = UP;
break;
case 's':
if(dir == UP)
continue;
dir = DOWN;
break;
case 'a':
if(dir == RIGHT)
continue;
dir = LEFT;
break;
case 'd':
if(dir == LEFT)
continue;
dir = RIGHT;
break;
case 'q':
return 0;
}
MoveBody(dir);
}
return 0;
}
扩展资料:
实现逻辑
1,可以设置光标,就能实现制定位置打印制定符号。
2,涉及一个结构体,包含两个元素坐标元素和一个结构体指针。
3,结构体串联形成链表,遍历获取成员坐标,打印符号得到蛇身。
4,不断的加头,去尾,重新遍历坐标,再打印形成蛇的移动。
5,食物产生的位置判定,不能越界,也不能与蛇身体重合。
6,蛇的转向判定,一条规则,不允许倒退。
7,转向的实现,跟行进方向决定新的关节坐标(当前头的上下左右)
8,死亡检测,是否头节点坐标是否与墙壁重合,是否与身体其他关节重合。
9,加速减速,设置刷新休眠时间实现。
参考资料来源:百度百科-C语言
贪吃蛇c语言代码
#includestdio.h
#includestdlib.h
#includeWindows.h
#includeconio.h
#includetime.h
char gamemap[20][40];//游戏地图大小 20*40
int score=0;//当前分数
//记录蛇的结点
int x[800];//每个结点的行编号
int y[800];//每个结点的列编号
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));
//初始化蛇头和身体的位置,默认刚开始蛇长为2
x[len] = 9;
y[len] = 9;
len++;
x[len] = 9;
y[len] = 8;
len++;
createfood();
PrintgameMap(x,y);
move(x,y);
return 0;
}
void createfood()
{
if(0==fcount)
{
int tfx=rand()%18+1;
int tfy=rand()%38+1;
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;
break;
}
}
}
}
//游戏地图
void PrintgameMap(int x[],int y[])
{
int snake = 0,food=0;
int i, j;
//画游戏地图,并画出蛇的初始位置
for (i = 0; i 20; i++)
{
for (j = 0; j 40; j++)
{
if (i == 0 j = 1 j = 38)
{
gamemap[i][j] = '=';
}
else if (i == 19 j = 1 j = 38)
{
gamemap[i][j] = '=';
}
else if (j == 0 || j == 39)
{
gamemap[i][j] = '#';
}
else
{
gamemap[i][j] = ' ';
}
//判断蛇是否在当前位置
int k;
for ( k = 0; k len; k++)
{
if (i == x[k]j == y[k])
{
snake = 1;
break;
}
else
{
snake = 0;
}
}
{
if(fcountfx==ify==j)
{
food=1;
}
else
{
food=0;
}
}
//若蛇在当前位置
if (1==snake )
{
printf("*");
}
else if(1==food)
{
printf("f");
}
//若蛇不在当前位置并且当前位置没有水果
else
{
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)
{
int cx[800];
int cy[800];
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");
break;
}
}
else if (s=='s')
{
x[0]++;
move=1;
if(x[0]=19)
{
printf("Game over\n");
break;
}
}
else if (s=='a')
{
y[0] --;
move=1;
if(y[0]=0)
{
printf("Game over\n");
break;
}
}
else if (s=='d')
{
y[0]++;
move=1;
if(y[0]=39)
{
printf("Game over\n");
break;
}
}
//身体
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;
}
else
{
beat=0;
}
}
if(1==beat)
{
printf("Game over\n");
break;
}
if(1==move)
{
if(fcountx[0]==fxy[0]==fy)//如果吃到了果子
{
//拷贝当前蛇头地址到第二个结点
memcpy(x+1,cx,sizeof(int)*len);
memcpy(y+1,cy,sizeof(int)*len);
len++;
fcount--;
fx=0;
fy=0;
score++;
createfood();
}
Sleep(70);
system("cls");
PrintgameMap( x, y);
}
else
continue;
if(kbhit())//判断是否按下按键
{
s=getch();
}
}
}
求贪吃蛇C语言代码
// 2.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#includestdio.h
#includeconio.h
#includetime.h
#includewindows.h
#includestdlib.h
int length=1;//蛇的当前长度,初始值为1
int line[100][2];//蛇的走的路线
int head[2]={40,12};//蛇头
int food[2];//食物的位置
char direction;//蛇运动方向
int x_min=1,x_max=77, y_min=2, y_max=23;//设置蛇的运动区域
int tail_before[2]={40,12};//上一个状态的蛇尾
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()//隐藏光标
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(hOut,cci);
cci.bVisible=0;//赋1为显示,赋0为隐藏
SetConsoleCursorInfo(hOut,cci);
}
void update_score()
{
gotoxy(2,1);
printf("我的分数:%d",length);
gotoxy(42,1);
printf("最高记录:%d",max);
}
void create_window()
{
gotoxy(0,0);
printf("╔══════════════════╦═══════════════════╗");
printf("║ ║ ║");
printf("╠══════════════════╩═══════════════════╣");
printf("║ ║");
printf("║ ║");
printf("║ ║");
printf("║ ║");
printf("║ ║");
printf("║ ║");
printf("║ ║");
printf("║ ║");
printf("║ ║");
printf("║ ║");
printf("║ ║");
printf("║ ║");
printf("║ ║");
printf("║ ║");
printf("║ ║");
printf("║ ║");
printf("║ ║");
printf("║ ║");
printf("║ ║");
printf("║ ║");
printf("╚══════════════════════════════════════╝");
}
void update_line()
{
int i;
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
else
{
fp=fopen("highest","r");
fscanf(fp,"%d",max);
}
update_score();
}
void createfood()
{
int flag,i;
srand((unsigned)time(NULL));
for(;;)
{
for(;;)
{
food[0]=rand()%(x_max+1);
if(food[0]%2==0 food[0]x_min)
break;
}//产生一个偶数横坐标
for(;;)
{
food[1]=rand()%(y_max);
if(food[1]y_min)
break;
}
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)// 食物不在蛇身上 结束循环
break;
}
gotoxy(food[0],food[1]);
printf("蛇");
}
void show_snake()
{
gotoxy(head[0],head[1]);
printf("蛇");
if(eat_flag==0)//没吃食物时消去蛇尾
{
gotoxy(tail_before[0],tail_before[1]);
printf(" ");//消除蛇尾
}
else
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';
}
return 0;
}
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 'a': head[0]-=2; break;
case 'd': head[0]+=2; break;
case 'w': head[1]--; break;
case 's': head[1]++; break;
}
}
void live_state()//判断蛇的生存状态
{
FILE *fp;
int i,flag;
for(i=0,flag=0;ilength-1;i++)//判断是否自己咬到自己
if( head[0]==line[i][0] head[1]==line[i][1])
{
flag=1;
break;
}
if(head[0]=x_min || head[0]=x_max || head[1]=y_min || head[1]=y_max || flag==1)
{
system("cls");
create_window();
update_score();
gotoxy(35,12);
printf("游戏结束!\n");
Sleep(500);
live_death=0;
fp=fopen("highest","w");
fprintf(fp,"%d",max);//保存最高分
}
}
void eat()
{
if(head[0]==food[0]head[1]==food[1])
{
length++;
line[length-1][0]=head[0];//更新蛇头
line[length-1][1]=head[1];
eat_flag=1;
createfood();
if(lengthmax)
max=length;
update_score();
if(delay100)
delay-=30;//加速
}
}
void main()
{
int x=0,y=0;
// int i;
hidden();//隐藏光标
create_window();
initial();
createfood();
for(direction='s',delay=600;;)
{
get_direction();
eat();
update_line();
live_state();//判断生死状态
if(live_death==1)
{
show_snake();
}
else
break;
Sleep(delay);
}
}
关于C语言写贪吃蛇
我以实现一个~~请笑纳~#include "stdio.h"
#include "graphics.h"
#include "stdlib.h"
#include "dos.h"
#define N 200
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define Esc 0x011b
int i,key;
int score=0;
int gamespeed=50000;struct Food
{
int x;
int y;
int yes;
}food;
struct Snake
{
int x[N];
int y[N];
int node;
int direction;
int life;
}snake;void Init();
void DrawK();
void GamePlay();
void GameOver();
void PrScore();
void Close();
void main()
{
Init();/*图形界面驱动*/
DrawK();/*作围墙*/
GamePlay();
Close();
}
/*图形界面驱动模块*/
void Init()
{
int gd=DETECT,gm;
initgraph(gd,gm,"");
}
/*作矩形围墙*/
void DrawK()
{
setcolor(11);
setlinestyle(0,0,3);
for(i=50;i=600;i+=10)
{
rectangle(i,40,i+10,49);
rectangle(i,451,i+10,460);
}
for(i=40;i=450;i+=10)
{
rectangle(50,i,59,i+10);
rectangle(601,i,610,i+10);
}
getch();
}void GamePlay()
{
randomize();
/*初始状态*/
food.yes=1;
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();
/*重复玩游戏模块*/
while(1)
{
/*没有按键情况下蛇的运动*/
while(!kbhit())
{
/*食物的出现*/
if(food.yes==1)
{
food.x=rand()%400+60;
food.y=rand()%350+60;
/*将食物出现位置控制在整格*/
while(food.x%10!=0)
food.x++;
while(food.y%10!=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;
case 2:snake.x[0]-=10;break;
case 3:snake.y[0]-=10;break;
case 4:snake.y[0]+=10;break;
}
/*蛇自己与自己相撞时生命结束*/
for(i=3;isnake.node;i++)
{
if(snake.x[i]==snake.x[0]snake.y[0]==snake.y[i])
{
GameOver();
snake.life=1;
break;
}
}
/*蛇撞墙时死亡*/
if(snake.x[0]55||snake.x[0]595||snake.y[0]55||snake.y[0]455)
{
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.x[snake.node]=-20;
snake.y[snake.node]=-20;
snake.node++;
food.yes=1;
score+=10;
PrScore();
}
/*画蛇*/
setcolor(4);
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);
}/*end while(!kbhit())*/
if(snake.life==1)
break;
key=bioskey(0);
if(key==Esc)
break;
else if(key==UPsnake.direction!=4)
snake.direction=3;
else if(key==RIGHTsnake.direction!=2)
snake.direction=1;
else if(key==LEFTsnake.direction!=1)
snake.direction=2;
else if(key==DOWNsnake.direction!=3)
snake.direction=4;
}/*endwhile(1)*/
}
//游戏结束
void GameOver()
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();
}/*打印分数*/
void PrScore()
{
char str[10];
setfillstyle(1,14);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);
} /*图形结束*/
void Close()
{
getch();
closegraph();
}