标题: 关于获取目标周围单位(武将相邻一定范围内), 解决【 圆圈范围】误判的问题
性别:未知-离线 a117398902
(G仔)

Rank: 4
组别 士兵
级别 牙门将军
功绩 5
帖子 546
编号 301657
注册 2008-12-18


发表于 2015-7-27 19:05 资料 个人空间 短消息 看全部作者
关于获取目标周围单位(武将相邻一定范围内)

解决个之前因思路阻塞,未能及时解决掉的【 圆圈范围】误判的问题,一切都只是算法问题...........


0052A956    6A 01           PUSH 1                                   ; 决定了要判断的范围类型,0=非【圆圈范围】,=1即【圆圈范围】获取
0052A958    6A 01           PUSH 1                                   ; 当X坐标和Y坐标都不相同时,所需要判断的差值(即斜向判断),若是【圆圈范围】此处必须是1
0052A95A    6A 03           PUSH 3                                   ; 当X坐标或Y坐标相同时,所需要判断的差值(即横纵判断),若是【圆圈范围】此处的数值决定范围的大小(2=没羽箭、3=大没羽箭、4=大大没羽箭、5=5格 圆圈...................)
0052A95C    FF75 F4         PUSH DWORD PTR SS:[EBP-C]   ; B武将战场内存
0052A95F    8B4D 08         MOV ECX,DWORD PTR SS:[EBP+8]   ; A武将战场内存
0052A962    E8 F3E6FFFF     CALL Ekd5.0052905A                       ; **调用自写函数,判断B武将是否在A武将的指定范围内
0052A967    85C0            TEST EAX,EAX                             ; EAX=1(相邻) =0(不相邻)
0052A969    74 04           JE SHORT Ekd5.0052A96F

简单说就是多加个参数做判断,区分圆圈范围还是非圆圈范围,改变斜向的判断,大小由+C栈值决定
具体算法就是 X坐标差值-1,Y坐标差值+1,直至X坐标差值=0



主代码:

