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

checkers.cpp

Go to the documentation of this file.
00001 //
00002 // KCheckers Engine
00003 
00004 //
00005 // Board = 54 Fields:
00006 //
00007 // |  06  07  08  09| MAN2
00008 // |11  12  13  14  |
00009 // |  17  18  19  20|
00010 // |22  23  24  25  |
00011 // |  28  29  30  31|
00012 // |33  34  35  36  |
00013 // |  39  40  41  42|
00014 // |44  45  46  47  | MAN1
00015 
00016 #include <time.h>
00017 #include <stdlib.h>
00018 
00019 #include "checkers.h"
00020 
00021 
00022 Checkers::Checkers(int skill)
00023 {
00024   for(int i=0;i<54;i++) board[i]=NONE;
00025   board[6] =MAN2; board[7] =MAN2; board[8] =MAN2; board[9] =MAN2;
00026   board[11]=MAN2; board[12]=MAN2; board[13]=MAN2; board[14]=MAN2;
00027   board[17]=MAN2; board[18]=MAN2; board[19]=MAN2; board[20]=MAN2;
00028   board[22]=FREE; board[23]=FREE; board[24]=FREE; board[25]=FREE;
00029   board[28]=FREE; board[29]=FREE; board[30]=FREE; board[31]=FREE;
00030   board[33]=MAN1; board[34]=MAN1; board[35]=MAN1; board[36]=MAN1;
00031   board[39]=MAN1; board[40]=MAN1; board[41]=MAN1; board[42]=MAN1;
00032   board[44]=MAN1; board[45]=MAN1; board[46]=MAN1; board[47]=MAN1;
00033 
00034   levelmax=skill;
00035 
00036   srand(time(0)); // Seed the random number generator
00037 }
00038 
00039 
00041 //
00042 //  User Functions
00043 //
00045 
00046 
00047 bool Checkers::checkMove1()
00048 {
00049   for(int i=6;i<48;i++)
00050   {
00051     switch(board[i])
00052     {
00053       case MAN1:
00054         if(board[i-6]==FREE) return true;
00055         if(board[i-5]==FREE) return true;
00056         break;
00057       case KING1:
00058         if(board[i-6]==FREE) return true;
00059         if(board[i-5]==FREE) return true;
00060         if(board[i+5]==FREE) return true;
00061         if(board[i+6]==FREE) return true;
00062     }
00063   }
00064   return false;
00065 }
00066 
00067 
00069 //
00070 // Computer Functions
00071 //
00073 
00074 
00075 void Checkers::go2()
00076 {
00077   level=0;
00078   for(int i=6;i<48;i++) bestboard[i]=board[i];
00079   turn();
00080   for(int i=6;i<48;i++) board[i]=bestboard[i];
00081   ;
00082 }
00083 
00084 
00085 void Checkers::turn(int &resMax,bool capture)
00086 {
00087   if(level<levelmax)
00088   {
00089     bool f12,f13,f14,f17,f18,f19,f23,f24,f25,f28,f29,f30,f34,f35,f36,f39,f40,f41;
00090     if(capture)
00091     {
00092       if(board[12]==NONE) {f12=true;board[12]=FREE;} else f12=false;
00093       if(board[13]==NONE) {f13=true;board[13]=FREE;} else f13=false;
00094       if(board[14]==NONE) {f14=true;board[14]=FREE;} else f14=false;
00095       if(board[17]==NONE) {f17=true;board[17]=FREE;} else f17=false;
00096       if(board[18]==NONE) {f18=true;board[18]=FREE;} else f18=false;
00097       if(board[19]==NONE) {f19=true;board[19]=FREE;} else f19=false;
00098       if(board[23]==NONE) {f23=true;board[23]=FREE;} else f23=false;
00099       if(board[24]==NONE) {f24=true;board[24]=FREE;} else f24=false;
00100       if(board[25]==NONE) {f25=true;board[25]=FREE;} else f25=false;
00101       if(board[28]==NONE) {f28=true;board[28]=FREE;} else f28=false;
00102       if(board[29]==NONE) {f29=true;board[29]=FREE;} else f29=false;
00103       if(board[30]==NONE) {f30=true;board[30]=FREE;} else f30=false;
00104       if(board[34]==NONE) {f34=true;board[34]=FREE;} else f34=false;
00105       if(board[35]==NONE) {f35=true;board[35]=FREE;} else f35=false;
00106       if(board[36]==NONE) {f36=true;board[36]=FREE;} else f36=false;
00107       if(board[39]==NONE) {f39=true;board[39]=FREE;} else f39=false;
00108       if(board[40]==NONE) {f40=true;board[40]=FREE;} else f40=false;
00109       if(board[41]==NONE) {f41=true;board[41]=FREE;} else f41=false;
00110     }
00111 
00112     int b6=board[6];
00113     int b7=board[7];
00114     int b8=board[8];
00115     int b9=board[9];
00116     int b11=board[11];
00117     int b12=board[12];
00118     int b13=board[13];
00119     int b14=board[14];
00120     int b17=board[17];
00121     int b18=board[18];
00122     int b19=board[19];
00123     int b20=board[20];
00124     int b22=board[22];
00125     int b23=board[23];
00126     int b24=board[24];
00127     int b25=board[25];
00128     int b28=board[28];
00129     int b29=board[29];
00130     int b30=board[30];
00131     int b31=board[31];
00132     int b33=board[33];
00133     int b34=board[34];
00134     int b35=board[35];
00135     int b36=board[36];
00136     int b39=board[39];
00137     int b40=board[40];
00138     int b41=board[41];
00139     int b42=board[42];
00140     int b44=board[44];
00141     int b45=board[45];
00142     int b46=board[46];
00143     int b47=board[47];
00144 
00145     board[6]=FULL-b47;
00146     board[7]=FULL-b46;
00147     board[8]=FULL-b45;
00148     board[9]=FULL-b44;
00149     board[11]=FULL-b42;
00150     board[12]=FULL-b41;
00151     board[13]=FULL-b40;
00152     board[14]=FULL-b39;
00153     board[17]=FULL-b36;
00154     board[18]=FULL-b35;
00155     board[19]=FULL-b34;
00156     board[20]=FULL-b33;
00157     board[22]=FULL-b31;
00158     board[23]=FULL-b30;
00159     board[24]=FULL-b29;
00160     board[25]=FULL-b28;
00161     board[28]=FULL-b25;
00162     board[29]=FULL-b24;
00163     board[30]=FULL-b23;
00164     board[31]=FULL-b22;
00165     board[33]=FULL-b20;
00166     board[34]=FULL-b19;
00167     board[35]=FULL-b18;
00168     board[36]=FULL-b17;
00169     board[39]=FULL-b14;
00170     board[40]=FULL-b13;
00171     board[41]=FULL-b12;
00172     board[42]=FULL-b11;
00173     board[44]=FULL-b9;
00174     board[45]=FULL-b8;
00175     board[46]=FULL-b7;
00176     board[47]=FULL-b6;
00177 
00178     int res=-turn();
00179 
00180     board[6]=b6;
00181     board[7]=b7;
00182     board[8]=b8;
00183     board[9]=b9;
00184     board[11]=b11;
00185     board[12]=b12;
00186     board[13]=b13;
00187     board[14]=b14;
00188     board[17]=b17;
00189     board[18]=b18;
00190     board[19]=b19;
00191     board[20]=b20;
00192     board[22]=b22;
00193     board[23]=b23;
00194     board[24]=b24;
00195     board[25]=b25;
00196     board[28]=b28;
00197     board[29]=b29;
00198     board[30]=b30;
00199     board[31]=b31;
00200     board[33]=b33;
00201     board[34]=b34;
00202     board[35]=b35;
00203     board[36]=b36;
00204     board[39]=b39;
00205     board[40]=b40;
00206     board[41]=b41;
00207     board[42]=b42;
00208     board[44]=b44;
00209     board[45]=b45;
00210     board[46]=b46;
00211     board[47]=b47;
00212 
00213     if(res>resMax)
00214     {
00215       resMax=res;
00216       if(level==1)
00217       {
00218         for(int i=6;i<48;i++) bestboard[i]=board[i];
00219         bestcounter=1;
00220       }
00221     }
00222     else if(res==resMax && level==1)
00223     {
00224       bestcounter++;
00225       if((rand()%bestcounter)==0)
00226       {
00227         for(int i=6;i<48;i++) bestboard[i]=board[i];
00228       }
00229     }
00230 
00231     if(capture)
00232     {
00233       if(f12) board[12]=NONE;
00234       if(f13) board[13]=NONE;
00235       if(f14) board[14]=NONE;
00236       if(f17) board[17]=NONE;
00237       if(f18) board[18]=NONE;
00238       if(f19) board[19]=NONE;
00239       if(f23) board[23]=NONE;
00240       if(f24) board[24]=NONE;
00241       if(f25) board[25]=NONE;
00242       if(f28) board[28]=NONE;
00243       if(f29) board[29]=NONE;
00244       if(f30) board[30]=NONE;
00245       if(f34) board[34]=NONE;
00246       if(f35) board[35]=NONE;
00247       if(f36) board[36]=NONE;
00248       if(f39) board[39]=NONE;
00249       if(f40) board[40]=NONE;
00250       if(f41) board[41]=NONE;
00251     }
00252   }
00253   else if(resMax<0) resMax=0;
00254 }
00255 
00256 
00257 bool Checkers::checkMove2()
00258 {
00259   for(int i=6;i<48;i++)
00260   {
00261     switch(board[i])
00262     {
00263       case MAN2:
00264         if(board[i+5]==FREE) return true;
00265         if(board[i+6]==FREE) return true;
00266         break;
00267       case KING2:
00268         if(board[i-6]==FREE) return true;
00269         if(board[i-5]==FREE) return true;
00270         if(board[i+5]==FREE) return true;
00271         if(board[i+6]==FREE) return true;
00272     }
00273   }
00274   return false;
00275 }
00276 
00277 
00278 int Checkers::turn()
00279 {
00280   int resMax=(level-levelmax)*10;
00281   level++;
00282   if(checkCapture2())
00283   {
00284     for(int i=6;i<48;i++)
00285     {
00286       switch(board[i])
00287       {
00288         case MAN2:
00289           manCapture2(i,resMax);
00290           break;
00291         case KING2:
00292           kingCapture2(i,UL,resMax);
00293           kingCapture2(i,UR,resMax);
00294           kingCapture2(i,DL,resMax);
00295           kingCapture2(i,DR,resMax);
00296       }
00297     }
00298   }
00299   else if(checkMove2())
00300   {
00301     for(int i=6;i<48;i++)
00302     {
00303       switch(board[i])
00304       {
00305         case MAN2:
00306           if(board[i+5]==FREE)
00307           {
00308             board[i]=FREE;
00309             if(i>38) board[i+5]=KING2;
00310             else board[i+5]=MAN2;
00311             turn(resMax);
00312             board[i+5]=FREE;
00313             board[i]=MAN2;
00314           }
00315           if(board[i+6]==FREE)
00316           {
00317             board[i]=FREE;
00318             if(i>38) board[i+6]=KING2;
00319             else board[i+6]=MAN2;
00320             turn(resMax);
00321             board[i+6]=FREE;
00322             board[i]=MAN2;
00323           }
00324           break;
00325         case KING2:
00326           kingMove2(i,resMax);
00327           break;
00328       }
00329     }
00330   }
00331   else ;
00332 
00333   level--;
00334   return resMax;
00335 }
00336 
00337 

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