bool MaximiseOwnMovementRule::applicable(Gameboard board, int player) { int max = -1; int x = qrand()%8; int y = qrand()%8; int xstart = x; int ystart = y; int xmax = -1; int ymax = -1; Gameboard testboard; do { do { testboard = board; if(testboard.play(x,y,player)) { int temp = 0; for(int newX = 0; newX < 8; ++newX) { for(int newY = 0; newY < 8; ++newY) { if(testboard.play(newX, newY,player,true)) { ++temp; } } } if(temp > max && (!canTakeCorner(testboard, opponent(player))) && (!canGetZeroDiscs(testboard,player))) { max = temp; xmax = x; ymax = y; } } y = (y+1)%8; }while(y != ystart); x = (x+1)%8; }while(x != xstart); if(max >= _borderMoves) { _x = xmax; _y = ymax; _asked = true; } else { _x = -1; _y = -1; _asked = false; } return _asked; }
bool MinimiseOpponentMovementRule::calculateMove(Gameboard board, int player) { int min = 100; int x = qrand()%8; int y = qrand()%8; int xstart = x; int ystart = y; int xmin = -1; int ymin = -1; int opponentPlayer = opponent(player); Gameboard testboard; do { do { testboard = board; if(testboard.play(x,y,player)) { int temp = 0; for(int opponentX = 0; opponentX < 8; ++opponentX) { for(int opponentY = 0; opponentY < 8; ++opponentY) { if(testboard.play(opponentX, opponentY,opponentPlayer,true)) { ++temp; } } } if(temp < min && (!canTakeCorner(testboard, opponent(player))) && (!canGetZeroDiscs(testboard,player))) { min = temp; xmin = x; ymin = y; } } y = (y+1)%8; }while(y != ystart); x = (x+1)%8; }while(x != xstart); if(min <= _borderMoves) { _x = xmin; _y = ymin; _asked = true; } else { _x = -1; _y = -1; _asked = false; } return _asked; }