int monte_carlo_player::findValue(GameState* game_state, Player* p, pair<int,int> roll){
	GameState* monteCarloState = new GameState();
	*monteCarloState->player1 = *game_state->player1;
	*monteCarloState->player2 = *p;
	monteCarloState->deadCols = game_state->deadCols;
	int value = 0;

	if (monteCarloState->validatePair(roll.first, roll.second, monteCarloState->player2)) {
		monteCarloState->player2->chooseDice(roll);
		monteCarloState->player2->checkForWin();
		monteCarloState->checkForDeadCols();


		if (monteCarloState->player2->stateReference[roll.first - 2] == monteCarloState->filledCols[roll.first - 2] ||
			monteCarloState->player2->stateReference[roll.second - 2] == monteCarloState->filledCols[roll.second - 2]){
				if (monteCarloState->player2->claimedCols.size() >= 3) {
					value += 5;
				}else{
					value += 1;
				}
			}else{
				value += 0;
			}
			delete monteCarloState;
			return value;
		}else if (monteCarloState->validatePair(roll.first, monteCarloState->player2)) {
			// Simulate making the move
			monteCarloState->player2->chooseDice(roll);
			monteCarloState->player2->checkForWin();
			monteCarloState->checkForDeadCols();

			for (int i = 0; i < monteCarloState->player2->stateReference.size(); i++) {
				value += monteCarloState->player2->stateReference[i] - monteCarloState->player2->state[i];
			}

			if (monteCarloState->player2->stateReference[roll.first - 2] == monteCarloState->filledCols[roll.first - 2]){
				if (monteCarloState->player2->claimedCols.size() >= 3) {
					value += 5;
				}else{
					value += 1;
				}
			}else{
				value += 0;
			}
			delete monteCarloState;
			return value;
		} else{ //No valid pair
				for (int i = 0; i < monteCarloState->player2->stateReference.size(); i++) {
					value -= monteCarloState->player2->stateReference[i] - monteCarloState->player2->state[i];
				}
				delete monteCarloState;
				return -1;
		}
}