Move IntermediateStrategyInfo::getMove(GameState state) {
// This strategy attempts to leave a state with two nonempty
// piles that are the same size
if (allNonEmpty(state))
if (allDifferent(state))
return StrategyInfo::getMove(state); // Default to simple strategy
else {
return removePile(theDifferentPile(state), state);
}
else if (oneNonEmpty(state)) {
return removePile(theDifferentPile(state), state);
}
else { // Two must be nonempty
if (allDifferent(state)) {
return evenPiles(state);
}
else { // Two equal piles so you've lost
return StrategyInfo::getMove(state); // Default to simple strategy
}
}}
Move IntermediateStrategyInfo::removePile(int pile, GameState state) {
int coins = (pile == 1) ? state->getPile1() :
(pile == 2) ? state->getPile2() : state->getPile3();
return new MoveInfo(coins, pile);
}
Move IntermediateStrategyInfo::evenPiles(GameState state) { // There are two unequal piles left
int pile1 = state->getPile1();
int pile2 = state->getPile2();
int pile3 = state->getPile3();
if (pile1 == 0)
if (pile2 < pile3)
return new MoveInfo(pile3 - pile2, 3);
else
return new MoveInfo(pile2 - pile3, 2);
else if (pile2 == 0)
if (pile1 < pile3)
return new MoveInfo(pile3 - pile1, 3);
else
return new MoveInfo(pile1 - pile3, 1);
else // pile 3 must be empty
if (pile1 < pile2)
return new MoveInfo(pile2 - pile1, 2);
else
return new MoveInfo(pile1 - pile2, 1);
}
bool IntermediateStrategyInfo::allNonEmpty(GameState state) {
return state->getPile1() != 0 &&
state->getPile2() != 0 &&
state->getPile3() != 0;
}
bool IntermediateStrategyInfo::oneNonEmpty(GameState state) {
return (state->getPile1() != 0 && state->getPile2() == 0 && state->getPile3() == 0) ||
(state->getPile1() == 0 && state->getPile2() != 0 && state->getPile3() == 0) ||
(state->getPile1() == 0 && state->getPile2() == 0 && state->getPile3() != 0);
}
bool IntermediateStrategyInfo::allDifferent(GameState state) {
return state->getPile1() != state->getPile2() &&
state->getPile2() != state->getPile3() &&
state->getPile3() != state->getPile1();
}
int IntermediateStrategyInfo::theDifferentPile(GameState state) { // Assumes one pile is
if (state->getPile1() == state->getPile2()) // different than the others
return 3;
else if (state->getPile2() == state->getPile3())
return 1;
else
return 2;
}
|