無(wú)坐標(biāo)反饋:尋路思路

因?yàn)槲易约菏且奥纷右稽c(diǎn)點(diǎn)自己摸瞎寫(xiě)的,沒(méi)有進(jìn)行過(guò)系統(tǒng)學(xué)習(xí),學(xué)習(xí)的時(shí)間也不是很長(zhǎng),大概一兩個(gè)月沒(méi),計(jì)算過(guò).
所以下面的結(jié)構(gòu)看會(huì)很亂,有條件興趣的可以復(fù)制到編譯器中進(jìn)行查看,最好能教我一下,謝謝.
八方向?qū)ぢ匪悸穫未a結(jié)構(gòu):

Function 八方向?qū)ぢ?方向)
??Dim 八方區(qū)域,人物中心點(diǎn),第一次獲取,第二次獲取
??人物中心點(diǎn)={X,Y}
??八方區(qū)域["左上"]={X-30,Y-30}
??八方區(qū)域["上"]={X,Y-30}
??八方區(qū)域["右上"]={X+30,Y-30}
??八方區(qū)域["左"]={X-30,Y}
??八方區(qū)域["右"]={X+30,Y}
??八方區(qū)域["左下"]={X-30,Y+30}
??八方區(qū)域["下"]={X,Y+30}
??八方區(qū)域["右下"]={X+30,Y+30}//大概就是這么一個(gè)意思
??If 方向 = "上" Then //方向的傳參參數(shù)是人物要走的方向,具體參考通過(guò)額外的判斷得出
????TracePrint "如果方向?yàn)樯蠒r(shí)需要判斷的區(qū)域?yàn)?左上,上,右上"
????第一次獲取 = GetPixelColor(x, y)//這里的XY是移動(dòng)時(shí)一定會(huì)變動(dòng)的坐標(biāo)點(diǎn)
????Tap 八方區(qū)域["上"] : Delay 500//點(diǎn)擊要走的坐標(biāo)
????第二次獲取=GetPixelColor(x, y)//這里的XY與第一次獲取必須相同一致.
????//判斷
????If 第一次獲取 = 第二次獲取 Then?
??????TracePrint "這兩個(gè)點(diǎn)顏色沒(méi)有變動(dòng),意味著人物沒(méi)有移動(dòng)"
??????//因?yàn)闆](méi)有移動(dòng),我們加一個(gè)嵌套
??????// Rem 標(biāo)記點(diǎn)
??????第一次獲取 = GetPixelColor(x, y)//重新給第一次獲取賦值,作為后面是否移動(dòng)的判斷
??????Tap 八方區(qū)域["左上"] : Delay 500//這次點(diǎn)擊要["左上"]的坐標(biāo)
??????第二次獲取=GetPixelColor(x, y)//賦值
??????If 第一次獲取 = 第二次獲取 Then?
????????TracePrint "代表向左上移動(dòng)也沒(méi)有變化,那么就只有["右上"]一個(gè)方向了"
????????Tap 八方區(qū)域["右上"] : Delay 500
??????Else //只有二兩獲取的值不一樣才會(huì)跳到這一行,從這一行開(kāi)始,還需要進(jìn)行最后一次判斷
????????第一次獲取 = GetPixelColor(x, y)//重新給第一次獲取賦值,作為后面是否移動(dòng)的判斷
????????Tap 八方區(qū)域["上"] : Delay 500//向左上是可以走的,走完之后我們?cè)僮遊上]坐標(biāo)
????????第二次獲取 = GetPixelColor(x, y)
????????If 第一次獲取 = 第二次獲取 Then?
??????????TracePrint "這兩個(gè)值又相等了,證明左上再向上的位置也是障礙物,這是一個(gè)死胡同"
??????????Tap 八方區(qū)域["右下"]: Delay 500//因?yàn)槲覀儎偛攀亲叩搅俗笊?所以這里要走回去復(fù)位
??????????第一次獲取 = GetPixelColor(x, y)//再次賦值,用于向右上走的判斷
??????????Tap 八方區(qū)域["右上"] //我們上面已經(jīng)試過(guò)左上,那里走不通,這次我們從右上開(kāi)始走
??????????第二次獲取 = GetPixelColor(x, y)
??????????If 第一次獲取 = 第二次獲取 Then?
????????????TracePrint?"這里的代碼其實(shí)就是上面從左上開(kāi)始走,下面那一段的復(fù)制,可以直接修改一下坐標(biāo),或者將左上與右下的坐標(biāo)對(duì)調(diào),用GOTO去循環(huán)"
????????????//比如這樣, 八方區(qū)域["右上"]={原先左上的坐標(biāo)}
????????????//八方區(qū)域["左上"]={原先右上的坐標(biāo)},
????????????//Goto 標(biāo)記點(diǎn)
??????????End If
????????End If
??????End If?
????End If???
??ElseIf 方向 = "下" Then
????TracePrint "如果方向?yàn)樯蠒r(shí)需要判斷的區(qū)域?yàn)?左下,下,右下"
??ElseIf 方向 = "左" Then
????TracePrint "如果方向?yàn)樯蠒r(shí)需要判斷的區(qū)域?yàn)?左上,左,左下"
??ElseIf 方向 = "右" Then
????TracePrint "如果方向?yàn)樯蠒r(shí)需要判斷的區(qū)域?yàn)?右上,右,右下"
??End If
??//后面的方向如果不想復(fù)制那么多,可以再造一個(gè)函數(shù),用傳參進(jìn)行精簡(jiǎn)
End Function

