pkugumu 发表于 2014-1-3 14:27:00

收藏了,721机器做了这么久,竟然很多功能没用到。
太实用了

pkugumu 发表于 2014-1-3 15:09:17

贴一下vbs搜索吧我测试测试{:7_268:}

oolong 发表于 2014-1-3 18:56:29

#ALIAS get_search_list {#SS "VBScript" '-----------------------------连接数据库----------------------------------
Dim job_room_list
Dim no_Repeat_list_all
ReDim no_Repeat_list_all(0)
ReDim job_room_list(0)
Dim no_Repeat_list_bak
ReDim no_Repeat_list_bak(0)
Dim target_out_room
Dim target_room_array
Dim no_enter_list
Dim goto_end
goto_end=0

target_room_list=getvar("job_room_list","").value
step=getvar("job_range","").value
char_id=getvar("char_id","").value
zone_id=getvar("zone_id","").value
fpath=".\"&char_id&"\mymud.mdb"


'------------------------简单的除错代码---------------------------------
If step="" Or char_id="" Or fpath="" Or target_room_list=""Then
goto_end=1
End if

if goto_end=0then

'-----------------------------连接数据库----------------------------------
Set Conn=CreateObject("adodb.connection")
Set Rs=CreateObject("ADODB.Recordset")
strCon="DBQ="&fpath&";DRIVER={Microsoft Access Driver (*.mdb)};"   
Conn.Open strCon
'-----------------------------连接数据库----------------------------------




no_Repeat_list_bak=Split(target_room_list, "|", -1, 1)
' 给出搜索清单

no_enter_list=get_no_enter()
' 得到禁入房间数组
no_Repeat_list_bak=decarray(no_Repeat_list_bak,no_enter_list)
'过滤禁止进入房间
If no_Repeat_list_bak(0)="" Then
   Wscript.Quit
End If
'排除空的查询,查询结果为空的时候,退出不查
no_Repeat_list_all=addarray(no_Repeat_list_all,no_Repeat_list_bak)
'先加入一层结果

For s=1 To step
no_Repeat_list_bak0=no_Repeat_list_bak               '缓存一下
ReDim no_Repeat_list_bak(0)
   For Each roomid In no_Repeat_list_bak0
      add_list(roomid)
   Next
Next
'-----------------------------------清除非区域房间-----------------------------------------------------------------
'Dim output_list;
output_list=""
if zone_id<>0 then

For Each item In no_Repeat_list_all

Rs.Open "SELECT ObjIdfrom ObjectTbl where ZoneID ="&zone_id&"and ObjId="&item,Conn,1,1
Cnt = Rs.Recordcount
if Cnt>0 Then
if output_list="" then
   output_list=CStr(item)
else
output_list=output_list&"|"&CStr(item)
end if
end if
Rs.Close
Next
else
output_list=Join(no_Repeat_list_all,"|")
end If
Conn.Close
Set Rs = Nothing
Set Conn = Nothing

Makevar "job_search_list",output_list,"",""
else
Makevar "job_search_list","","",""
end if






'-----------------------------查询一次临近房间----------------------------------------------------------------------
function get_list_1(room_now)
If room_now<>"" then

Rs.Open"SELECT ToIDfrom ExitTbl where FromID = "&room_now ,Conn,1,1

Cnt = Rs.Recordcount
dim searchroom
if Cnt>0 Then
redim searchroom(Cnt-1)
Rs.MoveFirst
For i = 0 To Cnt-1
searchroom(i) = Rs("ToID")
Rs.MoveNext
Next
Else
redim searchroom(0)
searchroom(0)="9999"
end If
get_list_1=searchroom
Rs.Close
Else
get_list_1=array(0)
End if
end function
'-----------------------------查询一次临近房间----------------------

'-----------------------------查询禁入房间----------------------
function get_no_enter()

Rs.Open"SELECT ObjIdfrom ObjectTbl where cost = 2147483647" ,Conn,1,1

Cnt = Rs.Recordcount
dim searchroom
if Cnt>0 Then
redim searchroom(Cnt-1)
Rs.MoveFirst
For i = 0 To Cnt-1
searchroom(i) = Rs("ObjId")
Rs.MoveNext
Next
Else
redim searchroom(0)
end If
get_no_enter=searchroom
Rs.Close
'call print_array(get_no_enter,"禁止房间:")
end function
'-----------------------------查询禁入房间----------------------



