map的性能如何?执行效率高吗?
tintin++的map,效率还是非常高的,开始我还有点当心频繁的计算路径会不会对系统资源造成过大的负担。
然后我写了一个循环来测试:
#alias test {#loop 1 3000 i {#map find $i;#path save forward path[$i]}
结果如图:
搜索当前房间到所有房间的路径,并且保存,这个操作在mush应该是属于死机级的操作了。
测试的结果就是完全不用当心性能的问题!
利用map行走到目的地
map虽然功能强大,代码简洁,但是自带的#map run不太好用,无论是wintin++ cygwin macos Linux,
执行#map run 操作都极容易奔溃,并且我们还需要处理一些特殊的路径,比如杀守门NPC,过河,
路径过长需要分批行走防止雷劈等等。
所以我只是使用#map find来找到路径,保存在变量里面,然后再另行处理走路。
#map find xxx;#path save forward path;
将取得的完整路径劈成若干合适的段:
#list all_fx_list cre {eu;e;ed;se;su;s;sd;sw;wu;w;wd;nw;nu;n;nd;ne;enter;out;u;d;1;2;3;4;5;6;7;8;};#nop 预定义可以连续行走的方向;
#alias {xkxGPS_pathlist} {
#v row 0;
#v xkxGPS[pathArray1] {};
#v indexQueue {};
#v col 0;
#v result {};
#v result {%0};
#list _tb cre $result;
#v xkxGPS[pathListNum2] &_tb[];
#foreach $_tb[] i {#nop 碰到需要特殊的方向,就另起一个段待执行;
#var v $_tb[$i];
#list all_fx_list find $v result;
#list xkxGPS[pathArray1][$row] add $v;
#if {$result==0} {
#math row {$row+1};
#v col 0;
};
#math tmp {$col+(21*$row)};#nop 控制每段行走的步数;
#if {$col<20 || $tmp==$xkxGPS[pathListNum2]} {
#math col {$col+1};} {
#math row {$row+1};
#var col 0;
};
};
#v i 0;
#while {$i<&xkxGPS[pathArray1][]} {
#list all_fx_list find {$xkxGPS[pathArray1][$i][-1]} result;
#if {$result==0} {
#list xkxGPS[pathArray1][$i] sim xkxGPS[pathArray1][$i];
};
#if {$i==&xkxGPS[pathArray1][]-1} {
#list xkxGPS[pathArray1][$i] sim xkxGPS[pathArray1][$i];
#v xkxGPS[pathArray1][$i] {$xkxGPS[pathArray1][$i];moveover}
};
#else {
#list xkxGPS[pathArray1][$i] sim xkxGPS[pathArray1][$i];
#v xkxGPS[pathArray1][$i] {$xkxGPS[pathArray1][$i];movefinish}
};
#math i {$i+1};
};
};
在第一帖的#alias {gps_start_checck}里面增加一个条件判断:gps=end
#if {"%1"=="gps=end"} {
#if {@tonumber{$roomno_now}>0 && $flytoid>0} {#nop 起始和目的房间的ID号都不为空;
#unv path;
#map goto $roomno_now;
#map find $flytoid;#nop 计算路径;
#path save {forward} {path};#nop 将完整路径保存在变量中;
#v gps[end] 0;#nop 重置自动行走结束标签;
#map at $flytoid {
#map get {roomname} xkxGPS[EndRoomName];#nop 取得目的房间的房间名,到达目的地后用来匹配是否正确到达了目的地;
#map get [roomdata] xkxGPS[EndRoomEntrance];#nop 取得目的房间的出口信息,到达目的地后用来匹配是否正确到达了目的地;
};
#v gps[EndRoomName] $xkxGPS[EndRoomName];
#v gps[EndRoomEntrance] $xkxGPS[EndRoomEntrance];
#if {&{path}==0} {#nop 路径计算失败,没有正确取得路径或起止房间是同一个;
#if $roomno_now!=$flytoid {
score;
#sh 目标地点路径未通!flytoid="$flytoid";
#return;
} {
#ec ("飞什么飞,不就在这里么!");
#v gps[end] 1;
moveover;#nop 自动行走流程结束;
#return #nop ;
}
};
xkxGPS_pathlist {$path};#用另一个#alias将路径分解成若干段;
#v pathindex 0;
#list _tb cre {@xkxGPS_pathArray2{$pathindex}};
#list _tb get -1 _t;#nop 从_tb取出最后一个值赋值给_t;
#nop #replace _t { } {};
#replace _t {-} {};
#v MathstepNum[nextLastStepName] $_t;
#if {{&{$aliasStepNum[$MathstepNum[nextLastStepName]]}}==0 or "$aliasStepNum[$MathstepNum[nextLastStepName]]"==""} {
#v _t 0;
} {#v _t $aliasStepNum[$MathstepNum[nextLastStepName]]
};
halt;set brief 2;
#if {$roomno_now==2112 || $roomno_now==2113 || $roomno_now==2114 || $roomno_now==2115} {
stand;#nop 某些特殊房间离开之前需要先输入特定的指令,比如先站起来才能移动;
};
#elseif $roomno_now==288 {
drop qiguo ji;drop puer cha;drop guoqiao mixian;drop guoqiao heiyu;drop ye er ba;drop kaoya;
#nop 在厨房吃吃喝喝了之后,不能带食物走;
};
#elseif $roomno_now==682 {
drop kaoya;drop tao;drop qiguo ji;
};
#if {$roomno_now!=91 && "$always[roomname]"!="擂台下"} {
@alias_yjl{};#行走之前,先补充一下精力;
};
@run{@xkxGPS_pathArray2{$pathindex}};
} {
#var gpserrnum 1;
};
}; |