private MoveMessageType getAppropriateMove(Board board, int playerID,
			Position playerPos) {
		PositionType forbiddenPos = board.getForbidden();
		MoveMessageType message = new MoveMessageType();

		Position treasurePos = board.getTreasurePos();
		if (treasurePos == null) {
			// Treasure on shift card

			Map<MoveMessageType, Board> moveMap = null;

			outer: for (Position probeShiftPos : Board.SHIFTPOSITIONS) {
				if (probeShiftPos.equals(forbiddenPos))
					continue;

				moveMap = getAppropriateMoveAfterShift(board, playerID,
						probeShiftPos, probeShiftPos, false);

				if (moveMap.size() > 0) {
					int randIndex = rand.nextInt(moveMap.size());
					int i = 0;
					for (MoveMessageType moveEntry : moveMap.keySet()) {
						if (randIndex == i) {
							message = moveEntry;
							break outer;
						}
						i++;
					}
				}
			}
		} else {
			message = getAppropriateRadiusMove(board, playerID, playerPos,
					board.getTreasurePos(), 0, 6);
		}

		if (message.getShiftPosition() == null) {
			Position shiftPos = null;
			Position shiftedPlayerPos = null;

			int index;
			int side;
			do {
				index = 2 * rand.nextInt(3) + 1; // ->1,3,5
				side = rand.nextInt(4); // ->0,1,2,3

				shiftPos = Position.getValidShiftPos(index, side);
				shiftedPlayerPos = playerPos.getPinPositionAfterShift(shiftPos);
			} while (shiftPos.equals(forbiddenPos));

			message.setShiftPosition(shiftPos);
			message.setNewPinPos(shiftedPlayerPos);
			message.setShiftCard(board.getShiftCard());
		}

		return message;
	}