| | |
|
组别 | 士兵 |
级别 | 牙门将军 |
功绩 | 5 |
帖子 | 546 |
编号 | 301657 |
注册 | 2008-12-18 |
| |
| | |
|
|
|
关于获取目标周围单位(武将相邻一定范围内)
解决个之前因思路阻塞,未能及时解决掉的【 圆圈范围】误判的问题,一切都只是算法问题...........![](images/smilies/1014.gif)
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)
![](attachments/month_1507/20150727_9b7d2a96dbe823c101faIg7E3nPTH7nc.jpg)
下面效果图:【圆圈范围】
图片附件: 0.jpg (2015-9-11 23:36, 234.25 K)
![](attachments/month_1509/20150911_c770fd056634a9c9cfc09VO9FqSy5qvv.jpg)
[ 本帖最后由 a117398902 于 2015-9-11 23:42 编辑 ]
|
|
|
|