Advertisement
liq3

Untitled

Sep 27th, 2019
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.26 KB | None | 0 0
  1. import random
  2. from collections import defaultdict
  3.  
  4. def d6():
  5.     return random.randint(1,6)
  6.  
  7. def xdnk(x,n):
  8.     best = 0
  9.     for k in range(x):
  10.         roll = random.randint(1,n)
  11.         if best < roll:
  12.             best = roll
  13.     return best
  14.  
  15. def testxdnk(rolls):
  16.     totals = defaultdict(int)
  17.     for r in range(rolls):
  18.         totals[xdnk(2,6)] += 1
  19.     for i in range(1,7):
  20.         print(i, totals[i])
  21.  
  22. def calcKeep(rolls):
  23.     for d in range(1,5):
  24.         total = 0
  25.         for i in range(rolls):            
  26.             total += xdnk(d,6)
  27.         print(d, total/rolls)
  28.  
  29. def calcStructure(rolls):
  30.     results = []
  31.     for i in range(4):
  32.         results.append(defaultdict(int))
  33.     for i in range(rolls):
  34.         for d in range(4):
  35.             high = 6
  36.             ones = 0
  37.             for x in range(d+1):
  38.                 roll = d6()
  39.                 if high > roll:
  40.                     high = roll
  41.                 if roll == 1:
  42.                     ones += 1
  43.             if ones >= 2:
  44.                 results[d]['destroyed'] += 1
  45.                 break
  46.             if high >= 5:
  47.                 results[d]['impaired'] += 1
  48.             elif high >= 2:
  49.                 results[d]['trauma'] += 1
  50.             elif high == 1:
  51.                 if d == 0:
  52.                     results[d]['stunned'] += 1
  53.                 elif d == 1:
  54.                     if random.randint(1,20) < 10:
  55.                         results[d]['destroyed'] += 1
  56.                         break
  57.                 elif d >= 2:
  58.                     results[d]['destroyed'] += 1
  59.                     break
  60.             if d == 3:
  61.                 results[d]['critical'] += 1
  62.     totals = [0]*4
  63.     for i in range(4):
  64.         print(i+1)
  65.         total = 0
  66.         for k,n in results[i].items():
  67.             print(k,n/rolls*100)
  68.             total += n/rolls*100
  69.             if k != 'critical':
  70.                 totals[i] += n
  71.         #print(total)
  72.     for i in range(4):
  73.         print(i+1)
  74.         for k,n in results[i].items():
  75.             print(k,n/totals[i]*100)
  76.        
  77. def calcAccuracy(rolls, target, diceNumber=3, minus=False):
  78.     hits = 0
  79.     for n in range(rolls):
  80.         roll = random.randint(1,20)
  81.         if not minus:
  82.             roll += xdnk(diceNumber,6)
  83.         else:
  84.             roll -= xdnk(diceNumber,6)
  85.         if roll >= target:
  86.             hits += 1
  87.     print(hits/rolls*100)
  88.  
  89. def batchAccuracy(rolls):
  90.     for n in range(1,21):
  91.         print('--', n)
  92.         for i in range(3,0, -1):
  93.             calcAccuracy(rolls, n, i, True)
  94.         for i in range(0,4):
  95.             calcAccuracy(rolls, n, i, False)
  96.  
  97.  
  98. def dragoncrit(rolls):
  99.     score = 0
  100.     for i in range(rolls):
  101.         roll = random.randint(1,20) + 3 + random.randint(1,6)
  102.         if roll >= 20:
  103.             score += 1
  104.     print("Crit Chance:", score/rolls*100)
  105.  
  106. def critdamage(d, a, rolls):
  107.     score = 0
  108.     for i in range(rolls):
  109.         rollList = sorted(random.randint(1,6) for r in range(d*2))
  110.         score += sum(rollList[d:]) + a
  111.     print("Average damage:", score/rolls)
  112.  
  113. def ultraStruct2(rolls):
  114.     dead = 0
  115.     check = 0
  116.     for i in range(rolls):
  117.         dice = [[random.randint(1,6) for r in range(2)] for s in range(2)]
  118.         if sum(dice[0]) == 2 and sum(dice[1]) == 2:
  119.             dead += 1
  120.         elif 1 in dice[0] and 1 in dice[1]:
  121.             check += 1
  122.     print(f'Dead:{dead/rolls*100} Checks:{check/rolls*100}')
  123.  
  124. def combatDrill(numDice, bonusDamage, rolls):
  125.     damage = 0
  126.     heat = 0
  127.     for i in range(rolls):
  128.         dice = [random.randint(1,6) for r in range(numDice)]
  129.         bonusDice = 0
  130.         while 1 in dice:
  131.             dice.sort(reverse=True)
  132.             dice.pop()
  133.             dice = dice + [random.randint(1,6) for r in range(2)]
  134.             heat += 1
  135.             bonusDice += 1
  136.         dice.sort(reverse=True)
  137.         damage += sum( dice[ :numDice + bonusDice] )
  138.     print(f'Damage:{damage/rolls} Heat:{heat/rolls}')
  139.  
  140. def combatDrillCrit(numDice, bonusDamage, rolls):
  141.     damage = 0
  142.     heat = 0
  143.     for i in range(rolls):
  144.         dice = [random.randint(1,6) for r in range(numDice)]
  145.         bonusDice = 0
  146.         while 1 in dice:
  147.             dice.sort(reverse=True)
  148.             dice.pop()
  149.             dice = dice + [random.randint(1,6) for r in range(2)]
  150.             heat += 1
  151.             bonusDice += 1
  152.         dice.sort(reverse=True)
  153.         damage += sum( dice[ :int(numDice/2) + bonusDice] )
  154.     print(f'Damage:{damage/rolls} Heat:{heat/rolls}')
  155.  
  156. def combatDrillWeakCrit(numDice, bonusDamage, rolls):
  157.     damage = 0
  158.     heat = 0
  159.     for i in range(rolls):
  160.         dice = [random.randint(1,6) for r in range(numDice)]
  161.         dice.sort(reverse=True)
  162.         dice = dice[:int(numDice/2)]
  163.         while 1 in dice:
  164.             dice.sort(reverse=True)
  165.             dice.pop()
  166.             dice = dice + [random.randint(1,6) for r in range(2)]
  167.             heat += 1      
  168.         damage += sum(dice)
  169.     print(f'Damage:{damage/rolls} Heat:{heat/rolls}')
  170.  
  171. #testxdnk(1000000)
  172. #calcKeep(1000)
  173. #calcStructure(1000000)
  174. #calcAccuracy(10000, 10, 1, True)
  175. #batchAccuracy(10000)
  176. #dragoncrit(10000)
  177. #critdamage(7, 3, 10000)
  178. #ultraStruct2(1000000)
  179. combatDrillCrit(8, 0, 1000000)
  180. combatDrillWeakCrit(8, 0, 1000000)
  181. combatDrill(4,0,1000000)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement