#!/usr/bin/env python3 import sys import json import random random.seed() sys.path.append('pytron') from tron.map import Map from tron.game import Game, PositionPlayer from tron.player import Direction, ConstantPlayer from importlib import import_module import ai_manager # Find all the AIs class AiClass: def __init__(self, name, builder): self.name = name self.builder = builder ais = [] for real_ai in ai_manager.__all__: ai_name = real_ai.split('/')[-2] ai_module = import_module('.'.join(real_ai.split('/')[-3:])) ai_class = getattr(ai_module, "Ai") ais.append(AiClass(ai_name, ai_class)) # This script shows how to create a game with AI, that will run automatically. # It is made to be fast and not to be used by humans. It especially doesn't # display and window and doesn't listen to any keystrokes. width = 40 height = 40 def run_battle(ai1, ai2): ai1_victories = 0 ai2_victories = 0 for _ in range(50): initial_position_one = [random.randint(0, width - 1), random.randint(0, height - 1)] initial_position_two = [random.randint(0, width - 1), random.randint(0, height - 1)] game = Game(width, height, [ PositionPlayer(1, ai1.builder(), initial_position_one), PositionPlayer(2, ai2.builder(), initial_position_two), ]) game.main_loop() if game.winner == 1: ai1_victories += 1 elif game.winner == 2: ai2_victories += 1 # Inverse positions and replay to be symmetrical game = Game(width, height, [ PositionPlayer(1, ai1.builder(), initial_position_two), PositionPlayer(2, ai2.builder(), initial_position_one), ]) game.main_loop() if game.winner == 1: ai2_victories += 1 elif game.winner == 2: ai1_victories += 1 return (ai1_victories, ai2_victories) def main(): dictionnary = {"ais": list(map(lambda x: x.name, ais)), "battles": {}} for (id1, ai1) in enumerate(ais): for (id2, ai2) in enumerate(ais): if id1 >= id2: continue print("Battling {} vs {}".format(ai1.name, ai2.name)) (score1, score2) = run_battle(ai1, ai2) dictionnary["battles"][ai1.name + "/" + ai2.name] = score1 / (score1 + score2) with open("assets/data.json", "w") as f: f.write(json.dumps(dictionnary)) if __name__ == '__main__': main()