def main(argv=None): available_directors = get_directors() parser = argparse.ArgumentParser( description='Minesweeper with an AI interface') parser.add_argument('-s', '--scenario', type=argparse.FileType('r'), help='Scenario/saved game to load') parser.add_argument('--state', help='Game state to load') parser.add_argument('-u', '--scenario-unrevealed', type=bool, default=False, help='Load scenario completely unrevealed') parser.add_argument('-r', '--repeat', default=False, action='store_true', help='Repeat loaded scenario') parser.add_argument('-d', '--director', choices=['none'] + list(available_directors), default='attempt2', help='AI director to use (none to disable)') parser.add_argument('--director-skip-frames', type=int, default=1, help='Number of frames to skip between director steps') parser.add_argument('-m', '--mode', choices=['winxp', 'win7'], default='win7', help='Which minesweeper mode to emulate ' '(winxp=clear first clicked cell,' ' win7=clear neighbours of first clicked cell)') parser.add_argument("-v", "--verbose", help="increase output verbosity", action="store_true") args = parser.parse_args(argv) if args.verbose: logging.basicConfig(level=logging.DEBUG) game = Game() game.director_skip_frames = args.director_skip_frames if args.director: director = available_directors.get(args.director)() if director: game.set_director(director) if args.scenario and args.state: raise RuntimeError("Cannot load both game state (--state) and scenario (-s/--scenario)") if args.scenario or args.state: if args.scenario: # We want to manage opening the file ourselves args.scenario.close() def load_scenario(): game.load(args.scenario.name, unrevealed=args.scenario_unrevealed) elif args.state: serialized = args.state.replace('\\n', '\n') def load_scenario(): game.deserialize(serialized) else: assert False, 'THIS SHOULD NOT HAPPEN' if args.repeat: def on_margin_clicked(): game.init_game() load_scenario() game.on_margin_clicked = on_margin_clicked load_scenario() game.clear_neighbors_of_first_click = args.mode == 'win7' game.run()