[스팀몬스터] rule 별 사용가능한 카드 찾아보기

avatar

스몬에서는 게임의 재미를 올리기 위하여 ruleset이라는 게임 조건이 있습니다. ruleset에 따라서 능력이 제한되기도 하고, 심지어는 사용할 수 없는 카드도 있습니다. 공홈에서 게임을 하는 경우에는 화면에 보이는 카드 중 선택을 하면 되기 때문에 큰 문제는 없지만 자동으로 팀을 만들기 위해서는 사용할 수 있는 카드에 대한 정보가 아주 중요합니다. 만약 사용할 수 없는 카드를 사용하는 경우에는 실격패를 당하기 때문입니다.

rule을 잘 읽어보고 조건에 맞는 카드를 고를 수도 있겠지만, 조금 색다른 방법으로 접근을 해 보았습니다.

요즘 인기있는 AI는 딥러닝이라하는 심층망을 사용하는데요. 여기에서 가장 중요한 것은 데이터입니다. 좋은 데이터만 많으면 원하는 결과를 얻을 수 있다는 접근법입니다.

그래서 rule 별로 사용가능한 카드도 규칙을 만들지 않고, 데이터를 기반으로 뽑아내는 방법을 시도해보았습니다.

우선 데이터를 확보해야합니다.

https://kr.peakmonsters.com/에 가보면 '베틀체인' 메뉴가 있습니다. 여기에 가 보면 최근 게임 내용을 볼 수 있는데요. 최근 게임 내용을 볼 수 있는 API를 찾아보겠습니다.

이번 수능 점수 유출과 관련된 내용이기도 합니다. 웹페이지의 소스를 모두 볼 수 있기 때문에 본인이 원하는 결과를 가져올 수도 있습니다.

개발자 모드에서 접속을 해보니 아래와 같이 어떤 api를 이용하였는지 확인이 가능합니다.

링크가 아래와 같습니다. from_block 값을 적절히 바꾸면 과거 데이터도 모두 확인이 가능합니다.

https://api.steemmonsters.io/transactions/history?from_block=-1&limit=100&types=sm_battle

이 API를 바탕으로 ruleset 별로 사용한 카드를 뽑아내는 파이썬 프로그램을 만들어 보았습니다.

# rules에 해당 rule 별 monster를 추가
def add_monsters(rules, rule, info) :
    info = remove_chicken(info)
    if rule not in rules :
        rules[rule] = []

    mon_len = len(info['monsters'])
    for i in range(0, mon_len) :
        id = info['monsters'][i]['id']
        if id in rules[rule] :
            continue
        rules[rule].append(id)
    return rules

def gather_ruleset_monsters_from_online() :
    out_name = "monster_rule_set.txt"
    rules = load_json_from_file(out_name)

    cmd = "transactions/history?from_block=38780663&limit=1000&types=sm_battle"
    battles = get_data_from_sm(cmd, 1)

    for battle in battles :
        results = json.loads(battle['result'])
        if 1 :
            id = results['id']
            mana = results['mana_cap']
            rule = results['ruleset']
            details = results['details']
            block_num = battle['block_num']

            if 'type' in details :
                continue

            team1 = convert_battle_info(details['team1'])
            team2 = convert_battle_info(details['team2'])

            if rule.find('|') >= 0 : # | 가 있으면 
                e_rule = rule.split('|')
                add_monsters(rules, e_rule[0], team1)
                add_monsters(rules, e_rule[0], team2)
                rule = e_rule[1]
            
            rules = add_monsters(rules, rule, team1)
            rules = add_monsters(rules, rule, team2)

    save_to_file_json(out_name, rules)

gather_ruleset_monsters_from_online()

이 프로그램에서는 최근 1000개의 대전에서 rule 별로 사용한 카드의 id를 저장합니다.

잘 저장되었는지 확인을 해 봐야겠지요. rule과 color를 입력을 주면 해당하는 rule과 splinter에서 사용가능한 카드에 대한 정보를 출력해줍니다.

def print_ruleset_data(given="all", color="all") :
    out_name = "monster_rule_set.txt"
    rules = load_json_from_file(out_name)

    cards = []
    for rule in rules :
        if given != 'all' :
            if given.find(rule) == -1:
                continue

        for card in rules[rule] :
            str_id = str(card)
            if color == 'all' or color == CARD_ID_NAME[str_id][3] or 'Gray' == CARD_ID_NAME[str_id][3]:
                # ["Spineback Turtle",1,4,"Blue"]
                cards.append([CARD_ID_NAME[str_id][3], card, CARD_ID_NAME[str_id][0], CARD_ID_NAME[str_id][2]])


        scards = sorted(cards, key = lambda x: (x[0], x[2]), reverse=False)  # 0번째가 key 
        print(rule)
        for card in scards :
            print(card)
        print('total cnt:', len(scards))
        return scards

print_ruleset_data("Taking Sides", 'White')

확인을 해보니 많이 부족합니다. 1000 판으로는 부족하군요. 그래서
api의 from_block 값을 감소시키면서 좀 더 돌려봅니다. 약 1만 게임정도 다운받으면서 update를 한 결과입니다.

베타 카드를 이용한 게임은 많기 때문에 스몬에서 확인한 카드와 정확하게 일치합니다. 다만 새로 나온 untamed 카드의 경우에는 몇 장이 빠졌군요.

자동프로그램에서 untamed까지는 사용할 필요가 없으니, 팀 구성을 위한 기본 작업은 마무리를 한 것 같습니다.

이제 남은 것은 이길 수 있는 팀 구성을 만드는 것입니다. 이것도 데이터의 도움을 받아야겠죠. 데이터는 있지만 카드가 없으면 문제가 생깁니다. 따라서 만랩인 계정은 문제가 없겠지만 그렇지 않은 계정은 또다른 작업이 필요합니다.

해야할 일이 끝이 없군요. 언제 마무리할 수 있을지....



0
0
0.000
3 comments
avatar

오오~~ 이 방법 저도 생각하고만 있었는데...

제가 카드가 없는게 많다보니 덱을 일일이 짜야 하나 싶다가.. 그냥 대전정보에서 제가 가지고 있는 카드를 사용한 전투 정보만을 뽑아내면 될것 같다는 생각을 했었거든요.

그나저나 다시 코딩 좀 해야 하는데... 요즘 너무 건강만 생각하고 있네요 ㅎㅎㅎ

파이팅!!!

0
0
0.000
avatar

naha님이 tradingideas님의 이 포스팅에 따봉(7 SCT)을 하였습니다.

0
0
0.000