Deck analyzer
This commit is contained in:
parent
4cc0bb905b
commit
bbcc5e3c5c
1 changed files with 81 additions and 0 deletions
81
analyze.py
Normal file
81
analyze.py
Normal file
|
@ -0,0 +1,81 @@
|
|||
import re
|
||||
import sys
|
||||
from mtg import *
|
||||
import database
|
||||
|
||||
def graph(data, title, hideEmpty=True):
|
||||
categories = sorted(data.keys())
|
||||
cjust = sorted([len(str(k)) for k in data.keys()]).pop()
|
||||
vjust = sorted([len(str(v)) for v in data.values()]).pop()
|
||||
max = sorted(data.values()).pop()
|
||||
print title
|
||||
print '-' * 80
|
||||
for category in categories:
|
||||
if hideEmpty and not data[category]:
|
||||
continue
|
||||
heading = str(category).ljust(cjust)
|
||||
value = str(data[category]).rjust(vjust)
|
||||
bar = '*' * int(data[category] * (80 - cjust - vjust - 6) / float(max))
|
||||
print '{0} [{1}] | {2}'.format(heading, value, bar)
|
||||
if hideEmpty and not max:
|
||||
print ' *** Nothing to display ***'
|
||||
|
||||
def mana_curve(deck):
|
||||
costs = [c.cost.converted() for c in deck if c.cost.converted() > 0]
|
||||
data = {}
|
||||
for i in range(1, sorted(costs).pop() + 1):
|
||||
data[i] = 0
|
||||
for c in costs:
|
||||
data[c] += 1
|
||||
return data
|
||||
def types(deck):
|
||||
return {
|
||||
'Lands': len([c for c in deck if 'land' in c.type.split(' ')]),
|
||||
'Creatures': len([c for c in deck if 'creature' in c.type.split(' ')]),
|
||||
'Artifacts': len([c for c in deck if 'artifact' in c.type.split(' ')]),
|
||||
'Enchantments': len([c for c in deck if 'enchantment' in c.type.split(' ')]),
|
||||
'Sorceries': len([c for c in deck if 'sorcery' in c.type.split(' ')]),
|
||||
'Instants': len([c for c in deck if 'instant' in c.type.split(' ')]),
|
||||
}
|
||||
def colors(deck):
|
||||
data = {}
|
||||
for color in Mana.types.values():
|
||||
data[color] = 0
|
||||
for card in deck:
|
||||
if 'land' in card.type.split(' '):
|
||||
if 'swamp' in card.attributes: data[Mana.types['B']] += 1
|
||||
if 'island' in card.attributes: data[Mana.types['U']] += 1
|
||||
if 'mountain' in card.attributes: data[Mana.types['R']] += 1
|
||||
if 'forest' in card.attributes: data[Mana.types['G']] += 1
|
||||
if 'plains' in card.attributes: data[Mana.types['W']] += 1
|
||||
else:
|
||||
for color, value in card.cost.mana.mana.iteritems():
|
||||
data[Mana.types[color]] += 1 if value > 0 else 0
|
||||
return data
|
||||
|
||||
db = database.TextDB('db.txt')
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
print 'No decks specified.'
|
||||
sys.exit(1)
|
||||
for filename in sys.argv[1:]:
|
||||
print 'Loading deck in "{0}"...'.format(filename)
|
||||
deck = Deck()
|
||||
with open(filename, 'r') as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if not re.match('^\d+ .+$', line):
|
||||
continue
|
||||
line = line.split(' ')
|
||||
count = int(line.pop(0))
|
||||
name = ' '.join(line)
|
||||
card = db.getCard(name)
|
||||
if not card:
|
||||
print 'Invalid card: ', name
|
||||
continue
|
||||
deck.extend(card * count)
|
||||
|
||||
print 'Loaded', len(deck), 'cards.'
|
||||
graph(mana_curve(deck), '\nMana Curve', hideEmpty=False)
|
||||
graph(types(deck), '\nCard Types')
|
||||
graph(colors(deck), '\nColors')
|
Loading…
Reference in a new issue