如果你还没有看完本blog的上篇,建议您先看完上篇!!
第一代辅助如何死的?
我们先来看四张图
如上方最左图所示,前面是一个小圆柱子,看起来很人畜无害似不似??
由于上一步跳出了偏差,并没有跳在正中心,导致该扫描的位置未被扫描,如上方第二幅图所示。(上方右图绿色部分为被作为关键点的部分)
我们把log翻到上一次,发现位置的判断正常,但因不明原因跳偏,跳偏的原因至今不明.....
为防止再次出锅,我写了第二个版本的代码....
显然,要修改判定机制
一眼扫过去,就会发现扫描的范围过窄,显然要增大被扫描的范围....
如果单纯这么修改,依然会出锅,简单地来说,就是依然存在扫描到柱子侧面的可能,导致再次出锅。
通过进一步的测试,我发现跳一跳的方块具有此类奇特性质:
除了棕色带数字433的方块,及木凳子方块外,在确定方块正面后,以该面频数最高颜色作为匹配色,求出所有颜色与匹配色相同的点的平均坐标,即为下一个方块的中心点:
此处说明一下,挂掉的那根柱子侧面并非完全同色
如图所示:
绿色部分的正中间的那个红点即为计算出的落点。
通过该判断机制,在未启用白点判断的情况下,实现了连续30次命中中心点。
如何判定方块正面
启初,我根据已有的几千张图片进行了分析,发现若不进行专门的顶部判定,仅通过上述方式进行判定,也是可以找到准确找到方块中心点的。
码了出来,挂着去吃了顿饭,回来发现在8200+时死掉了....
通过分析log,事实证明我凸漾... 如图所示:
由于上图用的是经过优化的算法,并没有抓偏移。若仅采用上述的判定机制,由于两图红色标记部分面积均大于绿色部分,会出现算错目标落点的情况。
考虑如何进行优化。
不难发现,相对于方块侧面,方块正面与棋子的距离会更远一些,故在计算频数时,我们考虑对每个点赋予一个权值,该权值与计算点至棋子中心点间距呈线性关系(目前采用的是k=1),求出该颜色后,作为匹配色,求出所有颜色与匹配色完全相同的点的平均坐标,作为目标点。
然后就可以了(没错就这么简单)
求目标点的代码:
1 mp.clear(); Xsum.clear(); Ysum.clear(); 2 if(chessY<=290 ){//第二代扫描 3 for(int i=chessY+60;i<=P.m;i++){ 4 int j=chessX-(i-chessY)*tan30; 5 for(int jj=-50;jj<=50;jj++){ 6 int R=P.r[j+jj][i],G=P.g[j+jj][i],B=P.b[j+jj][i]; 7 if(R==0&&G==0&&B==0) continue; 8 if(R==114&&G==114&&B==114) continue; 9 int J=j+jj,I=i; 10 node id=node(R,G,B); 11 int add=getQZ(chessX-J); 12 mp[id]+=add; Xsum[id]+=J*add; Ysum[id]+=I*add; 13 } 14 } 15 }else{ 16 for(int i=chessY-60;i;i--){ 17 int j=chessX-(chessY-i)*tan30; 18 for(int jj=-50;jj<=50;jj++){ 19 int R=P.r[j+jj][i],G=P.g[j+jj][i],B=P.b[j+jj][i]; 20 if(R==0&&G==0&&B==0) continue; 21 if(R==114&&G==114&&B==114) continue; 22 int J=j+jj,I=i; 23 node id=node(R,G,B); 24 int add=getQZ(chessX-J); 25 mp[id]+=add; Xsum[id]+=J*add; Ysum[id]+=I*add; 26 } 27 } 28 } 29 printf("siz=%d ",mp.size()); 30 if(mp.size()>3000){ 31 wave2(); 32 return 0; 33 } 34 map<node,int>::iterator it,itX,itY,maxn; 35 it=maxn=mp.begin(); 36 itX=Xsum.begin(); 37 itY=Ysum.begin(); 38 while(it!=mp.end()){ 39 int sum1=it->second,sum2=maxn->second; 40 if(sum1>sum2) 41 maxn=it; 42 it++; 43 itX++; 44 itY++; 45 } 46 int sumX=Xsum[maxn->first]; 47 int sumY=Ysum[maxn->first]; 48 int cnt=maxn->second; 49 sumX/=cnt; sumY/=cnt;//已经确定目标点
如何确定另外两种特殊情况并作出反应
不难发现,那两种方块比较花,说白了,就是颜色的种类较多。
通过多次测试,令阈值为3000,若颜色种类低于阈值,则采用上述判定机制直接进行判定,否则直接采用第一代判定机制(是不是很机智)
在统计颜色数量孰多前,先进行白点检测,若检测到白点则直接跳白点即可。
(上图在测试主算法的可靠性,故没有启用抓白点)
然而...
尽管新的算法看起来极其优秀(实际测试中其实就是),截止目前尚未出现因算法本身而导致死亡的锅,但现实中,受限于电脑性能的不稳定性,按压时间会出现偏差,导致跳偏甚至跳死的现象,至今无解...(考虑回广州后用性能更强的电脑跑一下)
二代辅助目前历史记录为37244,尚未破一代记录。
理论上,在无卡顿的电脑上,二代辅助可实现99999。
不过,我还有一些其他的方法可以实现99999,比如游戏原始方块信息采集+AE渲染,渲染1分钟,实现5个9,看起来还天衣无缝哦~(逃)
全文终
代码如下(由于里面有一代的代码故很长请不要吐槽)
1 #include<bits/stdc++.h> 2 #include<cmath> 3 #include<windows.h> 4 #define d(x) keybd_event(x,0,0,0) 5 #define u(x) keybd_event(x,0,2,0) 6 #define s(x) Sleep(x) 7 #define me(x) mouse_event(x,0,0,0,0) 8 #define sc(x,y) SetCursorPos(x,y) 9 #define gk(x) GetAsyncKeyState(x) 10 11 #define M 100000 12 using namespace std; 13 14 int up(int x){while((x*3)%4!=0) x++;return x;} 15 int lf(int x){return abs(x);} 16 void printhead(unsigned char c[],int n,int m){ 17 //该函数用于写入一个24位bmp头 18 c[0]=0x42; c[1]=0x4d; //BM 19 unsigned siz=54+3*up(n)*up(m); 20 for(int i=2;i<=5;i++){ 21 c[i]=siz&255; siz=siz>>8; 22 }//写入siz 23 siz=3*n*m; 24 c[10]=0x36;//写入数据头位置 25 c[0x0e]=0x28;//头大小 26 for(int i=0x12;i<=0x15;i++) c[i]=m&255,m>>=8;//写入宽度 27 for(int i=0x16;i<=0x19;i++) c[i]=n&255,n>>=8;//写入高度 28 c[0x1a]=1;//永远为1 29 c[0x1c]=0x18;//24位位图 30 //for(int i=0x22;i<=0x25;i++) c[i]=siz&255,siz>>=8;//写入去头字节数 31 } 32 #define MFLONG 15000000 33 #define W 1921 34 #define H 1081 35 unsigned char _c[MFLONG]={0}; 36 struct board{//画布函数 37 int n,m;//宽高 38 unsigned char r[H][W],g[H][W],b[H][W]; 39 board(){ 40 n=m=0; memset(b,0,sizeof(b)); 41 memset(r,0,sizeof(r)); memset(g,0,sizeof(g)); 42 } 43 board(int nn,int mm,int R,int G,int B){ 44 n=nn; m=mm; memset(b,B,sizeof(b)); 45 memset(r,R,sizeof(r)); memset(g,G,sizeof(g)); 46 } 47 void clear(){ 48 n=m=0; memset(b,0,sizeof(b)); 49 memset(r,0,sizeof(r)); memset(g,0,sizeof(g)); 50 } 51 void outfile(char ad[]){ 52 FILE *fp; fp=fopen(ad,"wb"); 53 printhead(_c,n,m); int ns=54; 54 for(int i=n;i;i--){ 55 for(int j=1;j<=m;j++){ 56 _c[ns++]=b[i][j]; 57 _c[ns++]=g[i][j]; 58 _c[ns++]=r[i][j]; 59 } 60 int k=(3*m)%4; 61 for(int i=0;i<k;i++) 62 _c[ns++]=0; 63 } 64 fwrite(_c,1,ns,fp); 65 fclose(fp); 66 } 67 void readfile(char ad[]){ 68 FILE *fp; fp=fopen(ad,"rb"); 69 fread(_c,1,MFLONG,fp); 70 fclose(fp); 71 for(int i=0x15;i>=0x12;i--) m=m<<8,m=m+_c[i]; 72 for(int i=0x19;i>=0x16;i--) n=n<<8,n=n+_c[i]; 73 int ns=54; 74 for(int i=n;i;i--){ 75 for(int j=1;j<=m;j++){ 76 b[i][j]=_c[ns++]; 77 g[i][j]=_c[ns++]; 78 r[i][j]=_c[ns++]; 79 } 80 int k=(m*3)%4; 81 ns+=k; 82 } 83 fclose(fp); 84 } 85 }; 86 board S,P,P2,CAP; 87 88 void capture(){ 89 d(VK_SNAPSHOT); u(VK_SNAPSHOT); 90 S.readfile("screenx.bmp"); 91 } 92 #define epsR 2 93 #define epsG 2 94 #define epsB 2 95 #define conY 1.4356 ///过滤底色和阴影的参数 96 97 #define LR 43 98 #define RR 68 99 #define LG 49 100 #define RG 57 101 #define LB 76 102 #define RB 102 103 #define tan30 0.5773 104 105 /*#define JumpepsR 7 106 #define JumpepsG 7 107 #define JumpepsB 7//用于判断目标点的东西*/ 108 int JumpepsR,JumpepsG,JumpepsB; 109 110 int wx[]={-1,-1,-1,0,1,1,1,0}; 111 int wy[]={-1,0,1,1,1,0,-1,-1}; 112 113 struct node{ 114 int r,g,b; 115 node(){r=g=b=0;} 116 node(unsigned char R,unsigned char G,unsigned B){ 117 r=R; g=G; b=B; 118 } 119 friend bool operator <(node a,node b){ 120 if(a.r!=b.r) return a.r<b.r; 121 if(a.g!=b.g) return a.g<b.g; 122 return a.b<b.b; 123 } 124 bool cmp(int R,int G,int B){ 125 int e1=abs(r-R); 126 int e2=abs(g-G); 127 int e3=abs(b-B); 128 if(e1>epsR) return 0; 129 if(e2>epsG) return 0; 130 if(e3>epsB) return 0; 131 return 1; 132 } 133 }; 134 int pf(int x){return x*x;} 135 map<node,int> mp,Xsum,Ysum; 136 int chessX,chessY;//棋子的x,y坐标 137 int TX,TY; 138 139 int cmpspecial(char c[],int px,int py,int eps){//判断所有特殊的东西,包括白点,椅子等 140 CAP.readfile(c); 141 int minn=1234567890,maxx=0,maxy=0; 142 for(int j=chessX;j>=chessX-300;j--) 143 for(int i=1;i<=P.m-CAP.m;i++){ 144 int sum=0,pcnt=0; 145 for(int ii=1;ii<CAP.m;ii++) 146 for(int jj=1;jj<CAP.n;jj++){ 147 sum+=pf(P.r[j+jj][i+ii]-CAP.r[jj][ii]); 148 sum+=pf(P.g[j+jj][i+ii]-CAP.g[jj][ii]); 149 sum+=pf(P.b[j+jj][i+ii]-CAP.b[jj][ii]); 150 } 151 if(sum<minn){ 152 minn=sum,maxx=i,maxy=j; 153 //break; 154 } 155 } 156 if(minn<=eps){ 157 printf("catch %s ",c); 158 for(int ii=1;ii<CAP.m;ii++) 159 for(int jj=1;jj<CAP.n;jj++){ 160 P.r[maxy+jj][maxx+ii]=0; 161 P.g[maxy+jj][maxx+ii]=255; 162 P.b[maxy+jj][maxx+ii]=0; 163 } 164 TX=maxy+py; TY=maxx+px; 165 P.r[TX][TY]=255; P.g[TX][TY]=P.b[TX][TY]=0; 166 // P.outfile("test.bmp"); 167 return 1; 168 }else return 0; 169 } 170 171 int getQZ(int x){ 172 return x; 173 } 174 175 int lineR[10000]={0},lineG[10000]={0},lineB[10000]={0},X[10000]={0},Y[10000]={0}; 176 int wave2(){//专门处理椅子和其他东西的 177 printf("find chess or 433day "); 178 memset(X,0,sizeof(X)); memset(Y,0,sizeof(Y)); 179 memset(lineR,0,sizeof(lineR)); memset(lineG,0,sizeof(lineG)); memset(lineB,0,sizeof(lineB)); 180 //loop:; 181 int cnt=0; 182 mp.clear(); 183 if(chessY<=290 ){ 184 for(int i=chessY+60;i<=P.m;i++){ 185 int j=chessX-(i-chessY)*tan30; 186 if(P.r[j][i]==0&&P.g[j][i]==0&&P.b[j][i]==0) continue; 187 cnt++; 188 lineR[cnt]=P.r[j][i]; 189 lineG[cnt]=P.g[j][i]; 190 lineB[cnt]=P.b[j][i]; 191 X[cnt]=j; Y[cnt]=i; 192 mp[node(P.r[j][i],P.g[j][i],P.b[j][i])]++; 193 cnt++; 194 lineR[cnt]=P.r[j-4][i]; 195 lineG[cnt]=P.g[j-4][i]; 196 lineB[cnt]=P.b[j-4][i]; 197 X[cnt]=j-4; Y[cnt]=i; 198 mp[node(P.r[j-4][i],P.g[j-4][i],P.b[j-4][i])]++; 199 cnt++; 200 lineR[cnt]=P.r[j+4][i]; 201 lineG[cnt]=P.g[j+4][i]; 202 lineB[cnt]=P.b[j+4][i]; 203 X[cnt]=j+4; Y[cnt]=i; 204 mp[node(P.r[j+4][i],P.g[j+4][i],P.b[j+4][i])]++; 205 cnt++; 206 lineR[cnt]=P.r[j+8][i]; 207 lineG[cnt]=P.g[j+8][i]; 208 lineB[cnt]=P.b[j+8][i]; 209 X[cnt]=j+8; Y[cnt]=i; 210 mp[node(P.r[j+8][i],P.g[j+8][i],P.b[j+8][i])]++; 211 cnt++; 212 lineR[cnt]=P.r[j-8][i]; 213 lineG[cnt]=P.g[j-8][i]; 214 lineB[cnt]=P.b[j-8][i]; 215 X[cnt]=j-8; Y[cnt]=i; 216 mp[node(P.r[j-8][i],P.g[j-8][i],P.b[j-8][i])]++; 217 P.r[j+1][i]=P.r[j-1][i]=255; 218 P.g[j+1][i]=P.g[j-1][i]=255; 219 P.b[j+1][i]=P.b[j-1][i]=0; 220 } 221 }else{ 222 for(int i=chessY-60;i;i--){ 223 int j=chessX-(chessY-i)*tan30; 224 if(P.r[j][i]==0&&P.g[j][i]==0&&P.b[j][i]==0) continue; 225 cnt++; 226 lineR[cnt]=P.r[j][i]; 227 lineG[cnt]=P.g[j][i]; 228 lineB[cnt]=P.b[j][i]; 229 X[cnt]=j; Y[cnt]=i; 230 mp[node(P.r[j][i],P.g[j][i],P.b[j][i])]++; 231 cnt++; 232 lineR[cnt]=P.r[j-4][i]; 233 lineG[cnt]=P.g[j-4][i]; 234 lineB[cnt]=P.b[j-4][i]; 235 X[cnt]=j-4; Y[cnt]=i; 236 mp[node(P.r[j-4][i],P.g[j-4][i],P.b[j-4][i])]++; 237 cnt++; 238 lineR[cnt]=P.r[j+4][i]; 239 lineG[cnt]=P.g[j+4][i]; 240 lineB[cnt]=P.b[j+4][i]; 241 X[cnt]=j+4; Y[cnt]=i; 242 cnt++; 243 mp[node(P.r[j+4][i],P.g[j+4][i],P.b[j+4][i])]++; 244 lineR[cnt]=P.r[j+8][i]; 245 lineG[cnt]=P.g[j+8][i]; 246 lineB[cnt]=P.b[j+8][i]; 247 X[cnt]=j+8; Y[cnt]=i; 248 cnt++; 249 mp[node(P.r[j+8][i],P.g[j+8][i],P.b[j+8][i])]++; 250 lineR[cnt]=P.r[j-8][i]; 251 lineG[cnt]=P.g[j-8][i]; 252 lineB[cnt]=P.b[j-8][i]; 253 X[cnt]=j-8; Y[cnt]=i; 254 mp[node(P.r[j-8][i],P.g[j-8][i],P.b[j-8][i])]++; 255 P.r[j+1][i]=P.r[j-1][i]=255; 256 P.g[j+1][i]=P.g[j-1][i]=255; 257 P.b[j+1][i]=P.b[j-1][i]=0; 258 } 259 } 260 JumpepsR=JumpepsG=JumpepsB=10; 261 //if(cnt==0) goto loop; 262 int maxn=0,maxid=0,quan=3; 263 for(int i=1;i<=cnt;i++){ 264 quan=3; 265 int R=lineR[i]; 266 int G=lineG[i]; 267 int B=lineB[i]; 268 int sum=0; 269 for(int j=1;j<=cnt;j++){ 270 int DeltaR=abs(lineR[j]-R); 271 int DeltaG=abs(lineG[j]-G); 272 int DeltaB=abs(lineB[j]-B); 273 if(DeltaR>JumpepsR) continue; 274 if(DeltaG>JumpepsG) continue; 275 if(DeltaB>JumpepsB) continue; 276 sum+=abs(X[j]-chessX)*0.05+4; 277 } 278 if(sum>maxn) maxn=sum,maxid=i; 279 } 280 int sumX=0,sumY=0,sum=0; 281 int R=lineR[maxid]; 282 int G=lineG[maxid]; 283 int B=lineB[maxid]; 284 for(int j=1;j<=cnt;j++){ 285 int DeltaR=abs(lineR[j]-R); 286 int DeltaG=abs(lineG[j]-G); 287 int DeltaB=abs(lineB[j]-B); 288 if(DeltaR>JumpepsR) continue; 289 if(DeltaG>JumpepsG) continue; 290 if(DeltaB>JumpepsB) continue; 291 sum++; 292 P.r[X[j]][Y[j]]=0; 293 P.g[X[j]][Y[j]]=255; 294 P.b[X[j]][Y[j]]=0; 295 sumX+=X[j]; sumY+=Y[j]; 296 } 297 if(sum==0) 298 return 1; 299 sumX/=sum; sumY/=sum; 300 //求出目标点坐标 301 P.r[sumX][sumY]=255; P.g[sumX][sumY]=P.b[sumX][sumY]=0; 302 TX=sumX; TY=sumY; 303 //P.outfile("test.bmp"); 304 return 0; 305 306 //点击模组 307 } 308 309 int wave(){//完成对图像的底色和阴影过滤,以及求出棋子的中心点 310 P.clear(); 311 int sx=32,ex=1074; 312 int sy=682,ey=1265; 313 P.m=ey-sy+1; P.n=ex-sx+1; 314 for(int i=sx;i<=ex;i++) 315 for(int j=sy;j<=ey;j++){ 316 P.r[i-sx+1][j-sy+1]=S.r[i][j]; 317 P.g[i-sx+1][j-sy+1]=S.g[i][j]; 318 P.b[i-sx+1][j-sy+1]=S.b[i][j]; 319 } 320 // P.readfile("st1152.bmp"); 321 //抓出图像 322 323 P2=P; 324 int sumx=0,sumy=0,cntx=0; 325 for(int i=1;i<=P.n;i++) 326 for(int j=1;j<=P.m;j++){ 327 int dR=abs(P.r[i][j]); 328 int dG=abs(P.g[i][j]); 329 int dB=abs(P.b[i][j]); 330 int cnt=0; 331 if(LR<=dR&&dR<=RR) cnt++; 332 if(LG<=dG&&dG<=RG) cnt++; 333 if(LB<=dB&&dB<=RB) cnt++; 334 if(cnt==3){ 335 // P.r[i][j]=P.g[i][j]=P.b[i][j]; 336 sumx+=i; sumy+=j; cntx++; 337 } 338 }//识别棋子 339 340 for(int i=1;i<=P.n;i++){ 341 mp.clear(); 342 for(int j=1;j<=P.m;j++) 343 mp[node(P.r[i][j],P.g[i][j],P.b[i][j])]++; 344 map<node,int>::iterator it; 345 node maxid,maxid2; int maxn=0; 346 for(it=mp.begin();it!=mp.end();it++){ 347 if(maxn<it->second){ 348 maxn=it->second; 349 maxid=it->first; 350 } 351 } 352 maxid2.r=maxid.r/conY; 353 maxid2.g=maxid.g/conY; 354 maxid2.b=maxid.b/conY; 355 for(int j=1;j<=P.m;j++){ 356 if(maxid.cmp(P.r[i][j],P.g[i][j],P.b[i][j])) 357 P.r[i][j]=P.g[i][j]=P.b[i][j]=0; 358 if(maxid2.cmp(P.r[i][j],P.g[i][j],P.b[i][j])) 359 P.r[i][j]=P.g[i][j]=P.b[i][j]=0; 360 } 361 } 362 if(cntx==0) 363 return 1; 364 sumx/=cntx; sumy/=cntx; 365 sumx+=14; 366 P.r[sumx][sumy]=P.g[sumx][sumy]=P.b[sumx][sumy]=255; 367 chessX=sumx; chessY=sumy; 368 369 if(cmpspecial("000white.bmp",8,6,0)) return 2; 370 371 //loop:; 372 mp.clear(); Xsum.clear(); Ysum.clear(); 373 if(chessY<=290 ){//第二代扫描 374 for(int i=chessY+60;i<=P.m;i++){ 375 int j=chessX-(i-chessY)*tan30; 376 for(int jj=-50;jj<=50;jj++){ 377 int R=P.r[j+jj][i],G=P.g[j+jj][i],B=P.b[j+jj][i]; 378 if(R==0&&G==0&&B==0) continue; 379 if(R==114&&G==114&&B==114) continue; 380 int J=j+jj,I=i; 381 node id=node(R,G,B); 382 int add=getQZ(chessX-J); 383 mp[id]+=add; Xsum[id]+=J*add; Ysum[id]+=I*add; 384 } 385 } 386 }else{ 387 for(int i=chessY-60;i;i--){ 388 int j=chessX-(chessY-i)*tan30; 389 for(int jj=-50;jj<=50;jj++){ 390 int R=P.r[j+jj][i],G=P.g[j+jj][i],B=P.b[j+jj][i]; 391 if(R==0&&G==0&&B==0) continue; 392 if(R==114&&G==114&&B==114) continue; 393 int J=j+jj,I=i; 394 node id=node(R,G,B); 395 int add=getQZ(chessX-J); 396 mp[id]+=add; Xsum[id]+=J*add; Ysum[id]+=I*add; 397 } 398 } 399 } 400 printf("siz=%d ",mp.size()); 401 if(mp.size()>3000){ 402 wave2(); 403 return 0; 404 } 405 map<node,int>::iterator it,itX,itY,maxn; 406 it=maxn=mp.begin(); 407 itX=Xsum.begin(); 408 itY=Ysum.begin(); 409 while(it!=mp.end()){ 410 int sum1=it->second,sum2=maxn->second; 411 if(sum1>sum2) 412 maxn=it; 413 it++; 414 itX++; 415 itY++; 416 } 417 int sumX=Xsum[maxn->first]; 418 int sumY=Ysum[maxn->first]; 419 int cnt=maxn->second; 420 sumX/=cnt; sumY/=cnt;//已经确定目标点 421 node hh=maxn->first; 422 423 if(chessY<=290 ){//第二代采用密集的扫描 424 for(int i=chessY+60;i<=P.m;i++){ 425 int j=chessX-(i-chessY)*tan30; 426 for(int jj=-50;jj<=50;jj++){ 427 int R=P.r[j+jj][i],G=P.g[j+jj][i],B=P.b[j+jj][i]; 428 if(R!=hh.r||G!=hh.g||B!=hh.b) continue; 429 P.r[j+jj][i]=0; P.g[j+jj][i]=255; P.b[j+jj][i]=0; 430 } 431 } 432 }else{ 433 for(int i=chessY-60;i;i--){ 434 int j=chessX-(chessY-i)*tan30; 435 for(int jj=-50;jj<=50;jj++){ 436 int R=P.r[j+jj][i],G=P.g[j+jj][i],B=P.b[j+jj][i]; 437 if(R!=hh.r||G!=hh.g||B!=hh.b) continue; 438 P.r[j+jj][i]=0; P.g[j+jj][i]=255; P.b[j+jj][i]=0; 439 } 440 } 441 } 442 loop:; 443 P.r[sumX][sumY]=255; P.g[sumX][sumY]=P.b[sumX][sumY]=0; 444 TX=sumX; TY=sumY; 445 // P.outfile("test.bmp"); 446 return 0; 447 448 //点击模组 449 } 450 451 452 int main(){ 453 while(!gk(VK_F7)) s(10); 454 keybd_event(VK_F7,0,2,0); 455 char c[100]; 456 int cas=0,x=0,y=0,sum=0,buchang=0; 457 //Sleep(2000); 458 int last=0; 459 while(1){ 460 cas++; 461 capture(); 462 Sleep(1000); 463 capture(); 464 Sleep(1000); 465 int k=wave(); 466 if(gk(VK_F7)) return 0; 467 int X=abs(TX-chessX),Y=abs(TY-chessY); 468 double d=0.866,b=1.732; 469 int he=2*X+d*(Y-b*X); 470 printf("dist=%dpixels ",he); 471 me(2); s(he*2.55); me(4); 472 s(1200); 473 freopen("log.txt","r",stdin); 474 scanf("%d%d",&x,&y); 475 fclose(stdin); 476 sprintf(c,"log%d.bmp",x); 477 P.outfile(c); 478 sprintf(c,"st%d.bmp",x); 479 P2.outfile(c); 480 x++; y+=(k==2); 481 printf("sumjump=%d,centrejump=%d ",x,y); 482 freopen("log.txt","w",stdout); 483 printf("%d %d ",x,y); 484 fclose(stdout); 485 freopen("con","w",stdout); 486 } 487 488 }