0052905A    55              PUSH EBP
0052905B    8BEC            MOV EBP,ESP
0052905D    83EC 10         SUB ESP,10
00529060    8A41 06         MOV AL,BYTE PTR DS:[ECX+6]               ; ECX存放着A武将的战场内存,获取其X坐标
00529063    8845 FC         MOV BYTE PTR SS:[EBP-4],AL               ; [EBP-4]存放获取出来的X坐标(A武将)
00529066    8A41 07         MOV AL,BYTE PTR DS:[ECX+7]               ; 获取其Y坐标
00529069    8845 F8         MOV BYTE PTR SS:[EBP-8],AL               ; [EBP-8]存放获取出来的Y坐标(A武将)
0052906C    8B4D 08         MOV ECX,DWORD PTR SS:[EBP+8]             ; [EBP+8]存放着B武将战场内存
0052906F    8A41 06         MOV AL,BYTE PTR DS:[ECX+6]               ; X坐标
00529072    8845 F4         MOV BYTE PTR SS:[EBP-C],AL               ; [EBP-C]来存放获取出来的X坐标(B武将)
00529075    8A41 07         MOV AL,BYTE PTR DS:[ECX+7]               ; Y坐标
00529078    8845 F0         MOV BYTE PTR SS:[EBP-10],AL              ; [EBP-10]来存放获取出来的Y坐标(B武将)
0052907B    90              NOP
0052907C    90              NOP                                      ; **以下开始判断双方X坐标,相同则比较双方Y坐标差值,不相同则判断Y坐标
0052907D    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]             ; [EBP-4]存放获取出来的X坐标(A武将)
00529080    3A45 F4         CMP AL,BYTE PTR SS:[EBP-C]               ; 比较双方X坐标
00529083    75 16           JNZ SHORT Ekd5.0052909B                  ; 不相同则跳到下面判断Y坐标,否则继续判断双方Y坐标差值
00529085    8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]             ; [EBP-8]存放获取出来的Y坐标(A武将)
00529088    8B4D F0         MOV ECX,DWORD PTR SS:[EBP-10]            ; [EBP-10]来存放获取出来的Y坐标(B武将)
0052908B    3AC1            CMP AL,CL
0052908D    77 02           JA SHORT Ekd5.00529091                   ; 前者大于后者则跳到下面由前者Y坐标-后者Y坐标,否则数据互换后再相减
0052908F    86C8            XCHG AL,CL                               ; 数据互换,主要防范溢出和简化代码
00529091    2AC1            SUB AL,CL                                ; 相减得出差值
00529093    3A45 0C         CMP AL,BYTE PTR SS:[EBP+C]               ; 比较相差值是否为[EBP+C]的数值,【横纵差值】
00529096    7E 56           JLE SHORT Ekd5.005290EE                  ; 小于或等于即在范围内跳转函数尾赋值1结束,否则继续
00529098    EB 56           JMP SHORT Ekd5.005290F0                  ; 大于即不在范围内,跳至函数尾赋值0结束,无需再判断下面
0052909A    90              NOP
0052909B    8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]
0052909E    3A45 F0         CMP AL,BYTE PTR SS:[EBP-10]              ; 比较双方Y坐标
005290A1    74 09           JE SHORT Ekd5.005290AC                   ; 相同则跳至下面判断双方X坐标差值
005290A3    837D 14 01      CMP DWORD PTR SS:[EBP+14],1              ; =1即是【圆圈范围】
005290A7    74 4B           JE SHORT Ekd5.005290F4                   ; 跳至 【圆圈范围】的判断代码处
005290A9    EB 17           JMP SHORT Ekd5.005290C2                  ; 跳至 下面判断X、Y坐标差值是否符合母函数输入进来的【斜向差值】
005290AB    90              NOP
005290AC    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
005290AF    8B4D F4         MOV ECX,DWORD PTR SS:[EBP-C]
005290B2    3AC1            CMP AL,CL                                ; 比较双方X坐标,主要用于区分大小
005290B4    77 02           JA SHORT Ekd5.005290B8
005290B6    86C8            XCHG AL,CL
005290B8    2AC1            SUB AL,CL                                ; 用B武将的X坐标-A武将的X坐标
005290BA    3A45 0C         CMP AL,BYTE PTR SS:[EBP+C]               ; 比较相差值是否为[EBP+C]的数值,【横纵差值】
005290BD    7E 2F           JLE SHORT Ekd5.005290EE                  ; 小于或等于即在范围内跳转函数尾赋值1结束,否则继续
005290BF    EB 2F           JMP SHORT Ekd5.005290F0                  ; 大于即不在范围内,跳至函数尾赋值0结束,无需再判断下面
005290C1    90              NOP                                      ; **以下开始判断双方X、Y坐标差值是否符合母函数输入进来的【斜向差值】
005290C2    8B4D FC         MOV ECX,DWORD PTR SS:[EBP-4]             ; A武将X坐标
005290C5    8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]             ; B武将X坐标
005290C8    3AC1            CMP AL,CL
005290CA    77 02           JA SHORT Ekd5.005290CE
005290CC    86C8            XCHG AL,CL
005290CE    2AC1            SUB AL,CL
005290D0    3A45 10         CMP AL,BYTE PTR SS:[EBP+10]              ; 相减后得出的差值和母函数输入进来的【斜向差值】进行比较
005290D3    7E 03           JLE SHORT Ekd5.005290D8                  ; 小于或等于即在范围内跳转到下面判断Y坐标差值,否则继续
005290D5    EB 19           JMP SHORT Ekd5.005290F0                  ; 不在范围即跳转至函数赋值0结束,无需在判断Y坐标差值
005290D7    90              NOP                                      ; **双方Y坐标差值
005290D8    8B4D F8         MOV ECX,DWORD PTR SS:[EBP-8]             ; A武将Y坐标
005290DB    8B45 F0         MOV EAX,DWORD PTR SS:[EBP-10]            ; B武将Y坐标
005290DE    3AC1            CMP AL,CL
005290E0    77 02           JA SHORT Ekd5.005290E4
005290E2    86C8            XCHG AL,CL
005290E4    2AC1            SUB AL,CL
005290E6    3A45 10         CMP AL,BYTE PTR SS:[EBP+10]              ; 相减后得出的差值和母函数输入进来的【斜向差值】进行比较
005290E9    7E 46           JLE SHORT Ekd5.00529131                  ; 小于或等于即在范围内跳转到函数尾赋值1结束
005290EB    EB 40           JMP SHORT Ekd5.0052912D                  ; 跳至函数尾赋值0结束
005290ED    90              NOP
005290EE    EB 41           JMP SHORT Ekd5.00529131                  ; 过渡跳转,赋值1处
005290F0    EB 3B           JMP SHORT Ekd5.0052912D                  ; 过渡跳转,赋值0处
005290F2    90              NOP                                      ; **以下为判断【圆圈范围】代码,判断双方X、Y坐标差值
005290F3    90              NOP                                      ; 以下开始判断双方X坐标差值
005290F4    FF4D 0C         DEC DWORD PTR SS:[EBP+C]                 ; 【横纵差值】,这里将作为X坐标差值,...这里是X坐标差值-1操作,即缩小一格
005290F7    837D 0C 00      CMP DWORD PTR SS:[EBP+C],0
005290FB    74 30           JE SHORT Ekd5.0052912D
005290FD    8B4D FC         MOV ECX,DWORD PTR SS:[EBP-4]             ; A武将X坐标
00529100    8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]             ; B武将X坐标
00529103    3AC1            CMP AL,CL
00529105    77 02           JA SHORT Ekd5.00529109
00529107    86C8            XCHG AL,CL
00529109    2AC1            SUB AL,CL
0052910B    3A45 0C         CMP AL,BYTE PTR SS:[EBP+C]
0052910E    7E 03           JLE SHORT Ekd5.00529113                  ; 小于等于跳转即X坐标在范围内,跳至下面判断Y坐标差值
00529110    EB 1B           JMP SHORT Ekd5.0052912D                  ; 跳出循环,至函数尾赋值0结束
00529112    90              NOP                                      ; 以下开始判断双方Y坐标差值
00529113    8B4D F8         MOV ECX,DWORD PTR SS:[EBP-8]             ; A武将Y坐标
00529116    8B45 F0         MOV EAX,DWORD PTR SS:[EBP-10]            ; B武将Y坐标
00529119    3AC1            CMP AL,CL
0052911B    77 02           JA SHORT Ekd5.0052911F
0052911D    86C8            XCHG AL,CL
0052911F    2AC1            SUB AL,CL
00529121    3A45 10         CMP AL,BYTE PTR SS:[EBP+10]              ; 【斜向差值】,这里将作为Y坐标差值
00529124    7E 0B           JLE SHORT Ekd5.00529131                  ; 小于等于,即X和Y坐标都在范围内,跳至函数尾赋值1结束
00529126    90              NOP
00529127    FF45 10         INC DWORD PTR SS:[EBP+10]                ; Y坐标差值+1,即增大一格
0052912A  ^ EB C8           JMP SHORT Ekd5.005290F4                 ; 跳回去继续循环
0052912C    90              NOP
0052912D    33C0            XOR EAX,EAX
0052912F    EB 05           JMP SHORT Ekd5.00529136
00529131    B8 01000000     MOV EAX,1
00529136    8BE5            MOV ESP,EBP
00529138    5D              POP EBP
00529139    C2 1000         RETN 10



