|
楼主 |
发表于 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=0 then
'-----------------------------连接数据库----------------------------------
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 ObjId from 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 ToID from 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 ObjId from 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} |
|