C语言,贪吃蛇真萌新型,分步骤记述

游戏页面创建

要做出贪吃蛇这个小游戏,首先要有个背景板,也就是游戏页面,这里用到的是easyX的图片库,用到graphics.h的头文件,要随机产生贪吃蛇要吃的食物的位置,所以也要有time.h 的头文件用来生成随机数

头文件部分如下

#include <stdio.h>
#include <graphics.h>
#include <conio.h>//控制台输入输出头文件
#include <time.h>

主函数的代码如下

int main(){
	
	initgraph(900,500);//初始化游戏界面,括号内分别是界面的长和宽
	while(1){ //由于光有一个initgraph,会出现闪退的情况,就用死循环,让界面一直展示出来
		
	}
	
}

初始游戏界面运行结果如图

 做好了空白的游戏界面,就要开始画蛇了

绘制蛇

在画蛇的时候首先得想一下,这个蛇要用c语言中的什么结构来表示呢,

咱先对蛇进行分析一下,蛇要有自己的运动方向,长度,咱之后还要改变蛇的方向来让蛇吃到食物,

我们要画的蛇是一节一节的,蛇身是由一块一块的小方格组成,所以我们就用一个数组来作为蛇的身子,每个数组里面的值装的是坐标,这个坐标就是每一块小方块的坐标,

运用c语言独有的结构体来代表蛇,这个结构体里面包含蛇身(坐标数组),蛇长,蛇的方向

添加完蛇的信息的代码如下

#include<stdio.h>
#include<graphics.h>
#include<time.h>
#include<conio.h>

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<stdio.h>
#include<graphics.h>
#include<time.h>
#include<conio.h>

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<stdio.h>
#include<graphics.h>
#include<time.h>
#include<conio.h>

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<stdio.h>
#include<graphics.h>
#include<time.h>
#include<conio.h>

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<stdio.h>
#include<graphics.h>
#include<time.h>
#include<conio.h>

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

 控制蛇的方向

方案有变-----------------------------------------------------------------------------------后续更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值