00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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));
00037 }
00038
00039
00041
00042
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
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