Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

rcheckers.cpp

Go to the documentation of this file.
00001 //
00002 // Russian Checkers
00003 
00004 
00005 #include "rcheckers.h"
00006 
00007 
00009 //
00010 //  User Functions
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 // Return TRUE if a course of the user true
00143 // Return FALSE if a course of the user incorrect
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 // Computer Functions
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 // Return TRUE if it is possible to capture
00317 // Return FALSE if it is impossible to capture
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 

Generated on Sat Nov 5 16:17:20 2005 for OPIE by  doxygen 1.4.2