要做出贪吃蛇这个小游戏,首先要有个背景板,也就是游戏页面,这里用到的是easyX的图片库,用到graphics.h的头文件,要随机产生贪吃蛇要吃的食物的位置,所以也要有time.h 的头文件用来生成随机数
头文件部分如下
#include#include #include //控制台输入输出头文件 #include
主函数的代码如下
int main(){
initgraph(900,500);//初始化游戏界面,括号内分别是界面的长和宽
while(1){ //由于光有一个initgraph,会出现闪退的情况,就用死循环,让界面一直展示出来
}
}
初始游戏界面运行结果如图
做好了空白的游戏界面,就要开始画蛇了
绘制蛇在画蛇的时候首先得想一下,这个蛇要用c语言中的什么结构来表示呢,
咱先对蛇进行分析一下,蛇要有自己的运动方向,长度,咱之后还要改变蛇的方向来让蛇吃到食物,
我们要画的蛇是一节一节的,蛇身是由一块一块的小方格组成,所以我们就用一个数组来作为蛇的身子,每个数组里面的值装的是坐标,这个坐标就是每一块小方块的坐标,
运用c语言独有的结构体来代表蛇,这个结构体里面包含蛇身(坐标数组),蛇长,蛇的方向
添加完蛇的信息的代码如下#include#include #include #include typedef enum {//方向 up=72, down=80, left=75, right=77 }CH; struct coor{ int x; int y; }; struct snake{ struct coor scr[66]; //我就定义蛇的长度申请的最大空间就是66,如果不到66,数组剩下的就空着 int n; //蛇的节数,为什么这里还要在定义一个变量呢,因为这个变量用来定义蛇初始多长 CH ch; //蛇的方向 }Snake; int main(){ initgraph(900,500);//初始化游戏界面,括号内分别是界面的长和宽 while(1){ //由于光有一个initgraph,会出现闪退的情况,就用死循环,让界面一直展示出来 } }
咱这是把蛇的基础信息是都定义好了,还没画出来蛇,接下来就drawsnake
画蛇的步骤我是放在一个单独的方法当中,也可以直接写在主函数里面,随便你
画蛇就用到一个函数rectangle()用来画出一个个的长方形,括号中的函数,分成两组,分别是长方形左上角的坐标,和右下角的坐标,
添加Drawsnake()方法后的代码如下#include#include #include #include typedef enum {//方向 up=72, down=80, left=75, right=77 }CH; struct coor{ int x; int y; }; struct snake{ struct coor scr[66]; //我就定义蛇的长度申请的最大空间就是66,如果不到66,数组剩下的就空着 int n; //蛇的节数,为什么这里还要在定义一个变量呢,因为这个变量用来定义蛇初始多长 CH ch; //蛇的方向 }Snake; void Drawsnake(){ for(int i=Snake.n;i>=0;i--){ //for循环逐一画出每一节蛇的身体 rectangle(Snake.scr[i].x,Snake.scr[i].y,Snake.scr[i].x+10,Snake.scr[i].y+10); //Snake.src[i]表示蛇的第i节身体 } } int main(){ initgraph(900,500);//初始化游戏界面,括号内分别是界面的长和宽 while(1){ //由于光有一个initgraph,会出现闪退的情况,就用死循环,让界面一直展示出来 } }
在循环中i的初始值是Snake.n,是从蛇尾开始画的
再次运行代码,游戏界面和第一次一样啊,是空白的啥也没有。不是Drawsnake()方法没起作用,那是因为还没给游戏初始化,蛇初始长度,蛇最开始出现的位置坐标,蛇的方向都没给出来
而且细心的你有没有发现,我刚刚Drawsnake()方法都没在主函数中调用哎!嘿嘿,怪不得啥也没有
那么接下来就是给游戏初始化
游戏初始化 添加初始化后的代码#include#include #include #include typedef enum {//方向 up=72, down=80, left=75, right=77 }CH; struct coor{ int x; int y; }; struct snake{ struct coor scr[66]; //我就定义蛇的长度申请的最大空间就是66,如果不到66,数组剩下的就空着 int n; //蛇的节数,为什么这里还要在定义一个变量呢,因为这个变量用来定义蛇初始多长 CH ch; //蛇的方向 }Snake; void Drawsnake(){ for(int i=Snake.n;i>=0;i--){ //for循环逐一画出每一节蛇的身体 rectangle(Snake.scr[i].x,Snake.scr[i].y,Snake.scr[i].x+10,Snake.scr[i].y+10); //Snake.src[i]表示蛇的第i节身体 } } void Initgame(){ Snake.n=5; Snake.ch=right; Snake.scr[0].x=0; //定义蛇头的坐标 Snake.scr[0].y=0; } int main(){ initgraph(900,500);//初始化游戏界面,括号内分别是界面的长和宽 Initgame(); Drawsnake(); while(1){ //由于光有一个initgraph,会出现闪退的情况,就用死循环,让界面一直展示出来 } }
编译运行后只能看见一个小方块,接下来我们就让蛇动起来
让蛇动起来我们想对蛇头思考,让蛇头不断的向前移动,就是将它的坐标不断的向前加一格的距离,画出新的方块把上一次方块擦去,就能在视觉上实现移动的效果。剩下的几节蛇身,依次继承前一节的坐标,再画出新的,擦掉旧的,那么就实现了整个蛇的移动
#include#include #include #include typedef enum {//方向 up=72, down=80, left=75, right=77 }CH; struct coor{ int x; int y; }; struct snake{ struct coor scr[66]; //我就定义蛇的长度申请的最大空间就是66,如果不到66,数组剩下的就空着 int n; //蛇的节数,为什么这里还要在定义一个变量呢,因为这个变量用来定义蛇初始多长 CH ch; //蛇的方向 }Snake; void Drawsnake(){ for(int i=Snake.n;i>=0;i--){ //for循环逐一画出每一节蛇的身体 rectangle(Snake.scr[i].x,Snake.scr[i].y,Snake.scr[i].x+10,Snake.scr[i].y+10); //Snake.src[i]表示蛇的第i节身体 } } void Initgame(){ Snake.n=5; Snake.ch=right; Snake.scr[0].x=0; //定义蛇头的坐标 Snake.scr[0].y=0; } void Snakemove(){ for(int i=Snake.n;i>=0;i--){ Snake.scr[i+1].x=Snake.scr[i].x; Snake.scr[i+1].y=Snake.scr[i].y; } switch(Snake.ch){ //根据方向,决定下一次蛇头的坐标向哪个方向添加一格的距离 case up:Snake.scr[0].y -=10; break; case down:Snake.scr[0].y+=10; break; case left:Snake.scr[0].x-=10; break; case right:Snake.scr[0].x+=10; break; } Drawsnake(); } int main(){ initgraph(900,500);//初始化游戏界面,括号内分别是界面的长和宽 Initgame(); Drawsnake(); while(1){ //由于光有一个initgraph,会出现闪退的情况,就用死循环,让界面一直展示出来 Snakemove(); //要放在循环中调用 } }
从运行后的效果看,蛇的方块画的太快了,一瞬间就全画出来了,而且旧的印记还没有删除,没看到运动的效果。
我们在后面添加sleep()函数,是可以让程序短暂的终止,括号里面写暂停多长时间,单位是毫秒
再添加cleardevice()的函数,用来清除界面
添加蛇动起来的函数后的代码
#include控制蛇的方向#include #include #include typedef enum {//方向 up=72, down=80, left=75, right=77 }CH; struct coor{ int x; int y; }; struct snake{ struct coor scr[66]; //我就定义蛇的长度申请的最大空间就是66,如果不到66,数组剩下的就空着 int n; //蛇的节数,为什么这里还要在定义一个变量呢,因为这个变量用来定义蛇初始多长 CH ch; //蛇的方向 }Snake; void Drawsnake(){ for(int i=Snake.n;i>=0;i--){ //for循环逐一画出每一节蛇的身体 rectangle(Snake.scr[i].x,Snake.scr[i].y,Snake.scr[i].x+10,Snake.scr[i].y+10); //Snake.src[i]表示蛇的第i节身体 } } void Initgame(){ Snake.n=5; Snake.ch=right; Snake.scr[0].x=0; //定义蛇头的坐标 Snake.scr[0].y=0; } void Snakemove(){ for(int i=Snake.n;i>=0;i--){ Snake.scr[i+1].x=Snake.scr[i].x; Snake.scr[i+1].y=Snake.scr[i].y; } switch(Snake.ch){ //根据方向,决定下一次蛇头的坐标向哪个方向添加一格的距离 case up:Snake.scr[0].y -=10; break; case down:Snake.scr[0].y+=10; break; case left:Snake.scr[0].x-=10; break; case right:Snake.scr[0].x+=10; break; } Drawsnake(); } int main(){ initgraph(900,500);//初始化游戏界面,括号内分别是界面的长和宽 Initgame(); Drawsnake(); while(1){ //由于光有一个initgraph,会出现闪退的情况,就用死循环,让界面一直展示出来 Snakemove(); //要放在循环中调用 Sleep(100); cleardevice(); } }
方案有变-----------------------------------------------------------------------------------后续更新



