00001
00002
00003
00004
00005 #include "rcheckers.h"
00006
00007
00009
00010
00011
00013
00014
00015 bool RCheckers::go1(int from,int field)
00016 {
00017 to=field;
00018
00019 if(checkCapture1())
00020 {
00021 bool capture=false;
00022 switch(board[from])
00023 {
00024 case MAN1:
00025 if(manCapture1(from,UL,capture)) return true;
00026 if(manCapture1(from,UR,capture)) return true;
00027 if(manCapture1(from,DL,capture)) return true;
00028 if(manCapture1(from,DR,capture)) return true;
00029 return false;
00030 case KING1:
00031 if(kingCapture1(from,UL,capture)) return true;
00032 if(kingCapture1(from,UR,capture)) return true;
00033 if(kingCapture1(from,DL,capture)) return true;
00034 if(kingCapture1(from,DR,capture)) return true;
00035 return false;
00036 }
00037 }
00038 else
00039 {
00040 switch(board[from])
00041 {
00042 case MAN1:
00043 if((to==(from-6))||(to==(from-5)))
00044 {
00045 board[from]=FREE;
00046 if(to<10) board[to]=KING1;
00047 else board[to]=MAN1;
00048 return true;
00049 }
00050 return false;
00051 case KING1:
00052 for(int i=from-6;;i-=6)
00053 {
00054 if(i==to)
00055 {
00056 board[from]=FREE;
00057 board[to]=KING1;
00058 return true;
00059 }
00060 else if(board[i]==FREE) continue;
00061 else break;
00062 }
00063 for(int i=from-5;;i-=5)
00064 {
00065 if(i==to)
00066 {
00067 board[from]=FREE;
00068 board[to]=KING1;
00069 return true;
00070 }
00071 else if(board[i]==FREE) continue;
00072 else break;
00073 }
00074 for(int i=from+5;;i+=5)
00075 {
00076 if(i==to)
00077 {
00078 board[from]=FREE;
00079 board[to]=KING1;
00080 return true;
00081 }
00082 else if(board[i]==FREE) continue;
00083 else break;
00084 }
00085 for(int i=from+6;;i+=6)
00086 {
00087 if(i==to)
00088 {
00089 board[from]=FREE;
00090 board[to]=KING1;
00091 return true;
00092 }
00093 else if(board[i]==FREE) continue;
00094 else break;
00095 }
00096 return false;
00097 }
00098 }
00099 return false;
00100 }
00101
00102
00103 bool RCheckers::checkCapture1()
00104 {
00105 for(int i=6;i<48;i++)
00106 {
00107 switch(board[i])
00108 {
00109 case MAN1:
00110 if(board[i-6]==MAN2 || board[i-6]==KING2)
00111 if(board[i-12]==FREE) return true;
00112 if(board[i-5]==MAN2 || board[i-5]==KING2)
00113 if(board[i-10]==FREE) return true;
00114 if(board[i+5]==MAN2 || board[i+5]==KING2)
00115 if(board[i+10]==FREE) return true;
00116 if(board[i+6]==MAN2 || board[i+6]==KING2)
00117 if(board[i+12]==FREE) return true;
00118 break;
00119 case KING1:
00120 int k;
00121 for(k=i-6;board[k]==FREE;k-=6);
00122 if(board[k]==MAN2 || board[k]==KING2)
00123 if(board[k-6]==FREE) return true;
00124
00125 for(k=i-5;board[k]==FREE;k-=5);
00126 if(board[k]==MAN2 || board[k]==KING2)
00127 if(board[k-5]==FREE) return true;
00128
00129 for(k=i+5;board[k]==FREE;k+=5);
00130 if(board[k]==MAN2 || board[k]==KING2)
00131 if(board[k+5]==FREE) return true;
00132
00133 for(k=i+6;board[k]==FREE;k+=6);
00134 if(board[k]==MAN2 || board[k]==KING2)
00135 if(board[k+6]==FREE) return true;
00136 }
00137 }
00138 return false;
00139 }
00140
00141
00142
00143
00144
00145 bool RCheckers::manCapture1(int from,int direction,bool &capture)
00146 {
00147 int i=from+direction;
00148 if(board[i]==MAN2 || board[i]==KING2)
00149 {
00150 int k=i+direction;
00151 if(board[k]==FREE)
00152 {
00153 bool next=false;
00154 int save=board[i];
00155 board[from]=FREE;
00156 board[i]=NONE;
00157
00158 if(k<10)
00159 {
00160 board[k]=KING1;
00161 if(kingCapture1(k,direction+11,next)) {board[i]=FREE;return true;}
00162 }
00163 else
00164 {
00165 board[k]=MAN1;
00166 if(direction==UL || direction==DR)
00167 {
00168 if(manCapture1(k,UR,next)) {board[i]=FREE;return true;}
00169 if(manCapture1(k,DL,next)) {board[i]=FREE;return true;}
00170 }
00171 else
00172 {
00173 if(manCapture1(k,UL,next)) {board[i]=FREE;return true;}
00174 if(manCapture1(k,DR,next)) {board[i]=FREE;return true;}
00175 }
00176 if(manCapture1(k,direction,next)) {board[i]=FREE;return true;}
00177 }
00178
00179 if((!next) && k==to) {board[i]=FREE;return true;}
00180
00181 board[k]=FREE;
00182 board[i]=save;
00183 board[from]=MAN1;
00184 capture=true;
00185 }
00186 }
00187 return false;
00188 }
00189
00190
00191 bool RCheckers::kingCapture1(int from,int direction,bool &capture)
00192 {
00193 int i;
00194 for(i=from+direction;board[i]==FREE;i+=direction);
00195
00196 if(board[i]==MAN2 || board[i]==KING2)
00197 {
00198 int k=i+direction;
00199 if(board[k]==FREE)
00200 {
00201 bool next=false;
00202 int save=board[i];
00203 board[from]=FREE;
00204 board[i]=NONE;
00205
00206 for(;board[k]==FREE;k+=direction)
00207 {
00208 board[k]=KING1;
00209 if(direction==UL || direction==DR)
00210 {
00211 if(kingCapture1(k,UR,next)) {board[i]=FREE;return true;}
00212 if(kingCapture1(k,DL,next)) {board[i]=FREE;return true;}
00213 }
00214 else
00215 {
00216 if(kingCapture1(k,UL,next)) {board[i]=FREE;return true;}
00217 if(kingCapture1(k,DR,next)) {board[i]=FREE;return true;}
00218 }
00219 board[k]=FREE;
00220 }
00221
00222 board[k-=direction]=KING1;
00223 if(kingCapture1(k,direction,next)) {board[i]=FREE;return true;}
00224 board[k]=FREE;
00225
00226 if(!next)
00227 for(;k!=i;k-=direction)
00228 if(k==to) {board[i]=FREE;board[k]=KING1;return true;}
00229
00230 board[i]=save;
00231 board[from]=KING1;
00232 capture=true;
00233 }
00234 }
00235 return false;
00236 }
00237
00238
00240
00241
00242
00244
00245
00246 void RCheckers::kingMove2(int from,int &resMax)
00247 {
00248 board[from]=FREE;
00249 for(int i=from-6;board[i]==FREE;i-=6)
00250 {
00251 board[i]=KING2;
00252 turn(resMax);
00253 board[i]=FREE;
00254 }
00255 for(int i=from-5;board[i]==FREE;i-=5)
00256 {
00257 board[i]=KING2;
00258 turn(resMax);
00259 board[i]=FREE;
00260 }
00261 for(int i=from+5;board[i]==FREE;i+=5)
00262 {
00263 board[i]=KING2;
00264 turn(resMax);
00265 board[i]=FREE;
00266 }
00267 for(int i=from+6;board[i]==FREE;i+=6)
00268 {
00269 board[i]=KING2;
00270 turn(resMax);
00271 board[i]=FREE;
00272 }
00273 board[from]=KING2;
00274 }
00275
00276
00277 bool RCheckers::checkCapture2()
00278 {
00279 for(int i=6;i<48;i++)
00280 {
00281 switch(board[i])
00282 {
00283 case MAN2:
00284 if(board[i-6]==MAN1 || board[i-6]==KING1)
00285 if(board[i-12]==FREE) return true;
00286 if(board[i-5]==MAN1 || board[i-5]==KING1)
00287 if(board[i-10]==FREE) return true;
00288 if(board[i+5]==MAN1 || board[i+5]==KING1)
00289 if(board[i+10]==FREE) return true;
00290 if(board[i+6]==MAN1 || board[i+6]==KING1)
00291 if(board[i+12]==FREE) return true;
00292 break;
00293 case KING2:
00294 int k;
00295 for(k=i-6;board[k]==FREE;k-=6);
00296 if(board[k]==MAN1 || board[k]==KING1)
00297 if(board[k-6]==FREE) return true;
00298
00299 for(k=i-5;board[k]==FREE;k-=5);
00300 if(board[k]==MAN1 || board[k]==KING1)
00301 if(board[k-5]==FREE) return true;
00302
00303 for(k=i+5;board[k]==FREE;k+=5);
00304 if(board[k]==MAN1 || board[k]==KING1)
00305 if(board[k+5]==FREE) return true;
00306
00307 for(k=i+6;board[k]==FREE;k+=6);
00308 if(board[k]==MAN1 || board[k]==KING1)
00309 if(board[k+6]==FREE) return true;
00310 }
00311 }
00312 return false;
00313 }
00314
00315
00316
00317
00318
00319 bool RCheckers::manCapture2(int from,int &resMax)
00320 {
00321 bool capture=false;
00322
00323 int i=from-6;
00324 if(board[i]==MAN1 || board[i]==KING1)
00325 {
00326 int k=from-12;
00327 if(board[k]==FREE)
00328 {
00329 int save=board[i];
00330 board[from]=FREE;
00331 board[i]=NONE;
00332 board[k]=MAN2;
00333 resMax--;
00334 if(!manCapture2(k,resMax)) turn(resMax,true);
00335 resMax++;
00336 board[k]=FREE;
00337 board[i]=save;
00338 board[from]=MAN2;
00339 capture=true;
00340 }
00341 }
00342
00343 i=from-5;
00344 if(board[i]==MAN1 || board[i]==KING1)
00345 {
00346 int k=from-10;
00347 if(board[k]==FREE)
00348 {
00349 int save=board[i];
00350 board[from]=FREE;
00351 board[i]=NONE;
00352 board[k]=MAN2;
00353 resMax--;
00354 if(!manCapture2(k,resMax)) turn(resMax,true);
00355 resMax++;
00356 board[k]=FREE;
00357 board[i]=save;
00358 board[from]=MAN2;
00359 capture=true;
00360 }
00361 }
00362
00363 i=from+5;
00364 if(board[i]==MAN1 || board[i]==KING1)
00365 {
00366 int k=from+10;
00367 if(board[k]==FREE)
00368 {
00369 int save=board[i];
00370 board[from]=FREE;
00371 board[i]=NONE;
00372 resMax--;
00373 if(from>32)
00374 {
00375 board[k]=KING2;
00376 if(!kingCapture2(k,UL,resMax)) turn(resMax,true);
00377 }
00378 else
00379 {
00380 board[k]=MAN2;
00381 if(!manCapture2(k,resMax)) turn(resMax,true);
00382 }
00383 resMax++;
00384 board[k]=FREE;
00385 board[i]=save;
00386 board[from]=MAN2;
00387 capture=true;
00388 }
00389 }
00390
00391 i=from+6;
00392 if(board[i]==MAN1 || board[i]==KING1)
00393 {
00394 int k=from+12;
00395 if(board[k]==FREE)
00396 {
00397 int save=board[i];
00398 board[from]=FREE;
00399 board[i]=NONE;
00400 resMax--;
00401 if(from>32)
00402 {
00403 board[k]=KING2;
00404 if(!kingCapture2(k,UR,resMax)) turn(resMax,true);
00405 }
00406 else
00407 {
00408 board[k]=MAN2;
00409 if(!manCapture2(k,resMax)) turn(resMax,true);
00410 }
00411 resMax++;
00412 board[k]=FREE;
00413 board[i]=save;
00414 board[from]=MAN2;
00415 capture=true;
00416 }
00417 }
00418
00419 if(capture) return true;
00420 return false;
00421 }
00422
00423
00424 bool RCheckers::kingCapture2(int from,int direction,int &resMax)
00425 {
00426 int i;
00427 for(i=from+direction;board[i]==FREE;i+=direction);
00428
00429 if(board[i]==MAN1 || board[i]==KING1)
00430 {
00431 int k=i+direction;
00432 if(board[k]==FREE)
00433 {
00434 bool capture=false;
00435 int save=board[i];
00436 board[from]=FREE;
00437 board[i]=NONE;
00438 resMax--;
00439
00440 for(;board[k]==FREE;k+=direction)
00441 {
00442 board[k]=KING2;
00443 if(direction==UL || direction==DR)
00444 {
00445 if(kingCapture2(k,UR,resMax)) capture=true;
00446 if(kingCapture2(k,DL,resMax)) capture=true;
00447 }
00448 else
00449 {
00450 if(kingCapture2(k,UL,resMax)) capture=true;
00451 if(kingCapture2(k,DR,resMax)) capture=true;
00452 }
00453 board[k]=FREE;
00454 }
00455
00456 board[k-=direction]=KING2;
00457 if(kingCapture2(k,direction,resMax)) capture=true;
00458 board[k]=FREE;
00459
00460 if(!capture)
00461 for(;k!=i;k-=direction)
00462 {
00463 board[k]=KING2;
00464 turn(resMax,true);
00465 board[k]=FREE;
00466 }
00467
00468 resMax++;
00469 board[i]=save;
00470 board[from]=KING2;
00471 return true;
00472 }
00473 }
00474 return false;
00475 }
00476