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