// // KCheckers Engine // // Board = 54 Fields: // // | 06 07 08 09| MAN2 // |11 12 13 14 | // | 17 18 19 20| // |22 23 24 25 | // | 28 29 30 31| // |33 34 35 36 | // | 39 40 41 42| // |44 45 46 47 | MAN1 #include #include #include "checkers.h" Checkers::Checkers(int skill) { for(int i=0;i<54;i++) board[i]=NONE; board[6] =MAN2; board[7] =MAN2; board[8] =MAN2; board[9] =MAN2; board[11]=MAN2; board[12]=MAN2; board[13]=MAN2; board[14]=MAN2; board[17]=MAN2; board[18]=MAN2; board[19]=MAN2; board[20]=MAN2; board[22]=FREE; board[23]=FREE; board[24]=FREE; board[25]=FREE; board[28]=FREE; board[29]=FREE; board[30]=FREE; board[31]=FREE; board[33]=MAN1; board[34]=MAN1; board[35]=MAN1; board[36]=MAN1; board[39]=MAN1; board[40]=MAN1; board[41]=MAN1; board[42]=MAN1; board[44]=MAN1; board[45]=MAN1; board[46]=MAN1; board[47]=MAN1; levelmax=skill; srand(time(0)); // Seed the random number generator } /////////////////////////////////////////////////// // // User Functions // /////////////////////////////////////////////////// bool Checkers::checkMove1() { for(int i=6;i<48;i++) { switch(board[i]) { case MAN1: if(board[i-6]==FREE) return true; if(board[i-5]==FREE) return true; break; case KING1: if(board[i-6]==FREE) return true; if(board[i-5]==FREE) return true; if(board[i+5]==FREE) return true; if(board[i+6]==FREE) return true; } } return false; } //////////////////////////////////////////////////// // // Computer Functions // //////////////////////////////////////////////////// void Checkers::go2() { level=0; for(int i=6;i<48;i++) bestboard[i]=board[i]; turn(); for(int i=6;i<48;i++) board[i]=bestboard[i]; ; } void Checkers::turn(int &resMax,bool capture) { if(levelresMax) { resMax=res; if(level==1) { for(int i=6;i<48;i++) bestboard[i]=board[i]; bestcounter=1; } } else if(res==resMax && level==1) { bestcounter++; if((rand()%bestcounter)==0) { for(int i=6;i<48;i++) bestboard[i]=board[i]; } } if(capture) { if(f12) board[12]=NONE; if(f13) board[13]=NONE; if(f14) board[14]=NONE; if(f17) board[17]=NONE; if(f18) board[18]=NONE; if(f19) board[19]=NONE; if(f23) board[23]=NONE; if(f24) board[24]=NONE; if(f25) board[25]=NONE; if(f28) board[28]=NONE; if(f29) board[29]=NONE; if(f30) board[30]=NONE; if(f34) board[34]=NONE; if(f35) board[35]=NONE; if(f36) board[36]=NONE; if(f39) board[39]=NONE; if(f40) board[40]=NONE; if(f41) board[41]=NONE; } } else if(resMax<0) resMax=0; } bool Checkers::checkMove2() { for(int i=6;i<48;i++) { switch(board[i]) { case MAN2: if(board[i+5]==FREE) return true; if(board[i+6]==FREE) return true; break; case KING2: if(board[i-6]==FREE) return true; if(board[i-5]==FREE) return true; if(board[i+5]==FREE) return true; if(board[i+6]==FREE) return true; } } return false; } int Checkers::turn() { int resMax=(level-levelmax)*10; level++; if(checkCapture2()) { for(int i=6;i<48;i++) { switch(board[i]) { case MAN2: manCapture2(i,resMax); break; case KING2: kingCapture2(i,UL,resMax); kingCapture2(i,UR,resMax); kingCapture2(i,DL,resMax); kingCapture2(i,DR,resMax); } } } else if(checkMove2()) { for(int i=6;i<48;i++) { switch(board[i]) { case MAN2: if(board[i+5]==FREE) { board[i]=FREE; if(i>38) board[i+5]=KING2; else board[i+5]=MAN2; turn(resMax); board[i+5]=FREE; board[i]=MAN2; } if(board[i+6]==FREE) { board[i]=FREE; if(i>38) board[i+6]=KING2; else board[i+6]=MAN2; turn(resMax); board[i+6]=FREE; board[i]=MAN2; } break; case KING2: kingMove2(i,resMax); break; } } } else ; level--; return resMax; }