【非圆圈范围】思路:主要根据3种坐标情况配合 两个差值 进行判断,即
1:当双方X坐标相同则比较双方Y坐标差值 是否符合输入进来的 【横纵差值】,即X1:X2成立,Y1-Y2(或Y2-Y1)
2:当双方Y坐标相同则比较双方X坐标差值  是否符合输入进来的 【横纵差值】,即Y1:Y2成立,X1-X2(或X2-X1)
3:当前面两者都不成立时,则B单位必定是处于A的斜面线,所以比较双方X、Y坐标差值,X、Y坐标都要比 是否符合输入进来的 【斜向差值】


三种坐标情况,若出现其中一种均不需要再判断另外两种


下面效果图:【非圆圈范围】


图片附件: 0.jpg (2015-7-27 19:05, 505.6 K)




下面效果图:【圆圈范围】


图片附件: 0.jpg (2015-9-11 23:36, 234.25 K)



[ 本帖最后由 a117398902 于 2015-9-11 23:42 编辑 ]


顶部
性别:未知-离线 a117398902
(G仔)

Rank: 4
组别 士兵
级别 牙门将军
功绩 5
帖子 546
编号 301657
注册 2008-12-18


发表于 2015-7-27 22:46 资料 个人空间 短消息 看全部作者
回复 #2 c381612 的帖子

跟穿透函数半点关系都没


顶部
性别:未知-离线 a117398902
(G仔)

Rank: 4
组别 士兵
级别 牙门将军
功绩 5
帖子 546
编号 301657
注册 2008-12-18


发表于 2015-7-28 22:36 资料 个人空间 短消息 看全部作者
补坑

[ 本帖最后由 a117398902 于 2015-9-11 23:39 编辑 ]
顶部

正在浏览此帖的会员 - 共 2 人在线




当前时区 GMT+8, 现在时间是 2025-2-8 11:01
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.014821 second(s), 10 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP