전장 - 레벨업과 기물

하스스톤 전장이란?

하수인 종족과 레벨

  • 하수인은 레벨과 종족값을 가집니다.
  • 종족값은 (멀록, 야수, 용, 기계, 악마, 해적, 정령, 가시멧돼지, 중립) 중 하나입니다.
  • 하수인 레벨에 따라 하수인 기물의 수는 (1성-18장, 2장-15장, 3성-13장, 4성-11장, 5성-9장, 6성-6장) 입니다.

레벨 업(선술집 강화)

  • 선술집 단계 이하의 하수인이 상점에 등장합니다.
    • 만약 선술집 단계가 3단계면 1성,2성,3성 하수인이 등장합니다.

새로고침(리롤)

  • 새로고침 시 상점에 있던 모든 하수인이 새로운 하수인으로 변경됩니다.

상세 조건

  • 현재 10골드를 가지고 있으며, 선술집 강화 비용은 0원이라고 가정합니다.
  • 선술집 레벨은 1~6까지 있으며, 선술집 레벨에 따라 상점에 나타나는 하수인의 수는 (1성-3마리, 2성-4마리, 3성-4마리, 4성-5마리, 5성-5마리, 6성-6마리) 입니다.
  • 하수인 레벨에 따라 하수인 기물의 수는 (1성-18장, 2장-15장, 3성-13장, 4성-11장, 5성-9장, 6성-6장) 입니다.
  • 아무도 기물을 사지 않았다고 가정합니다.
  • 게임이 시작될 때 '중립'을 제외한 무작위 3가지 종족을 선택, 해당 종족의 하수인은 이번 게임에서 등장하지 않습니다.
  • 종족세트에 포함되는 중립카드는 고려하지 않습니다.
  • 상점에 동시에 나타나는 하수인은 비복원실행으로 나온다고 가정합니다.
  • 각 종족의 레벨별 서로다른 기물의 종류는 다음과 같습니다.

    멀록 = {1성:2개, 2성:3개, 3성:3개, 4성:1개, 5성:2개, 6성:1개}
    야수 = {1성:2개, 2성:3개, 3성:2개, 4성:2개, 5성:4개, 6성:4개}
    용 = {1성:2개, 2성:1개, 3성:3개, 4성:4개, 5성:2개, 6성:2개}
    기계 = {1성:2개, 2성:3개, 3성:3개, 4성:4개, 5성:1개, 6성:3개}
    악마 = {1성:2개, 2성:2개, 3성:2개, 4성:2개, 5성:3개, 6성:3개}
    해적 = {1성:2개, 2성:3개, 3성:3개, 4성:3개, 5성:2개, 6성:3개}
    정령 = {1성:2개, 2성:2개, 3성:3개, 4성:3개, 5성:1개, 6성:3개}
    가시멧돼지 = {1성:2개, 2성:2개, 3성:4개, 4성:4개, 5성:1개, 6성:3개}
    중립 = {1성:2개, 2성:7개, 3성:6개, 4성:6개, 5성:9개, 6성:4개}

문제 정의

레벨업을 하기 전과 후 N성짜리 기물이 등장할 확률의 차이는?

murloc = {1:2, 2:3, 3:3, 4:1, 5:2, 6:1}
beast = {1:2, 2:3, 3:2, 4:2, 5:4, 6:4}
dragon = {1:2, 2:1, 3:3, 4:4, 5:2, 6:2}
machine = {1:2, 2:3, 3:3, 4:4, 5:1, 6:3}
demon = {1:2, 2:2, 3:2, 4:2, 5:3, 6:3}
pirate = {1:2, 2:3, 3:3, 4:3, 5:2, 6:3}
elemental = {1:2, 2:2, 3:3, 4:3, 5:1, 6:3}
quilboar = {1:2, 2:2, 3:4, 4:4, 5:1, 6:3}
neutral = {1:2, 2:7, 3:6, 4:6, 5:9, 6:4}



ban_lst = ['murloc','beast','dragon','machine','demon','pirate','elemental','quilboar']
import random
#8개의 종족 중 3개를 제외합니다
now_card = random.sample(ban_lst,5)#비복원추출

#중립카드는 반드시 사용되기 때문에 중립카드를 기준으로
deck = neutral.copy()
#이번게임에서 사용되는 종족의 카드들을 추가합니다
for name in now_card:
    cnt=1
    for v in eval(name).values():#eval을 써서 문자열을 변수로 가져옵니다
        deck[cnt] += v
        cnt+=1


# 기물의 종류에 기물의 수를 곱합니다
how_many = {1:18,2:15,3:13,4:11,5:19,6:6}

cnt = 1
for v in how_many.values():
    deck[cnt] *= v
    cnt+=1
    
#레벨별로 상점에 몇 개의 하수인이 등장하는지를 나타냅니다    
shop_minion_variable = {1:3,2:4,3:4,4:5,5:5,6:6}

def func(shop_lv,want_minion_lv):
    if shop_lv<want_minion_lv: #상점의 레벨보다 높은 하수인이 등장할 수는 없습니다
        print("It doesn't exist")
        return False
    deno = 0
    for i in range(1,shop_lv+1):
        deno += deck[i] #상점 단계가 shop_lv일 때 나올 수 있는 모든 하수인의 수 입니다
    
    return (how_many[want_minion_lv] /deno )*shop_minion_variable[shop_lv] #(원하는 기물 / 나올 수 있는 기물) * 기물 등장 횟수

 

10번의 리롤을 했을 때 원하는 N성짜리 기물이 등장하지 않을 확률은?

def func2(shop_lv,want_minion_lv):
	return (1-func(shop_lv,want_minion_lv))**10
#print(func2(6,1)) #0.46~ 6레벨에 10원 리롤 해서 원하는 1성 기물을 발견하지 못할 확률은 46%
#print(func2(6,6)) #0.78~ 6레벨에 10원 리롤 해서 원하는 6성 기물을 발견하지 못할 확률은 78%

느낀점

  • 해당 게임을 모르는 사람에게 어떤 정보를 제공해야 할 지에 대한 고민이 많았다.
  • 상세 조건을 리스트업 하면서 실제 게임과 동일한 확률을 구하는 건(게임의 환경과 똑같이 구현하는 건) 어렵다.
  • 하스스톤 공식 홈페이지는 너무 구리다.

좋은 웹페이지 즐겨찾기