友意白雑記帳

だいたい自分用の覚え書き

Gentei.py to simulate the drafts in MTG ARENA

#--- Code in Python 3.6.9 or after:
from __future__ import print_function
import random

num_iteration = 200 #--- Max. number of times to try.
num_games = 9 #--- Max. number of games per one trial.
win_prob = 0.55
gem_start = 20000
gem_cost_premi = 1500
gem_cost_quick =  750
gem_cost_seald = 2000
kind = "quick"
#kind = "premi"
#kind = "seald"


def gem_premi(wins):
    res = -gem_cost_premi
    res +=   50 if (wins==0) else 0
    res +=  100 if (wins==1) else 0
    res +=  200 if (wins==2) else 0
    res += 1000 if (wins==3) else 0
    res += 1400 if (wins==4) else 0
    res += 1600 if (wins==5) else 0
    res += 1800 if (wins==6) else 0
    res += 2200 if (wins==7) else 0
    return res


def gem_quick(wins):
    res = -gem_cost_quick
    res +=   50 if (wins==0) else 0
    res +=  100 if (wins==1) else 0
    res +=  200 if (wins==2) else 0
    res +=  300 if (wins==3) else 0
    res +=  450 if (wins==4) else 0
    res +=  650 if (wins==5) else 0
    res +=  850 if (wins==6) else 0
    res +=  950 if (wins==7) else 0
    return res


def gem_seald(wins):
    res = -gem_cost_seald
    res +=  200 if (wins==0) else 0
    res +=  400 if (wins==1) else 0
    res +=  600 if (wins==2) else 0
    res += 1200 if (wins==3) else 0
    res += 1400 if (wins==4) else 0
    res += 1600 if (wins==5) else 0
    res += 1800 if (wins==6) else 0
    res += 2200 if (wins==7) else 0
    return res


def do_you_win():
    flag = True
    if random.random() >= win_prob:#When you lose.
        flag = False
    return flag


def draft_try():
    nwin = 0
    nlos = 0
    for _ in range(num_games):
        if nlos < 3 and nwin < 7:
            flag = do_you_win()
            nwin += (flag == True)
            nlos += (flag == False)
    return nwin, nlos


def flight():
    count_tot = 0
    towin = 0
    tolos = 0
    gem = gem_start; print("Gems: ", gem)
    bailout = False
    for _ in range(num_iteration):
#----------------------------------- Start loop <28001>
        count_tot += 1
        (iwin, ilos) = draft_try()
        print("Wins / Loses = ", iwin, " / ", ilos, " in ", count_tot, " th draft.")#--- print results
        towin += iwin
        tolos += ilos
        if kind == "quick":
            gem += gem_quick(iwin)
            bailout = True if (gem < gem_cost_quick) else False
        elif kind == "premi":
            gem += gem_premi(iwin)
            bailout = True if (gem < gem_cost_premi) else False
        elif kind == "seald":
            gem += gem_seald(iwin)
            bailout = True if (gem < gem_cost_seald) else False
        else:
            gem = -9999
            continue
        if bailout == True:
            break
####            print("Gems: ", gem)
#----------------------------------- End loop <28001>
    print("-------")
    print("Gems: ", gem)
    print("Drafts: ", count_tot)
    print("Total wins  :", towin)
    print("Total loses :", tolos)
    return count_tot, towin, tolos


#----------------------------------------------------- MAIN PART
itry = 0
runs = 0
nwin = 0
nlos = 0
for _ in range(1000):
    itry += 1
    (i1, i2, i3) = flight()
    runs += i1
    nwin += i2
    nlos += i3
    print("##########################################")
print("- kind =", kind, "draft")
print("- winning prob. =", win_prob)
print("- flights =", itry)
print("- actual wins  =", nwin)
print("- actual loses =", nlos)
print("- actual winning prob. =", nwin/(nwin+nlos))
print("- drafts / flights =", runs/itry)