protected int alphabetaCardPicking(GameState state, 
			ArrayList<Color> playerList, ArrayList<Card> choiceList, int alpha, int beta, Color faction)
	{
		
		//Base case, if there aren't any more players we go to the first action
		if(playerList.size() == 0)
		{
			GameState tempState = new GameState(state);
			for(Card c : choiceList)
			{
				tempState.getPlayer(c.getFaction()).removeFromHand(c);
				tempState.getBoard().addCard(c);
			}
			
			tempState.setTime(Time.DAY);
			
			return alphabeta(tempState, alpha, beta, faction);
		}
		else
		{
			//otherwise, we iterate through all the possibilities of a given player's card choices
			Color pColor = playerList.remove(0);
			if(faction.equals(pColor))
			{
				for(Card c : state.getPlayer(pColor).getHand())
				{
					ArrayList<Card> tempChoice = new ArrayList<Card>(choiceList);
					tempChoice.add(c);
					
					alpha = Math.max(alpha, alphabetaCardPicking(state, new ArrayList<Color>(playerList), 
							tempChoice, alpha, beta, 
							faction));
					
					if(alpha >= beta)
						return alpha;
				}
				//we also need to check if they have no cards in their hand
				if(state.getPlayer(pColor).getHand().isEmpty())
				{
					alpha = Math.max(alpha, alphabetaCardPicking(state, new ArrayList<Color>(playerList), 
							new ArrayList<Card>(choiceList), alpha, beta, 
							faction));
				}
				return alpha;
			}
			else
			{
				for(Card c : state.getPlayer(pColor).getHand())
				{
					ArrayList<Card> tempChoice = new ArrayList<Card>(choiceList);
					tempChoice.add(c);
					
					beta = Math.min(beta, alphabetaCardPicking(state, 
							new ArrayList<Color>(playerList), tempChoice, alpha, beta,
							faction));
					if(alpha >= beta)
						return beta;
				}
				if(state.getPlayer(pColor).getHand().isEmpty())
				{
					beta = Math.min(beta, alphabetaCardPicking(state, new ArrayList<Color>(playerList), 
							new ArrayList<Card>(choiceList), alpha, beta, 
							faction));
				}
				return beta;
			}
			
		}
	}