欢迎光临散文网 会员登陆 & 注册

无坐标反馈:寻路思路

2023-08-27 20:11 作者:叁森N  | 我要投稿

因为我自己是野路子一点点自己摸瞎写的,没有进行过系统学习,学习的时间也不是很长,大概一两个月没,计算过.

所以下面的结构看会很乱,有条件兴趣的可以复制到编译器中进行查看,最好能教我一下,谢谢.

八方向寻路思路伪代码结构:


Function 八方向寻路(方向)

  Dim 八方区域,人物中心点,第一次获取,第二次获取

  人物中心点={X,Y}

  八方区域["左上"]={X-30,Y-30}

  八方区域["上"]={X,Y-30}

  八方区域["右上"]={X+30,Y-30}

  八方区域["左"]={X-30,Y}

  八方区域["右"]={X+30,Y}

  八方区域["左下"]={X-30,Y+30}

  八方区域["下"]={X,Y+30}

  八方区域["右下"]={X+30,Y+30}//大概就是这么一个意思

  If 方向 = "上" Then //方向的传参参数是人物要走的方向,具体参考通过额外的判断得出

    TracePrint "如果方向为上时需要判断的区域为:左上,上,右上"

    第一次获取 = GetPixelColor(x, y)//这里的XY是移动时一定会变动的坐标点

    Tap 八方区域["上"] : Delay 500//点击要走的坐标

    第二次获取=GetPixelColor(x, y)//这里的XY与第一次获取必须相同一致.

    //判断

    If 第一次获取 = 第二次获取 Then 

      TracePrint "这两个点颜色没有变动,意味着人物没有移动"

      //因为没有移动,我们加一个嵌套

      // Rem 标记点

      第一次获取 = GetPixelColor(x, y)//重新给第一次获取赋值,作为后面是否移动的判断

      Tap 八方区域["左上"] : Delay 500//这次点击要["左上"]的坐标

      第二次获取=GetPixelColor(x, y)//赋值

      If 第一次获取 = 第二次获取 Then 

        TracePrint "代表向左上移动也没有变化,那么就只有["右上"]一个方向了"

        Tap 八方区域["右上"] : Delay 500

      Else //只有二两获取的值不一样才会跳到这一行,从这一行开始,还需要进行最后一次判断

        第一次获取 = GetPixelColor(x, y)//重新给第一次获取赋值,作为后面是否移动的判断

        Tap 八方区域["上"] : Delay 500//向左上是可以走的,走完之后我们再走[上]坐标

        第二次获取 = GetPixelColor(x, y)

        If 第一次获取 = 第二次获取 Then 

          TracePrint "这两个值又相等了,证明左上再向上的位置也是障碍物,这是一个死胡同"

          Tap 八方区域["右下"]: Delay 500//因为我们刚才是走到了左上,所以这里要走回去复位

          第一次获取 = GetPixelColor(x, y)//再次赋值,用于向右上走的判断

          Tap 八方区域["右上"] //我们上面已经试过左上,那里走不通,这次我们从右上开始走

          第二次获取 = GetPixelColor(x, y)

          If 第一次获取 = 第二次获取 Then 

            TracePrint "这里的代码其实就是上面从左上开始走,下面那一段的复制,可以直接修改一下坐标,或者将左上与右下的坐标对调,用GOTO去循环"

            //比如这样, 八方区域["右上"]={原先左上的坐标}

            //八方区域["左上"]={原先右上的坐标},

            //Goto 标记点

          End If

        End If

      End If 

    End If   

  ElseIf 方向 = "下" Then

    TracePrint "如果方向为上时需要判断的区域为:左下,下,右下"

  ElseIf 方向 = "左" Then

    TracePrint "如果方向为上时需要判断的区域为:左上,左,左下"

  ElseIf 方向 = "右" Then

    TracePrint "如果方向为上时需要判断的区域为:右上,右,右下"

  End If

  //后面的方向如果不想复制那么多,可以再造一个函数,用传参进行精简

