00001
00002
00003
00004
00005 #include "echeckers.h"
00006
00007
00009
00010
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
00092
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
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
00244
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