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

echeckers.cpp

Go to the documentation of this file.
00001 //
00002 // English Checkers
00003 
00004 
00005 #include "echeckers.h"
00006 
00007 
00009 //
00010 //  User Functions
00011 //
00013 
00014 
00015 bool ECheckers::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         return false;
00028       case KING1:
00029         if(kingCapture1(from,UL,capture)) return true;
00030         if(kingCapture1(from,UR,capture)) return true;
00031         if(kingCapture1(from,DL,capture)) return true;
00032         if(kingCapture1(from,DR,capture)) return true;
00033         return false;
00034     }
00035   }
00036   else
00037   {
00038     switch(board[from])
00039     {
00040       case MAN1:
00041         if((to==(from-6))||(to==(from-5)))
00042         {
00043           board[from]=FREE;
00044           if(to<10) board[to]=KING1;
00045           else board[to]=MAN1;
00046           return true;
00047         }
00048         return false;
00049       case KING1:
00050         if((to==(from-6))||(to==(from-5))||
00051            (to==(from+5))||(to==(from+6)) )
00052         {
00053           board[from]=FREE;
00054           board[to]=KING1;
00055           return true;
00056         }
00057         return false;
00058     }
00059   }
00060   return false;
00061 }
00062 
00063 
00064 bool ECheckers::checkCapture1()
00065 {
00066   for(int i=6;i<48;i++)
00067   {
00068     switch(board[i])
00069     {
00070       case MAN1:
00071         if(board[i-6]==MAN2 || board[i-6]==KING2)
00072           if(board[i-12]==FREE) return true;
00073         if(board[i-5]==MAN2 || board[i-5]==KING2)
00074           if(board[i-10]==FREE) return true;
00075         break;
00076       case KING1:
00077         if(board[i-6]==MAN2 || board[i-6]==KING2)
00078           if(board[i-12]==FREE) return true;
00079         if(board[i-5]==MAN2 || board[i-5]==KING2)
00080           if(board[i-10]==FREE) return true;
00081         if(board[i+5]==MAN2 || board[i+5]==KING2)
00082           if(board[i+10]==FREE) return true;
00083         if(board[i+6]==MAN2 || board[i+6]==KING2)
00084           if(board[i+12]==FREE) return true;
00085     }
00086   }
00087   return false;
00088 }
00089 
00090 
00091 // Return TRUE if a course of the user true
00092 // Return FALSE if a course of the user incorrect
00093 
00094 bool ECheckers::manCapture1(int from,int direction,bool &capture)
00095 {
00096   int i=from+direction;
00097   if(board[i]==MAN2 || board[i]==KING2)
00098   {
00099     int k=i+direction;
00100     if(board[k]==FREE)
00101     {
00102       bool next=false;
00103       int save=board[i];
00104       board[from]=FREE;
00105       board[i]=NONE;
00106 
00107       if(k<10)
00108       {
00109         board[k]=KING1;
00110         if(kingCapture1(k,direction+11,next)) {board[i]=FREE;return true;}
00111       }
00112       else
00113       {
00114         board[k]=MAN1;
00115         if(manCapture1(k,UL,next)) {board[i]=FREE;return true;}
00116         if(manCapture1(k,UR,next)) {board[i]=FREE;return true;}
00117       }
00118 
00119       if((!next) && k==to) {board[i]=FREE;return true;}
00120 
00121       board[k]=FREE;
00122       board[i]=save;
00123       board[from]=MAN1;
00124       capture=true;
00125     }
00126   }
00127   return false;
00128 }
00129 
00130 
00131 bool ECheckers::kingCapture1(int from,int direction,bool &capture)
00132 {
00133   int i=from+direction;
00134   if(board[i]==MAN2 || board[i]==KING2)
00135   {
00136     int k=i+direction;
00137     if(board[k]==FREE)
00138     {
00139       bool next=false;
00140       int save=board[i];
00141       board[from]=FREE;
00142       board[i]=NONE;
00143       board[k]=KING1;
00144 
00145       if(direction==UL || direction==DR)
00146       {
00147         if(kingCapture1(k,UR,next)) {board[i]=FREE;return true;}
00148         if(kingCapture1(k,DL,next)) {board[i]=FREE;return true;}
00149       }
00150       else
00151       {
00152         if(kingCapture1(k,UL,next)) {board[i]=FREE;return true;}
00153         if(kingCapture1(k,DR,next)) {board[i]=FREE;return true;}
00154       }
00155       if(kingCapture1(k,direction,next)) {board[i]=FREE;return true;}
00156 
00157       if((!next) && k==to) {board[i]=FREE;return true;}
00158 
00159       board[k]=FREE;
00160       board[i]=save;
00161       board[from]=KING1;
00162       capture=true;
00163     }
00164   }
00165   return false;
00166 }
00167 
00168 
00170 //
00171 // Computer Functions
00172 //
00174 
00175 
00176 void ECheckers::kingMove2(int from,int &resMax)
00177 {
00178   board[from]=FREE;
00179 
00180   int i=from-6;
00181   if(board[i]==FREE)
00182   {
00183     board[i]=KING2;
00184     turn(resMax);
00185     board[i]=FREE;
00186   }
00187 
00188   i=from-5;
00189   if(board[i]==FREE)
00190   {
00191     board[i]=KING2;
00192     turn(resMax);
00193     board[i]=FREE;
00194   }
00195 
00196   i=from+5;
00197   if(board[i]==FREE)
00198   {
00199     board[i]=KING2;
00200     turn(resMax);
00201     board[i]=FREE;
00202   }
00203 
00204   i=from+6;
00205   if(board[i]==FREE)
00206   {
00207     board[i]=KING2;
00208     turn(resMax);
00209     board[i]=FREE;
00210   }
00211 
00212   board[from]=KING2;
00213 }
00214 
00215 
00216 bool ECheckers::checkCapture2()
00217 {
00218   for(int i=6;i<48;i++)
00219   {
00220     switch(board[i])
00221     {
00222       case MAN2:
00223         if(board[i+5]==MAN1 || board[i+5]==KING1)
00224           if(board[i+10]==FREE) return true;
00225         if(board[i+6]==MAN1 || board[i+6]==KING1)
00226           if(board[i+12]==FREE) return true;
00227         break;
00228       case KING2:
00229         if(board[i-6]==MAN1 || board[i-6]==KING1)
00230           if(board[i-12]==FREE) return true;
00231         if(board[i-5]==MAN1 || board[i-5]==KING1)
00232           if(board[i-10]==FREE) return true;
00233         if(board[i+5]==MAN1 || board[i+5]==KING1)
00234           if(board[i+10]==FREE) return true;
00235         if(board[i+6]==MAN1 || board[i+6]==KING1)
00236           if(board[i+12]==FREE) return true;
00237     }
00238   }
00239   return false;
00240 }
00241 
00242 
00243 // Return TRUE if it is possible to capture
00244 // Return FALSE if it is impossible to capture
00245 
00246 bool ECheckers::manCapture2(int from,int &resMax)
00247 {
00248   bool capture=false;
00249 
00250   int i=from+5;
00251   if(board[i]==MAN1 || board[i]==KING1)
00252   {
00253     int k=from+10;
00254     if(board[k]==FREE)
00255     {
00256       int save=board[i];
00257       board[from]=FREE;
00258       board[i]=NONE;
00259       resMax--;
00260       if(from>32)
00261       {
00262         board[k]=KING2;
00263         if(!kingCapture2(k,UL,resMax)) turn(resMax,true);
00264       }
00265       else
00266       {
00267         board[k]=MAN2;
00268         if(!manCapture2(k,resMax)) turn(resMax,true);
00269       }
00270       resMax++;
00271       board[k]=FREE;
00272       board[i]=save;
00273       board[from]=MAN2;
00274       capture=true;
00275     }
00276   }
00277 
00278   i=from+6;
00279   if(board[i]==MAN1 || board[i]==KING1)
00280   {
00281     int k=from+12;
00282     if(board[k]==FREE)
00283     {
00284       int save=board[i];
00285       board[from]=FREE;
00286       board[i]=NONE;
00287       resMax--;
00288       if(from>32)
00289       {
00290         board[k]=KING2;
00291         if(!kingCapture2(k,UR,resMax)) turn(resMax,true);
00292       }
00293       else
00294       {
00295         board[k]=MAN2;
00296         if(!manCapture2(k,resMax)) turn(resMax,true);
00297       }
00298       resMax++;
00299       board[k]=FREE;
00300       board[i]=save;
00301       board[from]=MAN2;
00302       capture=true;
00303     }
00304   }
00305 
00306   if(capture) return true;
00307   return false;
00308 }
00309 
00310 
00311 bool ECheckers::kingCapture2(int from,int direction,int &resMax)
00312 {
00313   int i=from+direction;
00314   if(board[i]==MAN1 || board[i]==KING1)
00315   {
00316     int k=i+direction;
00317     if(board[k]==FREE)
00318     {
00319       bool capture=false;
00320       int save=board[i];
00321       board[from]=FREE;
00322       board[i]=NONE;
00323       resMax--;
00324 
00325       board[k]=KING2;
00326       if(direction==UL || direction==DR)
00327       {
00328         if(kingCapture2(k,UR,resMax)) capture=true;
00329         if(kingCapture2(k,DL,resMax)) capture=true;
00330       }
00331       else
00332       {
00333         if(kingCapture2(k,UL,resMax)) capture=true;
00334         if(kingCapture2(k,DR,resMax)) capture=true;
00335       }
00336       if(kingCapture2(k,direction,resMax)) capture=true;
00337 
00338       if(!capture) turn(resMax,true);
00339       board[k]=FREE;
00340 
00341       resMax++;
00342       board[i]=save;
00343       board[from]=KING2;
00344       return true;
00345     }
00346   }
00347   return false;
00348 }
00349 

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