End Function


Function 遍历寻路(方向)

  Dim 区域,二值化,max_x,max_y,min_x,min_y,下标(),j,m,n,i,坐标,排序,最终计算坐标

  Dim 二值化数量

  If 方向 = "左" Then 

    区域 = {X1,Y1,X2,Y2}

  ElseIf 方向 = "右" Then

    区域 = {X1,Y1,X2,Y2}

  ElseIf 方向 = "右上" Then

    区域 = {X1,Y1,X2,Y2}

  ElseIf 方向 = "右下" Then

    区域 = {X1,Y1,X2,Y2}

  ElseIf 方向 = "左上" Then

    区域 = {X1,Y1,X2,Y2}

  ElseIf 方向 = "左下" Then

    区域 = {X1,Y1,X2,Y2}

  Else 

    区域 = {X1,Y1,X2,Y2}

  End If

  m = 0 : n = 1 : j = 0//先将值给赋了

  坐标 = Array():排序 = Array()

  ///截图至内存

  KeepCapture 

  副本名称 = Ocr( {X1,Y1,X2,Y2}, 颜色, 0.9)//这个是一定要有的,可以放别的结构里,但一定要有这一段

  //这个是用来判断当前处于什么类型的地图,从而得到相应二值化数据

//如果是传奇类的游戏,大多地面都是一个颜色的,那些可以不用专门去取色,直接调校完定义变量就可以了

  For i = 0 To (区域(3) / 30) //将要遍历的区域以30为单位进行分割,如果要再严谨一点可以在后面-1

    //这里有两个FOR I=0 TO N的结构,一个是用来存储X的数组,一个是用来存储Y轴的

    For i = 0 To (区域(2)/ 30)

      颜色数量 = 获取区域颜色数量(X1,Y1,X2,Y2)

      //上面的颜色数量={},是一个函数,里面的公式就是上面提到的副本名称,大概是这样写的:

      //IF 副本名称 ="地图1" Then 二值化="" :ElseIf 副本名称 ="地图2" Then FG 二值化="" End If 

      //      颜色数量 = GetColorNum(区域坐标, 二值化, 1.0)

      m = m + 1//每循环一次,M的值要同步+1

      If IsNumeric(颜色数量)=True Then//这里加一个数值判断,因为后面的判断是数值类型的,如果是空值会判断不了,报错

      Else 

        Exit Function 

      End If   

      If 颜色数量 > 1 Then//第一次筛选,颜色大于600

        下标={X1+30*(m-1), Y1+30*(n-1), X2+30*m, Y2+30*n}

        颜色数量 = 获取区域颜色数量(下标(2) - 50, 下标(3) - 50, 下标(2) + 50, 下标(3) + 50)

        //        颜色数量 = GetColorNum(下标(2)-50,下标(3)-50,下标(2)+50,下标(3)+50,"", 1.0)

        If 颜色数量 > 10 Then //二次筛选,向外拓展20,数量必定要大于之前

          坐标(j) = Array(下标(0), 下标(1))

          j = j + 1

        End If       

      End If

    Next

    n = n + 1

    m = 0

  Next

  If UBOUND(坐标) <= 0 Then //UBound 为0时,判断人物卡在了一个比较奇怪的地方,所以需要小幅度移动一下,这样可以提高稳定性

    //当然,如果会数组排序的话,这一串基本是用不到的,我是实在搞不明白排序的取值,不得以才用这种蠢B方式

    //最下面会说一下我对这个最大值最小值的应用理解,理论上是OK的

    TracePrint "区域内无符合坐标" //没有找到

    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 上颜色数量,下颜色数量,左颜色数量,右颜色数量,可点击坐标= 坐标()

  //这里我们再进行一次切割,这次切割的目的是为了筛选出更加精准的坐标

  //这里定义了四个方向,我们将上面第一次筛选出来的坐标再运算一次,如果这个坐标的上下左右区域都有足够多符合条件的颜色数量

  //那么是不是就可以判断出,这个坐标是在路的中间的呢?   

  For i = 0 To UBOUND(坐标)   

    上颜色数量 =获取区域颜色数量(坐标(i,0),坐标(i,1)-30,坐标(i,0)+30,坐标(i,1))

    下颜色数量 =获取区域颜色数量(坐标(i,0),坐标(i,1)+30,坐标(i,0)+30,坐标(i,1)+60)

    左颜色数量 =获取区域颜色数量(坐标(i,0)-30,坐标(i,1),坐标(i,0),坐标(i,1)+30)

    右颜色数量 =获取区域颜色数量(坐标(i,0)+30,坐标(i,1),坐标(i,0)+60,坐标(i,1)+30)

    If 上颜色数量 > 600 and 下颜色数量 > 600 and 左颜色数量 > 600 and 右颜色数量 > 600 Then //四方同时存在颜色

      可点击坐标(i) = Array(坐标(i, 0), 坐标(i, 1))//这样我们就得到了我们最终可找的所有在路中间的坐标

    End If

  Next

  ReleaseCapture 

  //释放内存

  Dim 基准点()  

  //下面这一段就是我自己的蠢B代码,因为实在不会排序,所以只能取巧用第一个,或者最后一个坐标来进行移动

  If 方向 = "左" or 方向 = "左上"or 方向 = "左下" Then //取第一个坐标递增     

    j = 0

    基准点(0)= GetPixelColor(533, 185)  

    For i=0 To UBOUND(可点击坐标)

      Tap 可点击坐标(j,0),可点击坐标(j,1)+30

      TracePrint 可点击坐标(j,0),可点击坐标(j,1)+30:Delay 800

      基准点(1) = GetPixelColor(533, 185)

      If 基准点(0) = 基准点(1) Then

        j=j+1

        Tap 可点击坐标(j,0),可点击坐标(j,1)+30:Delay 800

      Else 

        Exit For

      End If 

    Next 

  ElseIf 方向 = "右" or 方向 = "右下"or 方向 = "右上"Then //取最后一个坐标递减

    j = UBOUND(可点击坐标)

    基准点(0)= GetPixelColor(X,Y)  

    For i=0 To UBOUND(可点击坐标)

      Tap 可点击坐标(j,0),可点击坐标(j,1)+30

      TracePrint 可点击坐标(j,0),可点击坐标(j,1)+30:Delay 800

      基准点(1) = GetPixelColor(533, 185)

      If 基准点(0) = 基准点(1) Then

        j=j-1

        Tap 可点击坐标(j,0),可点击坐标(j,1)+30:Delay 800

      Else 

        Exit For

      End If 

    Next 

  Else 

  End If

  ////下面就是我对排序的实际应用得出的理论猜想,但我自己没有能力实现,想法说一下,如果有大佬解出来的,请让我抄一下作业

  max_x = 0

  j = 0//重置变量

  For i=0 To UBOUND (可点击坐标)//建立排序数组

    If 可点击坐标(i, 0) > max_x Then 

      max_x = 可点击坐标(i, 0)

      max_y = 可点击坐标(i, 1)

      //      排序(j)=Array(坐标(i, 0), 坐标(i, 1))????

      排序(j) = Array(max_x, max_y)

      i = i + 1

      j = j + 1 

    End If

  Next

  //找出第一个排序数组中最大值与最小值

  //  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) 

  //   

  //上面的我会了一点点,但是,怎么再从这些数组里面找出Y的最大值与最小值呢?

  //嗯,大概意思就是:

  //比如我要走左上位置,那我就需要找到X坐标中的最小值,并且这个X坐标对应的Y坐标也是这些数组对应的Y坐标中的最小值

  //同样的,走左下位置,我要找的就是X的最小值,并且这个X对应的Y坐标是这个数组中Y坐标的最大值

End Function

无坐标反馈:寻路思路的评论 (共 条)

分享到微博请遵守国家法律