分享发现 迷宫代码及使用教程

YakumoReddo · 2019年02月24日 · 最后由 熊熊燃烧的叉烧包 回复于 2019年02月24日 · 125 次阅读
本帖已被设为精华帖!

教程

如你所见,这是一个普通的迷宫样例教程
在这里,你将会学会如何使用我的迷宫代码

简介

写这个代码的原因是群里@一条咸鱼 的代码太蹩脚,没有显示,于是准备做一个可视的迷宫
后来,突发奇想,想做成动态地图,跟随主角移动那种
于是,如你所见,最初版10*10地图3*3显示的版本粗线了
然后群里包子在做的游戏正好可以用这个模板做新游戏
So,我把他改改改的方便自定义了

原理

我知道这里你们肯定不会看这个原理但我还应该说一说
首先,我们需要读入一个地图'map'
然后,我们要把相应的该显示的区域放入'cmap'中并用'(j)cmap(/j)'把他显示出来
在这个过程中,我们需要把其他的边界啊等未定义的地方变成'boarder'墙,这里我默认是#号,把玩家显示为'player'●
接着是判定,这里我把'onMove'函数摘了出来方便使用。

使用方式

首先你需要设计好地图,并将其导入到代码中,如'map'和'map1',并设置好相应地图的宽高(必须要设置!每个地图的宽高应该相同!)
设置好地图后,将'spawnx'和'spawny'设置成当前地图('map')的出生点
然后,在分隔符上面的相应函数内设置事件,比如移动的时候调用'onMove'函数,在绘图之前调用'beforeReMap'函数,在超过地图边界的时候调用'onOverMap'函数,以及在游戏结束时调用'onFinish'函数。
在'onMove'函数中可以使用两个特殊的函数,'cancelMove()'和'changeMap()'。
'cancelMove()'函数不需要参数,只需要调用一下,就可以取消这次移动。 'changeMap(tmap,x,y)'函数中,'tmap'参数是要更换到的地图,'x''y'是更换地图后玩家所在的位置。 一定要在以上函数中功能的结尾使用'return',否则会出现各种bug

代码

=: var boarder = "#";

=: var player = "●";

=: var vwide=5,vheight=5;

=: var msg = "S是起点,E是终点";

=: function onOverMap(x,y){msg = "超出地图范围";return;}

=: function onMove(x,y,char){if(char == "G"){msg = "进入map1";changeMap(map1,5,10);return;};if (char == "E"){onFinish();return;};if(char == "#"){msg = "撞墙了,hp-1";cancelMove();return;};if(isOverMap(x,y)){onOverMap(x,y);cancelMove();return;};return;}

=: function beforeReMap(){cmap = "";msg = "S是起点,E是终点,●是你";}

=: function onFinish(){game_jumpto("win");return;}

=: var map1 = "############o##ooooE##o##o######o##o######o##ooo####o####o####o###oo####o#ooo#####ooo########S######";

=: var map = "#oo#######ooo##ooooEo#o##o######o##o#####oo##ooo#o#oo####o#o##o###oooo##o#ooo###G#ooo#####oooS######"

=: var Spawnx=5,Spawny=10,mapwide=10,mapheight=10;

=: //----------------------------------------------------------------

=: function cancelMove(){MD.x = MD.xx;MD.y = MD.yy;return;}

=: var cmap = "";MD.x = Spawnx;MD.y = Spawny;

=: MD.xx = MD.x;MD.yy = MD.y;

=: function isOverMap(x,y){if((y+2-Math.floor(vheight/2))<=0||(y+2-Math.floor(vheight/2))>mapheight||(x+2-Math.ceil(vwide/2))<=0||(x+2-Math.ceil(vwide/2))>mapwide) return true;else return false;}

=: function reMap(){MD.xx = MD.x;MD.yy = MD.y;for (var i = 0;i < vheight;i ++){for(var j = 0;j < vwide;j ++){if(i-Math.floor(vheight/2) == 0 && j-Math.floor(vwide/2) == 0)cmap += player;else {if((MD.y+i-Math.floor(vheight/2))<=0||(MD.y+i-Math.floor(vheight/2))>mapheight||(MD.x+j-Math.ceil(vwide/2))<=0||(MD.x+j-Math.ceil(vwide/2))>mapwide)cmap += boarder;else cmap += map[((MD.y + i-Math.ceil(vheight/2)) * mapwide) + MD.x + j-Math.floor(vwide/2)-2];}}cmap += "\n";};}

=: function changeMap(tmap,x,y){MD.x = x || MD.x;MD.y = MD.y || MD.y;map = tmap;return;}

[main]

=: beforeReMap();

=: onMove(MD.x,MD.y,map[(MD.y-1)*mapwide+MD.x-2]);

=: reMap();

x:(j)MD.x(/j) , y:(j)MD.y(/j)
(j)msg(/j)
(j)cmap(/j)
..........(b)1(/b)
(b)2(/b)(b)3(/b)(b)4(/b)
选:↑
>: MD.y --;game_jumpto("main");
选:←
>: MD.x --;game_jumpto("main");
选:↓
>: MD.y ++;game_jumpto("main");
选:→
>: MD.x ++;game_jumpto("main");

[win]

恭喜你,走出了迷宫
共收到 1 条回复
adminer 将本帖设为了精华贴 02月24日 18:09
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册