项目设计:迷宫游戏设计day3

本文介绍了如何使用Easyx库创建带有开始游戏和退出游戏功能的图形界面,以及通过鼠标事件实现界面跳转。在游戏开始后,玩家可以选择关卡模式或自定义模式。关卡模式中,作者利用三维数组存储地图,并用BFS算法寻找最短路径。此外,还提到了计时功能和未来计划实现的栈步数记录、排行榜和音乐功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、界面制作

我用的easyx实现图形化界面,在制作第一个界面的时候,第一个界面的功能有开始游戏,退出游戏,排行榜(虽然还没实现)

那么首先还是得用一个图片贴在上面,这个图片是我自己画的,就是利用电脑自带的画图功能,然后直接截图,再保存图片就OK了,然后就可以贴图了

然后就是实现点击开始游戏和退出游戏就能跳跃到下一个界面,这里我是如果点击了相应的范围的话,就调用另一个函数

while (1)
	{
		msg = GetMouseMsg();
		if (msg.uMsg == WM_LBUTTONDOWN)
		{
			if (msg.x > 146 && msg.x < 457 && msg.y < 247 && msg.y>81)
			{
				DoGame();							//开始关卡游戏选项
				break;
			}
			if (msg.x > 150 && msg.x < 457 && msg.y < 580 && msg.y>416)
			{
				drawself();								//开始自定义游戏选项
				break;
			}
		}
	}

二、开始游戏

到了另一个开始游戏界面之后,就是选择游戏模式了,一个是关卡模式,一个是自定义模式

关卡模式

那么接下来看关卡模式吧,关卡模式的地图,我是运用的三维数组实现的,这些图片都是我自己在晚上找的

人物的移动,这里我是用的不显示输入,当你输入'w'时,就要先判断,如果人物的下一个位置是路的话,那么就把路变成人,把原本的位置变成路,其他的移动也是如此,如果下一个位置是墙的话,那就不做任何操作,如果下一个是出口的话,就就将下一位置变成人,原本的位置变成路,那么这时候还要进行一个判断,因为这个时候就是就已经通关啦,就要找一下有没有出口(肯定是没有的啦),没有的话就跳到下一关去啦

 

还有的功能就是记时功能,这个是用的专门的函数实现的

start_time = clock();
	while (1)
	{
		if (!gameover())
		{
			step++;
			start_time = clock();
			if (step == 3)
			{
				show();
				break;
			}
		}
		cleardevice();
		load();
		drawmap_1();
		if (flag == 1)printpath();
		if(step==0)
		{
			settextstyle(18, 0, "黑体");
			settextcolor(RGB(255, 255, 255));
			outtextxy(0, 630, "请在10s内找到篮球,否则篮球会被小黑子弄坏");
		}
		if(step==1)
		{
			settextstyle(18, 0, "黑体");
			settextcolor(RGB(255, 255, 255));
			outtextxy(0, 630, "请在15s内找到篮球,否则篮球会被小黑子弄坏");
		}
		if(step==2)
		{
			settextstyle(18, 0, "黑体");
			settextcolor(RGB(255, 255, 255));
			outtextxy(0, 630, "请在20s内找到篮球,否则篮球会被小黑子弄坏");
		}
		settextstyle(18, 0, "黑体");
		settextcolor(RGB(255, 255, 255));
		outtextxy(0, 605, "w是向上移动,s是向下移动,a是向左移动,d是向右移动");
		end_time = clock();
		time_1 = (int)((end_time - start_time) / CLOCKS_PER_SEC);
		if(!defeat())break;												//游戏失败
		settextstyle(18, 0, "黑体");
		settextcolor(RGB(255, 255, 255));
		sprintf_s(str, "时间:%d s", time_1);
		outtextxy(0, 655, str);
		FlushBatchDraw();
		key();
	}

最后还有寻找最短路径的功能,我是用的bfs寻找最短路径,用这个的时候就要用一个前驱节点保存每个点的上一步是哪一个,然后最后将这些点用专门的图片贴在上面

61c88ead649b4c3d9079ebf8f27c2949.png

c376270eb8914e0ab6e1d0bd0eb6c1d3.png

void bfs()												//用bfs搜寻最短路径
{
	int i, j, startx, starty, endx, endy, t;		//sx,sy表示人物坐标,ex,ey表示出口坐标,t表示标记
	for (i = 0; i < n; i++)for (j = 0; j < m; j++)
	{
		if(map[step][i][j] == 1)dis[i][j] = 1;
		else dis[i][j] = 0;
		if (map[step][i][j] == 3)
		{
			startx = i;
			starty = j;
		}
		if (map[step][i][j] == 2)
		{
			endx = i;
			endy = j;
		}
	}

	int rear = 0, head = 0;
	dui[rear].x = startx;
	dui[rear].y = starty;
	dui[rear].step = -1;
	dis[startx][starty] = 1;
	rear++;
	k = 0 ,t = 0;
	while (head < rear)
	{
		for (i = 0; i < 4; i++)
		{
			startx = dui[head].x + dx[i];
			starty = dui[head].y + dy[i];
			if (startx<0 || startx>n || starty<0 || starty>m)continue;
			if (dis[startx][starty] == 0 && t == 0)
			{
				dui[rear].step = k;
				if (map[step][startx][starty] == 2)
				{
					end = rear;
					t = 1;
					break;
				}
				dis[startx][starty] = 1;
				dui[rear].x = startx;
				dui[rear].y = starty;
				rear++;
			}
		}
		pre[k][0] = dui[head].x;
		pre[k++][1] = dui[head].y;
		head++;
	}								//使最短路径显示出来
}

void printpath()									//使最短路径显示出来
{
	IMAGE ing;
	int nn = 600 / n;
	int mm = 600 / m;
	loadimage(&ing, "./pic/shortroute.png", nn, mm);
	for (int i = dui[end].step; i != -1; i = dui[i].step) {
		putimage(pre[i][1]*nn, pre[i][0]*mm, &ing);      //显示最短路径
	}
}

自定义模式

自定义模式就是自己定义这个迷宫怎样做,首先我是用的鼠标进行操作的,分成了三步

第一步就是设置墙,最开始的地图全部都是路,当我点击一个路时,这个路就变成了墙,如果这个已经是墙了,就不能进行操作了,那么消除墙也就是一个意思了,用鼠标右键,如果这个是墙的话,你就将它变成路,如果这时候你不想设置墙了,你就点击鼠标中键,这时候记数加一,当我们下次点击左键的时候就不能实现第一步的功能了

 

第二步就是设置人物在哪,这一步就是要注意一下只能设置一个人物,也就是标记一下,如果已经设置了一个人物的话,就不能再设置第二个人物啦,其余操作跟第一步一样

第三步就是设置出口,这一步跟第二步相似, 不过多描述

第四步就是开始游玩游戏了,那么游玩的过程也就跟上面的一样了

 三、一些其它没实现的功能

1.运用栈存步数已经在实现啦

2.排行榜也有一点思路啦

3.音乐也可以制作一下

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值