怎样借助EasyX用c++写一个贪吃蛇

 下面是一个效果图

 

   讲一下我的思路吧

   蛇的每一节身体以及食物就用圆形好了,可是怎样画圆呢?这里就借助了EasyX图形库,有了它需要调用函数就能画出各种图形,也能设置各种颜色。那么怎样把图形库用起来呢?很简单,浏览器搜索EasyX进入官网下载一个EasyX,然后打开它并安装到你的vs上,安装步骤是有提示,很简单。我用的是vs2019,还是挺好用的。记得把介绍EasyX的文档装在桌面。

    打开介绍文档了里面的函数都是干嘛的,照着里面的示例试试在vs里面画一个圆出来。这个过程可能会花一两个小时。

会画圆后就可以开始写贪吃蛇了。为了让蛇动起来,可以在蛇尾删去一节身子再在蛇头添一节身子,循环往复蛇就动起来了,

每一节身子都对应着一个坐标,我们可以构建一个链表,把这个坐标保存在链表节点里。对蛇的操作就变成了对链表的操作,

比如咱们删除蛇尾时,先删除画的圆(删除圆的函数也是EasyX里的),再删除尾结点。添加蛇头时对应着在链表头部插入一个节点。

   蛇移动的问题解决了,怎样吃食物长大呢。首先得生成一个食物,食物也对应着一个坐标,所以用一个结构体来表示食物,结构体里面的成员就是食物的x,y坐标。其实这个结构体跟蛇的身体节点结构体是一样的。然后我们需要判断蛇有没有吃到食物,我的判断方法是检测蛇头跟食物之间的距离。如果吃到了食物就在蛇头出添加一节身体并且不删除蛇尾,这样蛇就长大了一节。

  最难的地方来了!!怎样控制蛇的方向呢?我是通过检测键盘输入的ESAD四个字母来控制上下左右键。这里借用了Windows的库函数来检测字符输入。也就是西面的kbhit和getch函数,具体怎样使用可以去搜一下,这里不多讲。

下面是我的代码。

 

#include
#include
#include
#include
#include
#include
using namespace std;
struct node {
	int x, y;
}Head, Food;                        //食物和蛇头,弄一个蛇头是为了后面direction里方便控制蛇的方向,这里的Head存储蛇头下一步的位置
struct snakebody {                  //链表节点
	int x, y;
	snakebody* pre, * next;
};
class snake {               //蛇类,里面包含蛇的各种功能
private:
	snakebody* head, * tail;
public:
	snake();
	void insert(int x, int y);
	void delet();
	void move();
	void run();
	void food();
	void direction();
	/*~snake() {
		while (head != NULL) {
			snakebody* Head = head;
			head = head->next;
			delete Head;
		}
	}*/
};
snake::snake() {                 //初始化蛇,有两节身体
	head = new snakebody;               //开始构建链表
	head->next = NULL; head->pre = NULL;
	head->x = 500; head->y = 375;
	tail = head;
	setfillcolor(RED);        //设置圆也就是蛇身的颜色
	solidcircle(500, 375, 8); //画蛇头
	insert(516, 375);         //在原来的蛇头前面插一个新头
	solidcircle(516, 375, 8);
}
void snake::insert(int x, int y) {   //插入函数,在链表头部节点保存蛇尾的坐标
	snakebody* Head = new  snakebody;
	Head->x = x; Head->y = y;
	Head->next = head;
	head->pre = Head;
	Head->pre = NULL;
	head = Head;
}
void snake::food() {                  //生成食物,需要检测食物是否生成在蛇身内
	snakebody* s = NULL; int flag;
	srand((int)time(0));
	Food.x = rand() % 984 + 8, Food.y = rand() % 734 + 8;
	while (s != NULL) {
		if ((s->x >= Food.x - 8 && s->x <= Food.x + 8) && (s->y >= Food.y - 8 && s->y <= Food.y - 8)) {
			Food.x = rand() % 984 + 8, Food.y = rand() % 734 + 8; s = head;
		}
		else s = s->next;
	}
	setfillcolor(YELLOW);
	solidcircle(Food.x, Food.y, 8);
}
void snake::delet() {           //删除链表尾结点
	snakebody* Tail = tail->pre;
	delete tail; tail = Tail;
}
void snake::move() {          //游戏开始

	food();
	while (1) {
		direction();
		int a = Head.x, b = Head.y;
		if (a < 8 || a>992 || b < 8 || b>742) {
			break;
		}
		int flag = (a - Food.x) * (a - Food.x) + (b - Food.y) * (b - Food.y) - 256;        //蛇头与食物的距离
		while (flag <= 0) {
			insert(a, b);
			clearcircle(Food.x, Food.y, 8);
			setfillcolor(RED);
			solidcircle(a, b, 8);
			food();
			direction();
			a = Head.x, b = Head.y;
			if (a < 8 || a>992 || b < 8 || b>742) {

				return;     //撞墙,游戏结束
			}
			flag = (a - Food.x) * (a - Food.x) + (b - Food.y) * (b - Food.y) - 64;
		}
		insert(a, b);
		setfillcolor(RED);
		solidcircle(a, b, 8);
		a = tail->x, b = tail->y;
		clearcircle(a, b, 8);
		delet();
		Sleep(400);
	}
}
void snake::direction() {     //控制蛇的方向
	char ch;
	if (_kbhit()) {   //检测输入了哪个字符,esad对应上下左右
		ch = _getch();
		switch (ch) {
		case 'w':
		case 'W':Head.x = head->x; Head.y = head->y - 16; break;
		case 's':
		case 'S':Head.x = head->x; Head.y = head->y + 16; break;
		case 'a':
		case 'A':Head.x = head->x - 16; Head.y = head->y; break;
		case 'd':
		case 'D':Head.x = head->x + 16; Head.y = head->y; break;
		}
	}
	else {      //如果没有任何输入,蛇朝着之前的方向继续前进,也就是蛇头跟第二节身体连线的方向
		int x = head->x - head->next->x, y = head->y - head->next->y;
		if (x == 0 && y == 16) { Head.x = head->x; Head.y = head->y + 16; }
		if (x == 0 && y == -16) { Head.x = head->x; Head.y = head->y - 16; }
		if (x == 16 && y == 0) { Head.x = head->x + 16; Head.y = head->y; }
		if (x == -16 && y == 0) { Head.x = head->x - 16; Head.y = head->y; }
	}
}
void main() {
	initgraph(1000, 750);
	snake wuhao;      //蛇的名字是我沙雕室友的名字哈哈哈哈哈哈
	wuhao.move();     //室友跑起来
}

 

 

 

 

 

 

 

你可能感兴趣的:(c++,小游戏)