previous | index | next

Defining the IntermediateStrategyInfo Class Members

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;
}

previous | index | next