두 번째로 99번째에 6렙이면 강화를 누르는게 맞는 전략인가? 등을 검증하기 위하여 만들어보았습니다.
- 현재 보상과 강화를 클릭 할 시 기대보상을 계산하여 출력해줍니다.
- 보상받는것과 강화누르는것 중 유리한 곳에 초록색을 칠해줍니다.
- 조각,기운,경쿠 기준으로 선택하여 볼 수 있습니다.
자바스크립트버전은 공개된 html에 들어있슴다.
constexpr int DAJO = 0; //가중치 1
constexpr int GIUN = 1; //가중치 4 / 100
constexpr int CUPON = 2; // 가중치 20
struct RateInfo
{
float stayRate; // 유지확률
float upRate; // 등급상승확률
float downRate; // 등급하락확률
float runRate; // 도망확률
};
vector<float> rewards;
vector<RateInfo> RateInfos;
//dp[남은카운트][현재레벨] = 강화눌렀을시 보상기댓값(조각기준)
vector<vector<float>> dp;
void init()
{
rewards.resize(10);
rewards[0] = 0.f;
rewards[1] = 0.f;
rewards[2] = 1.f;
rewards[3] = 3.f;
rewards[4] = 6.f;
rewards[5] = 10.f;
rewards[6] = 15.f;
rewards[7] = 50.f;
rewards[8] = 150.f;
rewards[9] = 300.f;
RateInfos.resize(10);
//stay ,up ,down ,run
RateInfos[0] = { 1.f ,0.0f ,0.f ,0.f }; //destroyed;
RateInfos[1] = { 0.f ,1.0f ,0.f ,0.f };
RateInfos[2] = { 0.4f ,0.6f ,0.f ,0.f };
RateInfos[3] = { 0.f ,0.5f ,0.5f ,0.f };
RateInfos[4] = { 0.f ,0.4f ,0.6f ,0.f };
RateInfos[5] = { 0.f ,0.307f ,0.693f ,0.f };
RateInfos[6] = { 0.f ,0.205f ,0.765f ,0.03f };
RateInfos[7] = { 0.f ,0.103f ,0.857f ,0.04f };
RateInfos[8] = { 0.f ,0.05f ,0.9f ,0.05f };
RateInfos[9] = { 1.f ,0.f ,0.f ,0.f };
dp.resize(101, vector<float>(10));
//초항 (남은 횟수 없을때) 초기화
for (int lv = 0; lv < 10; ++lv)
{
dp[0][lv] = rewards[lv];
}
//dp 테이블 업데이트
for (int RemainCnt = 1; RemainCnt < 101; ++RemainCnt)
{
for (int Lv = 1; Lv < 9; ++Lv)
{
//유지경우
dp[RemainCnt][Lv] += (max(rewards[Lv], dp[RemainCnt - 1][Lv]) * RateInfos[Lv].stayRate);
//등급상승경우
dp[RemainCnt][Lv] += (max(rewards[Lv + 1], dp[RemainCnt - 1][Lv + 1]) * RateInfos[Lv].upRate);
//등급하락경우
dp[RemainCnt][Lv] += (max(rewards[Lv - 1], dp[RemainCnt - 1][Lv - 1]) * RateInfos[Lv].downRate);
//도망경우
dp[RemainCnt][Lv] += (rewards[0] * RateInfos[Lv].runRate);
}
dp[RemainCnt][9] = dp[RemainCnt - 1][9];
}
}
// _Mode
// DAJO = 0; //가중치 1
// GIUN = 1; //가중치 4 / 100
// CUPON = 2; // 가중치 20
float getExpectedReward(int _RemainCnt, int _CurLv, const int _Mode)
{
float ret = dp[_RemainCnt][_CurLv];
//기운기준
if (GIUN == _Mode)
{
return ret / 25.f;
}
//경쿠기준
if (CUPON == _Mode)
{
return ret * 20.f;
}
//디폴트 (다조기준)
return ret;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//출력용 테이블 초기화
init();
//인풋박스1과 인풋박스2로 몇번남았는지,현재레벨을 입력받은후 확률을 출력
//getExpectedReward(2,3,DAJO);
return 0;
}