'---------------将不重复的结果房间加入函数,并把不重复的结果放进no_Repeat_list_bak缓存--------------------

'get_out_room:当次查询的原始结果(含重复房间)
'no_Repeat_list:当次查询的不重复结果
'no_Repeat_list_bak:当前list查询的不重复结果



Function add_list(room_add)
dim no_Repeat_list                        
ReDim no_Repeat_list(0)
get_out_room=get_list_1(room_add)                                  '查询一个房间的出口
get_out_room=decarray(get_out_room,no_enter_list)
no_Repeat_list=decarray(get_out_room,no_Repeat_list_all)         '过滤已经有的房间,剩下不同的房间放入no_Repeat_list
no_Repeat_list_all=addarray(no_Repeat_list_all,get_out_room)       '增加不重复房间到最终输出数组no_Repeat_list_all
no_Repeat_list_bak=addarray(no_Repeat_list_bak,no_Repeat_list)   '将不同结果加入到当前层的不同结果集合no_Repeat_list_bak
End Function
'-----------------去重复函数,并把不重复的结果放进no_Repeat_list_bak缓存--------------------



'-----------------调试专用显示一个数组的内容------------------------------------------------
Function print_array(arr,Str0)
arrtxt=Join(arr,"|")
arrtxt=Str0&arrtxt
Msgbox arrtxt
End Function
'-----------------调试专用显示一个数组的内容------------------------------------------------

'-----------------------------------------------------------------------------------
'函数功能,去除重复的合并两个数组

Function addarray(arr1,arr2)
Dim output_arr
ReDim output_arr(0)
For Each arr1_item In arr1
If arr1_item<>"" Then
output_arr=additem(output_arr,arr1_item)
End If
Next
For Each arr2_item In arr2
If arr2_item<>"" Then
output_arr=additem(output_arr,arr2_item)
End If
Next
addarray=output_arr
End Function
'---------------------------------------------------------------------------------
'函数功能:往数组里添加一个元素,并保证和数组里已有元素不相同
Function additem(arr,item)
Dim arr0
arr0=arr
arr_max=UBound(arr)
For Each arr_item In arr
If CInt(arr_item)=CInt(item) Then
additem=arr0
Exit Function
End If
Next
If arr0(0)="" Then
Else
arr_max=arr_max+1
ReDim Preserve arr0(arr_max)
End If

arr0(arr_max)=item
additem=arr0

End Function
'---------------------------------------------------------------------------------
'-----------------------------------------------------------------------------------
'函数功能,两个数组的差集合(数组1去除数组2中的元素)

Function decarray(arr1,arr2)
Dim same,output_arr
ReDim output_arr(0)
For Each arr1_item In arr1
    same=0
    For Each arr2_item In arr2
      If CInt(arr1_item)=CInt(arr2_item) Then
                   same=1
                   Exit for
      End if
    next
    If same=0 Then
      output_arr=additem(output_arr,arr1_item)
    Else
    End If
Next
decarray=output_arr
End Function}

oolong 发表于 2014-1-3 19:09:41

本帖最后由 oolong 于 2014-1-3 07:10 PM 编辑

用法:
定义变量如下:
@zone_id ------- 区域数字
@job_room_list ---------- 你得到的目标房间列表 比如 北大街 房间为 1|2|4
@job_range ----------- 周围几个房间范围
@char_id ------------你的id
在zmud根目录建立你的id文件夹,将地图命名为mymud.mdb
也可以自己修改地图文件存放地址,由于我的机器人是按照id管理的所以这么干。
最后得到搜索房间列表存放在变量
@job_search_list

基本有这几个参数就可以搜索房间了,另外有特别说明:
1,zone_id=0表示去全图搜索,不分区域搜索
2,搜索将自动过滤所有标志为禁入房间,以及衍生的房间,你关闭某个区域连接房间,则从目标房间到改区域的房间将无法搜到

版权申明:
书剑-上官凯歌

wji 发表于 2017-3-28 11:39:58

学习了,7.21正被变量触发乱码困扰

论坛里很多老内容很经典,可惜没人加精华,只能一页一页翻了
页: 1 [2]
查看完整版本: zmud721高级进阶指导