一、源码简介这是一个可以进行贪吃蛇游戏的小程序,采用C语言进行编写。上下左右控制运动方向,吃到食物得分,如果撞墙或者咬到自身,游戏结束。编译环境:VC6.0(采取纯C语言写法)第三方库:无二、运行截图游戏结束界面

三、源码解析先看整个程序的逻辑:开始界面进行游戏初始化以下循环:{根据输入按键的不同,做出不同的反应。每经过一段时间,蛇进行移动。}结束游戏主函数以及游戏运行的Gamerun函数如下。
int main(){ Gamestart(); Gamerun(); Gameend(); return 0;}void Gamerun(){ Initsnake();//
初始化蛇 Createfood();//
创建食物 while(1) { Pos(64,10); printf("
得分:%d ",score); if(GetAsyncKeyState(VK_UP)&&status!=D)status=U;//
根据之前是否有按下某种按键,改变前进方向或者暂停 else if(GetAsyncKeyState(VK_DOWN)&&status!=U)status=D; else if(GetAsyncKeyState(VK_LEFT)&&status!=R)status=L; else if(GetAsyncKeyState(VK_RIGHT)&&status!=L)status=R; else if(GetAsyncKeyState(VK_SPACE))Pause(); else if(GetAsyncKeyState(VK_ESCAPE)) { exit(0); break; } else; Sleep(sleeptime);//
经过一段时间继续前进 if(Snakemove());//
如果行动成功(没有死) else break;//
否则跳出循环
其中,接收输入按键可以用中的GetAsyncKeyState函数,它可以判断之前的一段时间内是否输入了某按键。我们用U,D,L,R来表示蛇头朝向上下左右。经过定义之后,可以用这四个字母为status赋值。define D 2define R 4int status;
蛇并不能180˚转弯,所以要注意判定按键方向是否与目前前进方向相反。另外我们在这里还用了一个Pos函数。这个函数的目的是将光标定位到(x,y)处,并且能在此进行写入。void Pos(int x,int y)//
定义一个设置光标位置的函数{ COORD pos; HANDLE hOutput; pos.X=x; pos.Y=y; hOutput=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOutput,pos);}用到的几个函数都可以在当中找到。COORD是windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标;GetStdHandle用于返回一个句柄,表明是输入,输出还是错误(参数分别是STD_INPUT_HANDLE,STD_OUTPUT_HANDLE,STD_ERROR_HANDLE),HANDLE是对应的句柄的结构体;SetConsoleCursorPosition可在指定的控制台屏幕缓冲区中设置光标位置。更多内容可以在控制台文档 - Windows Console | Microsoft Docs中搜索找到。
Pause是另外一个我们定义的函数。如果不按下空格,程序就会循环Sleep指令。void Pause()//
定义暂停函数{ while(1) { Sleep(100); if(GetAsyncKeyState(VK_ESCAPE))break; else; }}
在进行具体游戏函数的编写之前,我们还需要确定游戏数据是如何存储及调用的,也就是如何保存蛇身的坐标。像蛇身这样的线性结构,非常适合用一个链表进行存储。将蛇身的一个点的坐标放入一个结构体当中,结构体中还有指向下一个结构体的指针。struct SNAKE//
定义蛇身上的一个点{ int x,y; SNAKE *next;//
定义一个指针,指向蛇下一个点的地址}; 准备工作做完之后,接下来的是游戏主体部分。接下来我们要写的函数包括:void Creatmap()//
定义创建地图的函数void Initsnake()//
初始化函数int Hitwall()//
检测是否撞墙int Eatitself()//
检测是否碰到自身void Createfood()//
定义创建食物的函数int Snakemove()//
定义蛇身行动的函数void Gamestart()//
开始页面以及初始化void Gameend()//
游戏结束其中Snakemove会用到Hitwall,Eatitself,Createfood。

  1. 创建地图void Creatmap()//
    定义创建地图的函数{ int i; for(i=0;iy=5; tail->next=NULL; for(i=1;inext=tail; head->x=24+2i; head->y=5; tail=head; } while(tail!=NULL)//
    从头到尾,输出蛇身 { Pos(tail->x,tail->y); printf("■"); tail=tail->next; }}malloc
    函数用于动态为指针分配内存空间。其参数为分配空间的大小,返回值为该空间地址。注意这个地址对应void类型的指针,所以一定要用(SNAKE
    )这样方式进行强制类型转化。malloc函数的意义是初始化指针。如果指针不进行初始化,那么就会指向一个没有意义的地址,成为一个野指针,在对指针指向的位置进行读或写操作时,程序就会报错。类似的函数还有new,有兴趣的同学可以查查它们的区别。
    1. 检测撞墙行为int Hitwall()//
      检测是否撞墙{ if(head->x==0||head->x==56||head->y==0||head->y==26)return 1; else return 0;}
  2. 检测是否碰到自身int Eatitself()//
    检测是否碰到自身{ SNAKE *s; s=head->next; while(s->next!=NULL)//利用循环对每个点进行判定 { if(s->x==head->x&&s->y==head->y)return 1; else s=s->next; } return 0;}
    1. 创建食物void Createfood()//
      定义创建食物的函数{ SNAKE food_1; SNAKE q; srand((unsigned)time(NULL));//
      利用时间获取随机种子
  3. 蛇身行动int Snakemove()//
    定义蛇身行动的函数{ SNAKE nexthead;//蛇将要走到的位置 nexthead=(SNAKE)malloc(sizeof(SNAKE)); SNAKE *n; if(status==U)//
    根据移动方向,计算下一个点的坐标 { nexthead->x=head->x; nexthead->y=head->y-1; nexthead->next=head; } else if(status==D) { nexthead->x=head->x; nexthead->y=head->y+1; nexthead->next=head; } else if(status==L) { nexthead->x=head->x-2; nexthead->y=head->y; nexthead->next=head; } else { nexthead->x=head->x+2; nexthead->y=head->y; nexthead->next=head; } head=nexthead; if(Hitwall())//
    是否撞墙 { typelose=1; return 0; } else; if(Eatitself())//
    是否咬到自身 { typelose=2; return 0; } else; if(head->x==food->x&&head->y==food->y)//
    如果前方是食物 { score++; Createfood(); } else { n=head; while(n->next->next!=NULL)n=n->next;//
    将移动到的下一个点打印,同时去掉尾部的点 Pos(n->next->x,n->next->y); printf(" "); Pos(head->x,head->y); printf("■"); free(n->next); n->next=NULL; } return 1;}
  4. 游戏开始void Gamestart()//
    开始页面以及初始化{ system("mode con cols=100 lines=30"); Startpage();//
    开始页面 Creatmap();//
    绘制地图}void Gameend()//
    游戏结束{ system("cls");//
    清除屏幕 Pos(24,12); if(typelose==1) { printf("对不起,您撞到墙了。游戏结束."); } else if(typelose==2) { printf("对不起,您咬到自己了。游戏结束."); } Pos(24,13); printf("您的得分是%d\n",score);}

【瓜分奖池】c语言实现贪吃蛇小游戏 第5张插图