# from Arcangioli import Martina as Arcangioli
# from Baroni import Francy as Baroni
# from Bonciani import irerobot as Bonciani
# from DiMartino import Robot as DiMartino
# from Fratini import Computer as Fratini
# from Picchioni import Sara as Picchioni
# from Zoccola import MartyRobot as Zoccola
from tris import Game, Random, Smart


players = [Smart,Random,
           # Arcangioli, Baroni, Bonciani, DiMartino, Fratini, Picchioni, Zoccola
           ]

players = [X(X.__name__) for X in players]

N_GAMES = 1000

def match(Player1, Player2, count, verbose=1):
    ''' restituisce i conteggi (win1,win2,draw) '''
    results = [0,0,0]
    for i in range(count//2):
        game = Game(Player1, Player2,verbose=verbose-1)
        board = game.play()
        if verbose > 0:
            print board
        state = board.state()
        if state == 'O':
            results[0] += 1
        elif state == 'X':
            results[1] += 1
        else:
            results[2] += 1
        game = Game(Player2, Player1,verbose=verbose-1)
        board = game.play()
        if verbose > 0:
            print board
        state = board.state()
        if state == 'O':
            results[1] += 1
        elif state == 'X':
            results[0] += 1
        else:
            results[2] += 1
    return results

def campionato(players, verbose = 2):
    scores = [0 for x in players]
    n = len(players)
    for i in range(n):
        for j in range(n):
            if i != j:
                # match players[i] vs players[j]
                r = match(players[i],players[j],N_GAMES,verbose-1)
                if verbose>0:
                    print "{0} vs {1}: {2}/{3}".format(players[i].name,players[j].name,r[0],r[1])
                if r[0]>r[1]: # vince i
                    scores[i] += 3
                elif r[1]>r[0]: # vince j
                    scores[j] += 3
                else: # pari
                    scores[i] += 1
                    scores[j] += 1
    classifica = zip(players,scores)
    classifica.sort(key = lambda x: x[1])
    print 'Classifica:'
    for player,score in classifica:
        print '{0}: {1}'.format(player.name,score)

campionato(players,verbose=1)
