如果你還沒有看完本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\n",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\n",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\n"); 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\n",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\n",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\n\n",x,y); 482 freopen("log.txt","w",stdout); 483 printf("%d %d\n",x,y); 484 fclose(stdout); 485 freopen("con","w",stdout); 486 } 487 488 }