Function 遍歷尋路(方向)
??Dim 區(qū)域,二值化,max_x,max_y,min_x,min_y,下標(biāo)(),j,m,n,i,坐標(biāo),排序,最終計(jì)算坐標(biāo)
??Dim 二值化數(shù)量
??If 方向 = "左" Then?
????區(qū)域 = {X1,Y1,X2,Y2}
??ElseIf 方向 = "右" Then
????區(qū)域 = {X1,Y1,X2,Y2}
??ElseIf 方向 = "右上" Then
????區(qū)域 = {X1,Y1,X2,Y2}
??ElseIf 方向 = "右下" Then
????區(qū)域 = {X1,Y1,X2,Y2}
??ElseIf 方向 = "左上" Then
????區(qū)域 = {X1,Y1,X2,Y2}
??ElseIf 方向 = "左下" Then
????區(qū)域 = {X1,Y1,X2,Y2}
??Else?
????區(qū)域 = {X1,Y1,X2,Y2}
??End If
??m = 0 : n = 1 : j = 0//先將值給賦了
??坐標(biāo) = Array():排序 = Array()
??///截圖至內(nèi)存
??KeepCapture?
??副本名稱 = Ocr( {X1,Y1,X2,Y2}, 顏色, 0.9)//這個(gè)是一定要有的,可以放別的結(jié)構(gòu)里,但一定要有這一段
??//這個(gè)是用來(lái)判斷當(dāng)前處于什么類型的地圖,從而得到相應(yīng)二值化數(shù)據(jù)
//如果是傳奇類的游戲,大多地面都是一個(gè)顏色的,那些可以不用專門(mén)去取色,直接調(diào)校完定義變量就可以了
??For i = 0 To (區(qū)域(3) / 30) //將要遍歷的區(qū)域以30為單位進(jìn)行分割,如果要再嚴(yán)謹(jǐn)一點(diǎn)可以在后面-1
????//這里有兩個(gè)FOR I=0 TO N的結(jié)構(gòu),一個(gè)是用來(lái)存儲(chǔ)X的數(shù)組,一個(gè)是用來(lái)存儲(chǔ)Y軸的
????For i = 0 To (區(qū)域(2)/ 30)
??????顏色數(shù)量 = 獲取區(qū)域顏色數(shù)量(X1,Y1,X2,Y2)
??????//上面的顏色數(shù)量={},是一個(gè)函數(shù),里面的公式就是上面提到的副本名稱,大概是這樣寫(xiě)的:
??????//IF 副本名稱 ="地圖1" Then 二值化="" :ElseIf 副本名稱 ="地圖2" Then FG 二值化=""?End If?
??????//??????顏色數(shù)量 = GetColorNum(區(qū)域坐標(biāo), 二值化, 1.0)
??????m = m + 1//每循環(huán)一次,M的值要同步+1
??????If IsNumeric(顏色數(shù)量)=True Then//這里加一個(gè)數(shù)值判斷,因?yàn)楹竺娴呐袛嗍菙?shù)值類型的,如果是空值會(huì)判斷不了,報(bào)錯(cuò)
??????Else?
????????Exit Function?
??????End If???
??????If 顏色數(shù)量 > 1 Then//第一次篩選,顏色大于600
????????下標(biāo)={X1+30*(m-1), Y1+30*(n-1), X2+30*m, Y2+30*n}
????????顏色數(shù)量 = 獲取區(qū)域顏色數(shù)量(下標(biāo)(2) - 50, 下標(biāo)(3) - 50, 下標(biāo)(2) + 50, 下標(biāo)(3) + 50)
????????//????????顏色數(shù)量 = GetColorNum(下標(biāo)(2)-50,下標(biāo)(3)-50,下標(biāo)(2)+50,下標(biāo)(3)+50,"", 1.0)
????????If 顏色數(shù)量 > 10 Then //二次篩選,向外拓展20,數(shù)量必定要大于之前
??????????坐標(biāo)(j) = Array(下標(biāo)(0), 下標(biāo)(1))
??????????j = j + 1
????????End If???????
??????End If
????Next
????n = n + 1
????m = 0
??Next
??If UBOUND(坐標(biāo)) <= 0 Then //UBound 為0時(shí),判斷人物卡在了一個(gè)比較奇怪的地方,所以需要小幅度移動(dòng)一下,這樣可以提高穩(wěn)定性
????//當(dāng)然,如果會(huì)數(shù)組排序的話,這一串基本是用不到的,我是實(shí)在搞不明白排序的取值,不得以才用這種蠢B方式
????//最下面會(huì)說(shuō)一下我對(duì)這個(gè)最大值最小值的應(yīng)用理解,理論上是OK的
????TracePrint "區(qū)域內(nèi)無(wú)符合坐標(biāo)"?//沒(méi)有找到
????If 方向 = "左" Then?
??????Tap X,Y:Delay 800
????ElseIf 方向 = "右" Then
??????Tap X,Y : Delay 800
????ElseIf 方向 = "左上"??Then
??????Tap X,Y:Delay 800
????ElseIf 方向 = "左下" Then//下走
??????Tap X,Y:Delay 800
????ElseIf 方向 = "右上"?Then//向上走
??????Tap X,Y:Delay 800
????ElseIf 方向 = "右下"?Then?
??????Tap X,Y:Delay 800
????End If
??End If???
??Dim 上顏色數(shù)量,下顏色數(shù)量,左顏色數(shù)量,右顏色數(shù)量,可點(diǎn)擊坐標(biāo)= 坐標(biāo)()
??//這里我們?cè)龠M(jìn)行一次切割,這次切割的目的是為了篩選出更加精準(zhǔn)的坐標(biāo)
??//這里定義了四個(gè)方向,我們將上面第一次篩選出來(lái)的坐標(biāo)再運(yùn)算一次,如果這個(gè)坐標(biāo)的上下左右區(qū)域都有足夠多符合條件的顏色數(shù)量
??//那么是不是就可以判斷出,這個(gè)坐標(biāo)是在路的中間的呢????
??For i = 0 To UBOUND(坐標(biāo))???
????上顏色數(shù)量 =獲取區(qū)域顏色數(shù)量(坐標(biāo)(i,0),坐標(biāo)(i,1)-30,坐標(biāo)(i,0)+30,坐標(biāo)(i,1))
????下顏色數(shù)量 =獲取區(qū)域顏色數(shù)量(坐標(biāo)(i,0),坐標(biāo)(i,1)+30,坐標(biāo)(i,0)+30,坐標(biāo)(i,1)+60)
????左顏色數(shù)量 =獲取區(qū)域顏色數(shù)量(坐標(biāo)(i,0)-30,坐標(biāo)(i,1),坐標(biāo)(i,0),坐標(biāo)(i,1)+30)
????右顏色數(shù)量 =獲取區(qū)域顏色數(shù)量(坐標(biāo)(i,0)+30,坐標(biāo)(i,1),坐標(biāo)(i,0)+60,坐標(biāo)(i,1)+30)
????If 上顏色數(shù)量 > 600 and 下顏色數(shù)量 > 600 and 左顏色數(shù)量 > 600 and 右顏色數(shù)量 > 600 Then //四方同時(shí)存在顏色
??????可點(diǎn)擊坐標(biāo)(i) = Array(坐標(biāo)(i, 0), 坐標(biāo)(i, 1))//這樣我們就得到了我們最終可找的所有在路中間的坐標(biāo)
????End If
??Next
??ReleaseCapture?
??//釋放內(nèi)存
??Dim 基準(zhǔn)點(diǎn)()??
??//下面這一段就是我自己的蠢B代碼,因?yàn)閷?shí)在不會(huì)排序,所以只能取巧用第一個(gè),或者最后一個(gè)坐標(biāo)來(lái)進(jìn)行移動(dòng)
??If 方向 = "左" or 方向 = "左上"or 方向 = "左下" Then //取第一個(gè)坐標(biāo)遞增?????
????j = 0
????基準(zhǔn)點(diǎn)(0)= GetPixelColor(533, 185)??
????For i=0 To UBOUND(可點(diǎn)擊坐標(biāo))
??????Tap 可點(diǎn)擊坐標(biāo)(j,0),可點(diǎn)擊坐標(biāo)(j,1)+30
??????TracePrint 可點(diǎn)擊坐標(biāo)(j,0),可點(diǎn)擊坐標(biāo)(j,1)+30:Delay 800
??????基準(zhǔn)點(diǎn)(1) = GetPixelColor(533, 185)
??????If 基準(zhǔn)點(diǎn)(0) = 基準(zhǔn)點(diǎn)(1) Then
????????j=j+1
????????Tap 可點(diǎn)擊坐標(biāo)(j,0),可點(diǎn)擊坐標(biāo)(j,1)+30:Delay 800
??????Else?
????????Exit For
??????End If?
????Next?
??ElseIf 方向 = "右" or 方向 = "右下"or 方向 = "右上"Then //取最后一個(gè)坐標(biāo)遞減
????j = UBOUND(可點(diǎn)擊坐標(biāo))
????基準(zhǔn)點(diǎn)(0)= GetPixelColor(X,Y)??
????For i=0 To UBOUND(可點(diǎn)擊坐標(biāo))
??????Tap 可點(diǎn)擊坐標(biāo)(j,0),可點(diǎn)擊坐標(biāo)(j,1)+30
??????TracePrint 可點(diǎn)擊坐標(biāo)(j,0),可點(diǎn)擊坐標(biāo)(j,1)+30:Delay 800
??????基準(zhǔn)點(diǎn)(1) = GetPixelColor(533, 185)
??????If 基準(zhǔn)點(diǎn)(0) = 基準(zhǔn)點(diǎn)(1) Then
????????j=j-1
????????Tap 可點(diǎn)擊坐標(biāo)(j,0),可點(diǎn)擊坐標(biāo)(j,1)+30:Delay 800
??????Else?
????????Exit For
??????End If?
????Next?
??Else?
??End If
??////下面就是我對(duì)排序的實(shí)際應(yīng)用得出的理論猜想,但我自己沒(méi)有能力實(shí)現(xiàn),想法說(shuō)一下,如果有大佬解出來(lái)的,請(qǐng)讓我抄一下作業(yè)
??max_x = 0
??j = 0//重置變量
??For i=0 To UBOUND (可點(diǎn)擊坐標(biāo))//建立排序數(shù)組
????If 可點(diǎn)擊坐標(biāo)(i, 0) > max_x Then?
??????max_x = 可點(diǎn)擊坐標(biāo)(i, 0)
??????max_y = 可點(diǎn)擊坐標(biāo)(i, 1)
??????//??????排序(j)=Array(坐標(biāo)(i, 0), 坐標(biāo)(i, 1))????
??????排序(j) = Array(max_x, max_y)
??????i = i + 1
??????j = j + 1?
????End If
??Next
??//找出第一個(gè)排序數(shù)組中最大值與最小值
??//??TracePrint?"最大值為X:?"&排序(UBOUND (排序),0),排序(UBOUND (排序),1)
??//??TracePrint?"次大值為X:?"&排序(UBOUND (排序)-1,0),排序(UBOUND (排序)-1,1)?
??//??TracePrint "最小值為 :?"&排序(0,0),排序(0,1)
??//??TracePrint "次小值為 :?"&排序(0+1,0),排序(0+1,1)
??//??max_x = 排序(UBOUND(排序), 0)
??//??max_y = 排序(UBOUND(排序), 1)
??//??min_x = 排序(0, 0)
??//??min_y = 排序(0, 1)?
??//???
??//上面的我會(huì)了一點(diǎn)點(diǎn),但是,怎么再?gòu)倪@些數(shù)組里面找出Y的最大值與最小值呢?
??//嗯,大概意思就是:
??//比如我要走左上位置,那我就需要找到X坐標(biāo)中的最小值,并且這個(gè)X坐標(biāo)對(duì)應(yīng)的Y坐標(biāo)也是這些數(shù)組對(duì)應(yīng)的Y坐標(biāo)中的最小值
??//同樣的,走左下位置,我要找的就是X的最小值,并且這個(gè)X對(duì)應(yīng)的Y坐標(biāo)是這個(gè)數(shù)組中Y坐標(biāo)的最大值
End Function