> 文章列表 > 项目设计:迷宫游戏设计day3

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

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

一、界面制作

我用的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.音乐也可以制作一下