这是mazebot的核心部分
kulic有硬解mazemap的code
但是仍然有人在自己写其他模式的mazebot的时候遇到一些问题
先解说核心概念
1. 当前座标 pos.x, pos.y
2. 移动
#var dir 1
1-north
2-east
3-south
4-west
#AL move
{
#case @dir {north} {east} {south} {west};
}
2. 更改方向的ALIAS
#AL cdircw //change direction clockwise
{
#if (@dir>3) {#math dir 1} {#add dir 1}
}
#AL cdirccw //change direction counter clockwise
{
#if (@dir=1) {#math dir 4} {#add dir -1}
}
3. 移动读取当格座标 XXXX{(}%1,%2{)}
#TR {XXXX{(}%1,%2{)}}
{
#if (@pos.x=%1 && @pos.y=%2) {cdirccw} {
#math pos.x %1;
#math pos.y %2;
cdircw};
#ALA +1 {#if !@fight move}
}
核心概念就是,移动了之后座标没变=移动失败,移动方向逆时针修正
移动了之后座标有改=移动成功,移动方向顺时针修正(同时更新座标)
4. (如果进入一格是依序下k)确认是否清空(可以移动)
#AL checkmob
{
cdircw;
look
}//因为要look,look的结果等于无移动->座标不会动,其结果会导致cdirccw
//所以要先cdircw来补偿
5. 有人提到有些maze的结构会导致直接绕外侧到出口
因为maze的出口座标会跟前一格显示相同,会cdirccw一次
如果要回maze内(第一次遇到出口),那就cdirccw再一次
如果要离开maze(第二次遇到出口),那就cdircw一次
所以
在进入maze前先设定
#math wayout 0;
#TR {出口}
{
#add wayout 1;
#if (@wayout<2) {cdirccw} {cdircw}
}
这样的话如果第二次遇到出口,一秒后没有进入战斗,就会离开maze