|
| 1 | +from renderers import Renderer |
| 2 | +from prettytable import PrettyTable |
| 3 | +import numpy as np |
| 4 | +from arena import GameResult |
| 5 | + |
| 6 | + |
| 7 | +class ArenaResultsRenderer(Renderer): |
| 8 | + def end_arena(self, game, results: list[GameResult]): |
| 9 | + def perc(wins: int, played: int) -> str: |
| 10 | + if played == 0: |
| 11 | + return "-" |
| 12 | + |
| 13 | + return f"{wins / played * 100.0:.0f}%" |
| 14 | + |
| 15 | + print("Arena stats") |
| 16 | + print("===========") |
| 17 | + print("Board size: ", game.board_size) |
| 18 | + print("Max walls: ", game.max_walls) |
| 19 | + print("Step rewards: ", game.step_rewards) |
| 20 | + print("Total number of games: ", len(results), "\n") |
| 21 | + |
| 22 | + all_players = sorted(set([r.player1 for r in results]) | set([r.player2 for r in results])) |
| 23 | + players = {player: i for i, player in enumerate(all_players)} |
| 24 | + |
| 25 | + table = PrettyTable() |
| 26 | + table.field_names = ["P1 \\ P2"] + list(players) + ["Total"] |
| 27 | + |
| 28 | + N = len(players) |
| 29 | + wins = np.zeros((N + 1, N + 1)) |
| 30 | + games = np.zeros((N + 1, N + 1)) |
| 31 | + |
| 32 | + for r in results: |
| 33 | + games[players[r.player1], players[r.player2]] += 1 |
| 34 | + if r.winner == r.player1: |
| 35 | + wins[players[r.player1], players[r.player2]] += 1 |
| 36 | + |
| 37 | + # Get the totals per row and column |
| 38 | + wins[-1, :] = np.sum(wins, axis=0) |
| 39 | + wins[:, -1] = np.sum(wins, axis=1) |
| 40 | + games[-1, :] = np.sum(games, axis=0) |
| 41 | + games[:, -1] = np.sum(games, axis=1) |
| 42 | + |
| 43 | + # Hacky way of adding an extra column and row for the totals |
| 44 | + players["Total"] = max(players.values()) + 1 |
| 45 | + |
| 46 | + # Set the results in the PrettyTable |
| 47 | + for player1, i1 in players.items(): |
| 48 | + row = [player1] |
| 49 | + for _, i2 in players.items(): |
| 50 | + row.append(perc(wins[i1, i2], games[i1, i2])) |
| 51 | + |
| 52 | + table.add_row(row) |
| 53 | + |
| 54 | + # Before the last row add this separation, since the last row is the total |
| 55 | + if i1 == len(players) - 2: |
| 56 | + table.add_row(["======" for _ in range(len(players) + 1)]) |
| 57 | + |
| 58 | + print(table) |
0 commit comments