C语言实现贪吃蛇小游戏

C语言链表-贪吃蛇

设计思路

贪吃蛇的整体移动,可以只简化为蛇头与蛇尾的移动,当贪吃蛇的蛇头碰到蛇身或障碍物或超出指定范围时,游戏结束,因此我们作出以下设计:
1. 蛇身体结构设计 :蛇身整体的移动,可看作一个先进先出的队列,因此我们使用一个无附加表头的循环链表作队,来存储蛇的每一个节点(二维坐标值);
2. 地图状态设计:我们使用一个二维坐标来标志地图的状态,用-1标志食物的位置,用1标志蛇身,用0标志无障碍。


效果展示(gif)

C语言实现贪吃蛇小游戏_第1张图片

程序源码


#include

#include

#include

#include 

#include

#define R 16  	//每个格子尺寸:R*R

#define W 27

#define L 42	//活动范围:(L-2)*(W-2)个格子

//template 

struct dot{//坐标值结构体

    int x;

	int y;

};

//template 

struct Node{

    dot data;

	Node *next;

};

//template 

class Cqueue{ // 无附加表头的循环链表作队

private:

	Node *rear;//尾指针

public:

	Cqueue()//构造空队

	{rear=NULL;}

	bool Empty()//判断空否

	{return !rear;}

	struct dot DeQueue()

	{//出队操作

		struct dot d;

		if(!rear ) throw "空";

		Node *q=rear->next;

		//d.x=q->data.x;

		//d.y=q->data.y;

		d=q->data;

		rear->next=q->next;

		if(rear==q) rear=NULL;//最后一个元素的特殊处理

		delete q;

		return d;

	}

	void EnQueue(int a,int b){//入队操作

		Node *q=new Node; 

		q->data.x=a;q->data.y=b;

		if(!rear){rear=q;rear->next=rear;}//空时的处理

		else 

		{q->next=rear->next;rear->next=q;rear=q;}

	}

};

void show(int* p)//输出状态数组值

{

	int i,j;

	char num[4];

	//setbkmode(TRANSPARENT);

	setcolor(RED);

	for(i=0;i=R*(L-1)||y=R*(W-1))

		{

			finish(num);

			return;

		}

		if(*(p+(x/R-1)*(W-2)+y/R-1)==0)

		{

			Q.EnQueue(x,y);

			*(p+(x/R-1)*(W-2)+y/R-1)=1;

			//setcolor(RED);

			setfillcolor(YELLOW);

			solidrectangle(x,y,x+R,y+R);

 

			t=Q.DeQueue();

			*(p+(t.x/R-1)*(W-2)+t.y/R-1)=0;

			solidrectangle(t.x,t.y,t.x+R,t.y+R);

			

		}

		else

			if(*(p+(x/R-1)*(W-2)+y/R-1)==-1)

			{

				num++;

				Q.EnQueue(x,y);

				*(p+(x/R-1)*(W-2)+y/R-1)=1;

				setfillcolor(RED);

				fillcircle(x+R/2,y+R/2,R/2);

				setfillcolor(YELLOW);

				solidrectangle(x,y,x+R,y+R);

				setfood(p);//重置食物

			}

			else{

				finish(num);

				p=NULL;

				return;}

	}

}

void main()

{

	initgraph(R*L,R*W);

	srand(time(NULL));

	Cqueue Q;//循环链接队

	//struct dot p;//蛇尾坐标

	int wall[L-2][W-2];0:障碍物/空区域;-1:食物;1:蛇身

	setcolor(GREEN);

	//rectangle(R-1,R-1,641-R,641-R);

	int i,j;

	for(i=R;i=R*(L-1)||y=R*(W-1));

	x=x/R*R;

	y=y/R*R;

	wall[x/R-1][y/R-1]=1;

	Q.EnQueue(x,y);

	//setcolor(RED);

	setfillcolor(YELLOW);

	solidrectangle(x,y,x+R,y+R);

	setfood(wall[0]);//设置第一个食物

	move(x,y,Q,wall[0]);

	

	getch();

	closegraph();

}

 

你可能感兴趣的:(C/C++)