def test_deck_shortening(self): deck1 = Deck([RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), GoldshireFootman(), GoldshireFootman()], CHARACTER_CLASS.DRUID) deck2 = StackedDeck([StonetuskBoar()], CHARACTER_CLASS.HUNTER) game = Game([deck1, deck2], [RandomAgent(), RandomAgent()]) replay = record(game) game.start() replay.write(StringIO())
def test_first_turn(self): card_set1 = [] card_set2 = [] for cardIndex in range(0, 30): card_set1.append(card_lookup("Stonetusk Boar")) card_set2.append(card_lookup("Novice Engineer")) deck1 = Deck(card_set1, Malfurion()) deck2 = Deck(card_set2, Jaina()) agent1 = mock.Mock(spec=DoNothingAgent(), wraps=DoNothingAgent()) agent2 = mock.Mock(spec=DoNothingAgent(), wraps=DoNothingAgent()) game = Game([deck1, deck2], [agent1, agent2]) game.start()
def run_game(self, other): mydeck = self.breakerdeck() game = Game([mydeck, other.breakerdeck()], [RandomAgent(), RandomAgent()]) tries = 0 while tries < 10: try: game.start() result = game.players[0].hero.dead and game.players[0].deck == mydeck if result: database.create_game('mutational', self.id, other.id, self.id) else: database.create_game('mutational', self.id, other.id, other.id) return except: tries += 1 return True
def test_recording_game(self): self.maxDiff = None random.seed(9876) deck1 = hearthbreaker.engine.Deck([StonetuskBoar() for i in range(0, 30)], CHARACTER_CLASS.MAGE) deck2 = hearthbreaker.engine.Deck([Naturalize() for i in range(0, 30)], CHARACTER_CLASS.DRUID) agent1 = PredictableAgent() agent2 = PredictableAgent() game = Game([deck1, deck2], [agent1, agent2]) replay = record(game) game.start() output = StringIO() replay.write_json(output) f = open("tests/replays/stonetusk_innervate.hsreplay", 'r') dif = self.__compare_json(output.getvalue(), f.read()) self.assertTrue(dif) f.close()
def test_recording_game(self): self.maxDiff = None random.seed(9876) deck1 = hearthbreaker.engine.Deck( [StonetuskBoar() for i in range(0, 30)], Jaina()) deck2 = hearthbreaker.engine.Deck([Naturalize() for i in range(0, 30)], Malfurion()) agent1 = PredictableAgent() agent2 = PredictableAgent() game = Game([deck1, deck2], [agent1, agent2]) replay = record(game) game.start() output = StringIO() replay.write_json(output) f = open("tests/replays/stonetusk_innervate.hsreplay", 'r') dif = self.__compare_json(output.getvalue(), f.read()) self.assertTrue(dif) f.close()
def test_deck_shortening(self): deck1 = Deck([ RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), RagnarosTheFirelord(), GoldshireFootman(), GoldshireFootman() ], Malfurion()) deck2 = StackedDeck([StonetuskBoar()], CHARACTER_CLASS.HUNTER) game = Game([deck1, deck2], [RandomAgent(), RandomAgent()]) replay = record(game) game.start() replay.write(StringIO())
def render_game(stdscr): class TextAgent: def __init__(self, game_window, prompt_window, text_window): self.window = prompt_window self.game_window = game_window self.text_window = text_window curses.init_pair(5, curses.COLOR_WHITE, curses.COLOR_CYAN) curses.init_pair(6, curses.COLOR_BLACK, curses.COLOR_GREEN) def do_turn(self, player): renderer.draw_game() index = 0 action = self.choose_action() while not (action == "quit" or action == "end"): if action == "play": card = self.choose_card(player) if card is not None: player.game.play_card(card) elif action == "attack": attacker = self.choose_attacker(player) if attacker is not None: attacker.attack() elif action == "power": if player.hero.power.can_use(): player.hero.power.use() elif action == "state": current_state.export_state() index += 1 renderer.draw_game() action = self.choose_action() if action == "quit": sys.exit(0) def choose_action(self): self.window.addstr(0, 0, "Choose action") actions = ["play", "attack", "power", "end", "state", "quit"] index = 0 selected = 0 for action in actions: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) self.text_window.addstr(0, index * 10, "{0:^9}".format(action), color) index += 1 self.window.refresh() self.text_window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: selected -= 1 if selected < 0: selected = len(actions) - 1 if ch == curses.KEY_RIGHT: selected += 1 if selected == len(actions): selected = 0 index = 0 for action in actions: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) self.text_window.addstr(0, index * 10, "{0:^9}".format(action), color) index += 1 self.window.refresh() self.text_window.refresh() if ch == 27: return None return actions[selected] def choose_card(self, player): filtered_cards = [ card for card in filter( lambda card: card.can_use(player, player.game), player.hand) ] if len(filtered_cards) is 0: return None renderer.targets = filtered_cards renderer.selected_target = renderer.targets[0] renderer.draw_game() self.window.addstr(0, 0, "Choose Card") self.window.refresh() ch = 0 index = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: index -= 1 if index < 0: index = len(renderer.targets) - 1 if ch == curses.KEY_RIGHT: index += 1 if index == len(renderer.targets): index = 0 renderer.selected_target = renderer.targets[index] renderer.draw_game() self.window.addstr(0, 0, "Choose Card") self.window.refresh() renderer.targets = None if ch == 27: return None return renderer.selected_target def choose_attacker(self, player): filtered_attackers = [ minion for minion in filter(lambda minion: minion.can_attack(), player.minions) ] if player.hero.can_attack(): filtered_attackers.append(player.hero) if len(filtered_attackers) is 0: return None renderer.targets = filtered_attackers renderer.selected_target = renderer.targets[0] renderer.draw_game() self.window.addstr(0, 0, "Choose attacker") self.window.refresh() ch = 0 index = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() self.window.addstr(0, 0, "{0}".format(ch)) self.window.refresh() if ch == curses.KEY_LEFT: index -= 1 if index < 0: index = len(renderer.targets) - 1 if ch == curses.KEY_RIGHT: index += 1 if index == len(renderer.targets): index = 0 renderer.selected_target = renderer.targets[index] renderer.draw_game() self.window.refresh() renderer.targets = None if ch == 27: return None return renderer.selected_target def do_card_check(self, cards): self.window.addstr( 0, 0, "Select cards to keep (space selects/deselects a card)") keeping = [True, True, True] if len(cards) > 3: keeping.append(True) index = 0 selected = 0 for card in cards: if keeping[index]: if index == selected: color = curses.color_pair(6) else: color = curses.color_pair(5) else: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(0) self.text_window.addstr(0, index * 20, "{0:^19}".format(card.name[:19]), color) index += 1 self.window.refresh() self.text_window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: selected -= 1 if selected < 0: selected = len(cards) - 1 if ch == curses.KEY_RIGHT: selected += 1 if selected == len(cards): selected = 0 if ch == 32: keeping[selected] = not keeping[selected] index = 0 for card in cards: if keeping[index]: if index == selected: color = curses.color_pair(6) else: color = curses.color_pair(5) else: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(0) self.text_window.addstr(0, index * 20, "{0:^19}".format(card.name[:19]), color) index += 1 self.window.refresh() self.text_window.refresh() if ch == 27: return None return keeping def choose_target(self, targets): if len(targets) is 0: return None renderer.targets = targets renderer.selected_target = renderer.targets[0] renderer.draw_game() self.window.addstr(0, 0, "Choose target") self.window.refresh() ch = 0 index = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: index -= 1 if index < 0: index = len(renderer.targets) - 1 if ch == curses.KEY_RIGHT: index += 1 if index == len(renderer.targets): index = 0 renderer.selected_target = renderer.targets[index] renderer.draw_game() self.window.refresh() renderer.targets = None if ch == 27: return None return renderer.selected_target def choose_index(self, card, player): renderer.selection_index = 0 renderer.draw_game() self.window.addstr(0, 0, "Choose placement location") self.window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: renderer.selection_index -= 1 if renderer.selection_index < 0: renderer.selection_index = len(player.minions) if ch == curses.KEY_RIGHT: renderer.selection_index += 1 if renderer.selection_index > len(player.minions): renderer.selection_index = 0 renderer.draw_game() self.window.refresh() index = renderer.selection_index renderer.selection_index = -1 if ch == 27: return -1 return index def choose_option(self, options, player): self.window.addstr(0, 0, "Choose option") index = 0 selected = 0 for option in options: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) if isinstance(option, Card): self.text_window.addstr(0, index * 20, "{0:^19}".format(option.name[:19]), color) else: self.text_window.addstr( 0, index * 20, "{0:^19}".format(option.card.name[:19]), color) index += 1 self.window.refresh() self.text_window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: starting_selected = selected selected -= 1 if selected < 0: selected = len(options) - 1 while not options[selected].can_choose( player) and selected != starting_selected: selected -= 1 if selected < 0: selected = len(options) - 1 if ch == curses.KEY_RIGHT: starting_selected = selected selected += 1 if selected == len(options): selected = 0 while not options[selected].can_choose( player) and selected != starting_selected: selected += 1 if selected == len(options): selected = 0 index = 0 for option in options: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) if isinstance(option, Card): self.text_window.addstr( 0, index * 20, "{0:^19}".format(option.name[:19]), color) else: self.text_window.addstr( 0, index * 20, "{0:^19}".format(option.card.name[:19]), color) index += 1 self.window.refresh() self.text_window.refresh() if ch == 27: return None return options[selected] def choose_agent(window): agents = registry.get_names() curses.init_pair(3, curses.COLOR_WHITE, curses.COLOR_BLUE) window.addstr(10, 34, "Choose agent") ch = 0 selected = 0 while ch != 10 and ch != 27: index = 0 for agent in agents: if index == selected: color = curses.color_pair(3) else: color = curses.color_pair(0) window.addstr(index + 11, 25, "{:^30}".format(agent), color) index += 1 window.refresh() ch = window.getch() if ch == curses.KEY_UP: selected -= 1 if selected < 0: selected = len(agents) - 1 if ch == curses.KEY_DOWN: selected += 1 if selected == len(agents): selected = 0 window.clear() if ch == 27: sys.exit(0) else: return registry.create_agent(agents[selected]) stdscr.clear() prompt_window = stdscr.derwin(1, 80, 23, 0) text_window = stdscr.derwin(1, 80, 24, 0) agent = choose_agent(stdscr) deck1 = load_deck(sys.argv[1]) deck2 = load_deck(sys.argv[2]) game = Game([deck1, deck2], [TextAgent(stdscr, prompt_window, text_window), agent]) current_state = State(game) if game.first_player == 0: renderer = GameRender(stdscr, game, game.players[0]) else: renderer = GameRender(stdscr, game, game.players[1]) game.start()
def render_game(stdscr): class TextAgent: def __init__(self, game_window, prompt_window, text_window): self.window = prompt_window self.game_window = game_window self.text_window = text_window curses.init_pair(5, curses.COLOR_WHITE, curses.COLOR_CYAN) curses.init_pair(6, curses.COLOR_BLACK, curses.COLOR_GREEN) def do_turn(self, player): renderer.draw_game() index = 0 action = self.choose_action() while not (action == "quit" or action == "end"): if action == "play": card = self.choose_card(player) if card is not None: player.game.play_card(card) elif action == "attack": attacker = self.choose_attacker(player) if attacker is not None: attacker.attack() elif action == "power": if player.hero.power.can_use(): player.hero.power.use() index += 1 renderer.draw_game() action = self.choose_action() if action == "quit": sys.exit(0) def choose_action(self): self.window.addstr(0, 0, "Choose action") actions = ["play", "attack", "power", "end", "quit"] index = 0 selected = 0 for action in actions: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) self.text_window.addstr(0, index * 10, "{0:^9}".format(action), color) index += 1 self.window.refresh() self.text_window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: selected -= 1 if selected < 0: selected = len(actions) - 1 if ch == curses.KEY_RIGHT: selected += 1 if selected == len(actions): selected = 0 index = 0 for action in actions: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) self.text_window.addstr(0, index * 10, "{0:^9}".format(action), color) index += 1 self.window.refresh() self.text_window.refresh() if ch == 27: sys.exit(0) #return None return actions[selected] def choose_card(self, player): filtered_cards = [card for card in filter(lambda card: card.can_use(player, player.game), player.hand)] if len(filtered_cards) is 0: return None renderer.targets = filtered_cards renderer.selected_target = renderer.targets[0] renderer.draw_game() self.window.addstr(0, 0, "Choose Card") self.window.refresh() ch = 0 index = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: index -= 1 if index < 0: index = len(renderer.targets) - 1 if ch == curses.KEY_RIGHT: index += 1 if index == len(renderer.targets): index = 0 renderer.selected_target = renderer.targets[index] renderer.draw_game() self.window.addstr(0, 0, "Choose Card") self.window.refresh() renderer.targets = None if ch == 27: return None return renderer.selected_target def choose_attacker(self, player): filtered_attackers = [minion for minion in filter(lambda minion: minion.can_attack(), player.minions)] if player.hero.can_attack(): filtered_attackers.append(player.hero) if len(filtered_attackers) is 0: return None renderer.targets = filtered_attackers renderer.selected_target = renderer.targets[0] renderer.draw_game() self.window.addstr(0, 0, "Choose attacker") self.window.refresh() ch = 0 index = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() self.window.addstr(0, 0, "{0}".format(ch)) self.window.refresh() if ch == curses.KEY_LEFT: index -= 1 if index < 0: index = len(renderer.targets) - 1 if ch == curses.KEY_RIGHT: index += 1 if index == len(renderer.targets): index = 0 renderer.selected_target = renderer.targets[index] renderer.draw_game() #fix self.window.addstr(0, 0, "Choose attacker") self.window.refresh() renderer.targets = None if ch == 27: return None return renderer.selected_target def do_card_check(self, cards): self.game_window.clear() #fix #self.window.addstr(0, 0, "Select cards to keep (space selects/deselects a card)") self.game_window.addstr(10, 0, "Select cards to keep (space selects/deselects a card). esc to 离开") keeping = [True, True, True] if len(cards) > 3: keeping.append(True) index = 0 selected = 0 for card in cards: if keeping[index]: if index == selected: color = curses.color_pair(6) else: color = curses.color_pair(5) else: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(0) #self.text_window.addstr(0, index * 20, "{0:^19}".format(card.name[:19]), color) self.game_window.addstr(11, index * 20, "{0:^19}".format(card.name[:19]), color) index += 1 self.window.refresh() #self.text_window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: selected -= 1 if selected < 0: selected = len(cards) - 1 if ch == curses.KEY_RIGHT: selected += 1 if selected == len(cards): selected = 0 if ch == 32: keeping[selected] = not keeping[selected] index = 0 for card in cards: if keeping[index]: if index == selected: color = curses.color_pair(6) else: color = curses.color_pair(5) else: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(0) #self.text_window.addstr(0, index * 20, "{0:^19}".format(card.name[:19]), color) self.game_window.addstr(11, index * 20, "{0:^19}".format(card.name[:19]), color) index += 1 self.game_window.refresh() #self.text_window.refresh() if ch == 27: #return None sys.exit(0) return keeping def choose_target(self, targets): if len(targets) is 0: return None renderer.targets = targets renderer.selected_target = renderer.targets[0] renderer.draw_game() self.window.addstr(0, 0, "Choose target") self.window.refresh() ch = 0 index = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: index -= 1 if index < 0: index = len(renderer.targets) - 1 if ch == curses.KEY_RIGHT: index += 1 if index == len(renderer.targets): index = 0 renderer.selected_target = renderer.targets[index] renderer.draw_game() #fix self.window.addstr(0, 0, "Choose target") self.window.refresh() renderer.targets = None if ch == 27: return None return renderer.selected_target def choose_index(self, card, player): renderer.selection_index = 0 renderer.draw_game() self.window.addstr(0, 0, "Choose placement location") self.window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: renderer.selection_index -= 1 if renderer.selection_index < 0: renderer.selection_index = len(player.minions) if ch == curses.KEY_RIGHT: renderer.selection_index += 1 if renderer.selection_index > len(player.minions): renderer.selection_index = 0 renderer.draw_game() self.window.refresh() index = renderer.selection_index renderer.selection_index = -1 if ch == 27: return -1 return index def choose_option(self, options, player): self.window.addstr(0, 0, "Choose option") index = 0 selected = 0 for option in options: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) if isinstance(option, Card): self.text_window.addstr(0, index * 20, "{0:^19}".format(option.name[:19]), color) else: self.text_window.addstr(0, index * 20, "{0:^19}".format(option.card.name[:19]), color) index += 1 self.window.refresh() self.text_window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: starting_selected = selected selected -= 1 if selected < 0: selected = len(options) - 1 while not options[selected].can_choose(player) and selected != starting_selected: selected -= 1 if selected < 0: selected = len(options) - 1 if ch == curses.KEY_RIGHT: starting_selected = selected selected += 1 if selected == len(options): selected = 0 while not options[selected].can_choose(player) and selected != starting_selected: selected += 1 if selected == len(options): selected = 0 index = 0 for option in options: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) if isinstance(option, Card): self.text_window.addstr(0, index * 20, "{0:^19}".format(option.name[:19]), color) else: self.text_window.addstr(0, index * 20, "{0:^19}".format(option.card.name[:19]), color) index += 1 self.window.refresh() self.text_window.refresh() if ch == 27: return None return options[selected] def choose_agent(window): agents = registry.get_names() curses.init_pair(3, curses.COLOR_WHITE, curses.COLOR_BLUE) window.addstr(10, 34, "Choose agent") ch = 0 selected = 0 while ch != 10 and ch != 27: index = 0 for agent in agents: if index == selected: color = curses.color_pair(3) else: color = curses.color_pair(0) window.addstr(index + 11, 25, "{:^30}".format(agent), color) index += 1 window.refresh() ch = window.getch() if ch == curses.KEY_UP: selected -= 1 if selected < 0: selected = len(agents) - 1 if ch == curses.KEY_DOWN: selected += 1 if selected == len(agents): selected = 0 window.clear() if ch == 27: sys.exit(0) else: return registry.create_agent(agents[selected]) #render_game stdscr.clear() #prompt_window = stdscr.derwin(1, 80, 23, 0) #text_window = stdscr.derwin(1, 80, 24, 0) game_window = stdscr prompt_window = stdscr.derwin(1, 80, 23, 0) text_window = stdscr.derwin(1, 80, 24, 0) #prompt_window = curses.newwin(1, 80, 21, 0) #text_window = curses.newwin(1, 80, 22, 0) agent = choose_agent(stdscr) #deck1 = load_deck(sys.argv[1]) #deck2 = load_deck(sys.argv[2]) deck1 = load_deck('example.hsdeck') deck2 = load_deck('example.hsdeck') #game = Game([deck1, deck2], [TextAgent(stdscr, prompt_window, text_window), agent]) game = Game([deck1, deck2], [TextAgent(game_window, prompt_window, text_window), agent]) if game.first_player == 0: renderer = GameRender(stdscr, game, game.players[0]) else: renderer = GameRender(stdscr, game, game.players[1]) game.start()
def test_recording_game(self): self.maxDiff = None # change random to a certain seed to reproduce the replay #random.seed(9876) random.seed() deck1name = "pat_face_hunter.hsdeck" deck2name = "pat_zoolock.hsdeck" # below decks work, will try hunter v zoolock above #deck1name = "pat_freeze_mage.hsdeck" #deck2name = "pat_midrange_druid.hsdeck" # testing custom decks # need to convert card names to the actual functions deck1 = self.load_deck(deck1name) deck2 = self.load_deck(deck2name) # below are what works #deck1 = hearthbreaker.engine.Deck([StonetuskBoar() for i in range(0, 30)], Jaina()) #deck2 = hearthbreaker.engine.Deck([Naturalize() for i in range(0, 30)], Malfurion()) # PredictableAgent() works, let's try TradeAgent() agent1 = TradeAgent() agent2 = TradeAgent() # agent1 = PredictableAgent() # agent2 = PredictableAgent() game = Game([deck1, deck2], [agent1, agent2]) replay = record(game) game.start() output = StringIO() replay.write_json(output) with open('pat_replay_2.hsreplay', mode='w') as f: print(output.getvalue(), file=f) # testing something 2021_3_15 # ast.literal_eval("{'muffin' : 'lolz', 'foo' : 'kitty'}") replay_json = ast.literal_eval(output.getvalue()) # { #"character": { # "minion": 2, # "player": "p1" # }, # "name": "attack", # "target": { # "player": "p2" # } #}, # { # "name": "end" # } #] #} # last move is always "name": "end" since that's last action taken # so get the move before last_move = replay_json['moves'][-2] # above works fine, need to filter based on results # will take a sample of 10 different replays print("the last move is {}".format(last_move)) # it depends on the last move, we need to check for different situations # first situation is a minion killing a player if last_move['character']: print(last_move['character']) # minion could be 0 if last_move['character']['minion'] is not None: if last_move['target']['player']: dead_player = str(last_move['target']['player']) print("player {} died".format(dead_player)) with open('pat_who_wins.txt', mode='a') as f: print(dead_player, file=f)
def render_game(stdscr): class TextAgent: def __init__(self, game_window, prompt_window, text_window): self.window = prompt_window self.game_window = game_window self.text_window = text_window curses.init_pair(5, curses.COLOR_WHITE, curses.COLOR_CYAN) curses.init_pair(6, curses.COLOR_BLACK, curses.COLOR_GREEN) def do_turn(self, player): renderer.draw_game() index = 0 action = self.choose_action() while not (action == "quit" or action == "end"): if action == "play": card = self.choose_card(player) if card is not None: player.game.play_card(card) elif action == "attack": attacker = self.choose_attacker(player) if attacker is not None: attacker.attack() elif action == "power": if player.hero.power.can_use(): player.hero.power.use() index += 1 renderer.draw_game() action = self.choose_action() if action == "quit": sys.exit(0) def choose_action(self): self.window.addstr(0, 0, "Choose action") actions = ["play", "attack", "power", "end", "quit"] index = 0 selected = 0 for action in actions: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) self.text_window.addstr(0, index * 10, "{0:^9}".format(action), color) index += 1 self.window.refresh() self.text_window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: selected -= 1 if selected < 0: selected = len(actions) - 1 if ch == curses.KEY_RIGHT: selected += 1 if selected == len(actions): selected = 0 index = 0 for action in actions: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) self.text_window.addstr(0, index * 10, "{0:^9}".format(action), color) index += 1 self.window.refresh() self.text_window.refresh() if ch == 27: return None return actions[selected] def choose_card(self, player): filtered_cards = [card for card in filter(lambda card: card.can_use(player, player.game), player.hand)] if len(filtered_cards) is 0: return None renderer.targets = filtered_cards renderer.selected_target = renderer.targets[0] renderer.draw_game() self.window.addstr(0, 0, "Choose Card") self.window.refresh() ch = 0 index = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: index -= 1 if index < 0: index = len(renderer.targets) - 1 if ch == curses.KEY_RIGHT: index += 1 if index == len(renderer.targets): index = 0 renderer.selected_target = renderer.targets[index] renderer.draw_game() self.window.addstr(0, 0, "Choose Card") self.window.refresh() renderer.targets = None if ch == 27: return None return renderer.selected_target def choose_attacker(self, player): filtered_attackers = [minion for minion in filter(lambda minion: minion.can_attack(), player.minions)] if player.hero.can_attack(): filtered_attackers.append(player.hero) if len(filtered_attackers) is 0: return None renderer.targets = filtered_attackers renderer.selected_target = renderer.targets[0] renderer.draw_game() self.window.addstr(0, 0, "Choose attacker") self.window.refresh() ch = 0 index = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() self.window.addstr(0, 0, "{0}".format(ch)) self.window.refresh() if ch == curses.KEY_LEFT: index -= 1 if index < 0: index = len(renderer.targets) - 1 if ch == curses.KEY_RIGHT: index += 1 if index == len(renderer.targets): index = 0 renderer.selected_target = renderer.targets[index] renderer.draw_game() self.window.refresh() renderer.targets = None if ch == 27: return None return renderer.selected_target def do_card_check(self, cards): self.window.addstr(0, 0, "Select cards to keep (space selects/deselects a card)") keeping = [True, True, True] if len(cards) > 3: keeping.append(True) index = 0 selected = 0 for card in cards: if keeping[index]: if index == selected: color = curses.color_pair(6) else: color = curses.color_pair(5) else: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(0) self.text_window.addstr(0, index * 20, "{0:^19}".format(card.name[:19]), color) index += 1 self.window.refresh() self.text_window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: selected -= 1 if selected < 0: selected = len(cards) - 1 if ch == curses.KEY_RIGHT: selected += 1 if selected == len(cards): selected = 0 if ch == 32: keeping[selected] = not keeping[selected] index = 0 for card in cards: if keeping[index]: if index == selected: color = curses.color_pair(6) else: color = curses.color_pair(5) else: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(0) self.text_window.addstr(0, index * 20, "{0:^19}".format(card.name[:19]), color) index += 1 self.window.refresh() self.text_window.refresh() if ch == 27: return None return keeping def choose_target(self, targets): if len(targets) is 0: return None renderer.targets = targets renderer.selected_target = renderer.targets[0] renderer.draw_game() self.window.addstr(0, 0, "Choose target") self.window.refresh() ch = 0 index = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: index -= 1 if index < 0: index = len(renderer.targets) - 1 if ch == curses.KEY_RIGHT: index += 1 if index == len(renderer.targets): index = 0 renderer.selected_target = renderer.targets[index] renderer.draw_game() self.window.refresh() renderer.targets = None if ch == 27: return None return renderer.selected_target def choose_index(self, card, player): renderer.selection_index = 0 renderer.draw_game() self.window.addstr(0, 0, "Choose placement location") self.window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: renderer.selection_index -= 1 if renderer.selection_index < 0: renderer.selection_index = len(player.minions) if ch == curses.KEY_RIGHT: renderer.selection_index += 1 if renderer.selection_index > len(player.minions): renderer.selection_index = 0 renderer.draw_game() self.window.refresh() index = renderer.selection_index renderer.selection_index = -1 if ch == 27: return -1 return index def choose_option(self, options, player): self.window.addstr(0, 0, "Choose option") index = 0 selected = 0 for option in options: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) if isinstance(option, Card): self.text_window.addstr(0, index * 20, "{0:^19}".format(option.name[:19]), color) else: self.text_window.addstr(0, index * 20, "{0:^19}".format(option.card.name[:19]), color) index += 1 self.window.refresh() self.text_window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: starting_selected = selected selected -= 1 if selected < 0: selected = len(options) - 1 while not options[selected].can_choose(player) and selected != starting_selected: selected -= 1 if selected < 0: selected = len(options) - 1 if ch == curses.KEY_RIGHT: starting_selected = selected selected += 1 if selected == len(options): selected = 0 while not options[selected].can_choose(player) and selected != starting_selected: selected += 1 if selected == len(options): selected = 0 index = 0 for option in options: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) if isinstance(option, Card): self.text_window.addstr(0, index * 20, "{0:^19}".format(option.name[:19]), color) else: self.text_window.addstr(0, index * 20, "{0:^19}".format(option.card.name[:19]), color) index += 1 self.window.refresh() self.text_window.refresh() if ch == 27: return None return options[selected] def exit_word(window, string): window.clear() window.addstr(0, 0, string + " " + "Game is ending in 5 seconds.") window.refresh() time.sleep(5) sys.exit() def log(string): with open("demo_log.txt", "a+") as f: f.write(str(time.ctime()) + " " + string) stdscr.clear() prompt_window = stdscr.derwin(1, 80, 23, 0) text_window = stdscr.derwin(1, 80, 24, 0) generator = RandomDeckGenerator() path = "models/st_fs_deep_neural_40000.t" with open(path, "rb") as f: model = pickle.load(f) agent = StrategyAgent(model, "AI", 5) deck1 = generator.generate() deck2 = deck1.copy() game = Game([deck1, deck2], [TextAgent(stdscr, prompt_window, text_window), agent]) if game.first_player == 0: renderer = GameRender(stdscr, game, game.players[0]) else: renderer = GameRender(stdscr, game, game.players[1]) try: game.start() except Exception as e: exit_word(text_window, "Sorry, an error occurred.") if game.game_ended: if not game.winner is None: if game.winner.agent is agent: log("AI win.") exit_word(prompt_window, "You lost!") else: log("Human win.") exit_word(prompt_window, "You won!") else: log("Draw.") exit_word(prompt_window, "There is no winner!")
def render_game(stdscr): class TextAgent: def __init__(self, game_window, prompt_window, text_window): self.window = prompt_window self.game_window = game_window self.text_window = text_window curses.init_pair(5, curses.COLOR_WHITE, curses.COLOR_CYAN) curses.init_pair(6, curses.COLOR_BLACK, curses.COLOR_GREEN) def do_turn(self, player): renderer.draw_game() index = 0 action = self.choose_action() while not (action == "quit" or action == "end"): if action == "play": card = self.choose_card(player) if card is not None: player.game.play_card(card) elif action == "attack": attacker = self.choose_attacker(player) if attacker is not None: attacker.attack() elif action == "power": if player.hero.power.can_use(): player.hero.power.use() index += 1 renderer.draw_game() action = self.choose_action() if action == "quit": sys.exit(0) def choose_action(self): self.window.addstr(0, 0, "Choose action") actions = ["play", "attack", "power", "end", "quit"] index = 0 selected = 0 for action in actions: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) self.text_window.addstr( 0, index * 10, "{0:^9}".format(action), color) index += 1 self.window.refresh() self.text_window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: selected -= 1 if selected < 0: selected = len(actions) - 1 if ch == curses.KEY_RIGHT: selected += 1 if selected == len(actions): selected = 0 index = 0 for action in actions: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) self.text_window.addstr( 0, index * 10, "{0:^9}".format(action), color) index += 1 self.window.refresh() self.text_window.refresh() if ch == 27: return None return actions[selected] def choose_card(self, player): filtered_cards = [card for card in filter( lambda card: card.can_use(player, player.game), player.hand)] if len(filtered_cards) is 0: return None renderer.targets = filtered_cards renderer.selected_target = renderer.targets[0] renderer.draw_game() self.window.addstr(0, 0, "Choose Card") self.window.refresh() ch = 0 index = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: index -= 1 if index < 0: index = len(renderer.targets) - 1 if ch == curses.KEY_RIGHT: index += 1 if index == len(renderer.targets): index = 0 renderer.selected_target = renderer.targets[index] renderer.draw_game() self.window.addstr(0, 0, "Choose Card") self.window.refresh() renderer.targets = None if ch == 27: return None return renderer.selected_target def choose_attacker(self, player): filtered_attackers = [minion for minion in filter( lambda minion: minion.can_attack(), player.minions)] if player.hero.can_attack(): filtered_attackers.append(player.hero) if len(filtered_attackers) is 0: return None renderer.targets = filtered_attackers renderer.selected_target = renderer.targets[0] renderer.draw_game() self.window.addstr(0, 0, "Choose attacker") self.window.refresh() ch = 0 index = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() self.window.addstr(0, 0, "{0}".format(ch)) self.window.refresh() if ch == curses.KEY_LEFT: index -= 1 if index < 0: index = len(renderer.targets) - 1 if ch == curses.KEY_RIGHT: index += 1 if index == len(renderer.targets): index = 0 renderer.selected_target = renderer.targets[index] renderer.draw_game() self.window.refresh() renderer.targets = None if ch == 27: return None return renderer.selected_target def do_card_check(self, cards): self.window.addstr( 0, 0, "Select cards to keep (space selects/deselects a card)") keeping = [True, True, True] if len(cards) > 3: keeping.append(True) index = 0 selected = 0 for card in cards: if keeping[index]: if index == selected: color = curses.color_pair(6) else: color = curses.color_pair(5) else: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(0) self.text_window.addstr( 0, index * 20, "{0:^19}".format(card.name[:19]), color) index += 1 self.window.refresh() self.text_window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: selected -= 1 if selected < 0: selected = len(cards) - 1 if ch == curses.KEY_RIGHT: selected += 1 if selected == len(cards): selected = 0 if ch == 32: keeping[selected] = not keeping[selected] index = 0 for card in cards: if keeping[index]: if index == selected: color = curses.color_pair(6) else: color = curses.color_pair(5) else: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(0) self.text_window.addstr( 0, index * 20, "{0:^19}".format(card.name[:19]), color) index += 1 self.window.refresh() self.text_window.refresh() if ch == 27: return None return keeping def choose_target(self, targets): if len(targets) is 0: return None renderer.targets = targets renderer.selected_target = renderer.targets[0] renderer.draw_game() self.window.addstr(0, 0, "Choose target") self.window.refresh() ch = 0 index = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: index -= 1 if index < 0: index = len(renderer.targets) - 1 if ch == curses.KEY_RIGHT: index += 1 if index == len(renderer.targets): index = 0 renderer.selected_target = renderer.targets[index] renderer.draw_game() self.window.refresh() renderer.targets = None if ch == 27: return None return renderer.selected_target def choose_index(self, card, player): renderer.selection_index = 0 renderer.draw_game() self.window.addstr(0, 0, "Choose placement location") self.window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: renderer.selection_index -= 1 if renderer.selection_index < 0: renderer.selection_index = len(player.minions) if ch == curses.KEY_RIGHT: renderer.selection_index += 1 if renderer.selection_index > len(player.minions): renderer.selection_index = 0 renderer.draw_game() self.window.refresh() index = renderer.selection_index renderer.selection_index = -1 if ch == 27: return -1 return index def choose_option(self, options, player): self.window.addstr(0, 0, "Choose option") index = 0 selected = 0 for option in options: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) if isinstance(option, Card): self.text_window.addstr( 0, index * 20, "{0:^19}".format(option.name[:19]), color) else: self.text_window.addstr( 0, index * 20, "{0:^19}".format(option.card.name[:19]), color) index += 1 self.window.refresh() self.text_window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: starting_selected = selected selected -= 1 if selected < 0: selected = len(options) - 1 while not options[selected].can_choose(player) and selected != starting_selected: selected -= 1 if selected < 0: selected = len(options) - 1 if ch == curses.KEY_RIGHT: starting_selected = selected selected += 1 if selected == len(options): selected = 0 while not options[selected].can_choose(player) and selected != starting_selected: selected += 1 if selected == len(options): selected = 0 index = 0 for option in options: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) if isinstance(option, Card): self.text_window.addstr( 0, index * 20, "{0:^19}".format(option.name[:19]), color) else: self.text_window.addstr( 0, index * 20, "{0:^19}".format(option.card.name[:19]), color) index += 1 self.window.refresh() self.text_window.refresh() if ch == 27: return None return options[selected] class GraphAgent: def __init__(self, game_window, prompt_window, text_window): self.window = prompt_window self.game_window = game_window self.text_window = text_window curses.init_pair(5, curses.COLOR_WHITE, curses.COLOR_CYAN) curses.init_pair(6, curses.COLOR_BLACK, curses.COLOR_GREEN) def do_turn(self, player): renderer.draw_game() index = 0 action = self.choose_action() while not (action == "quit" or action == "end"): if action == "play": card = self.choose_card(player) if card is not None: player.game.play_card(card) elif action == "attack": attacker = self.choose_attacker(player) if attacker is not None: attacker.attack() elif action == "power": if player.hero.power.can_use(): player.hero.power.use() index += 1 renderer.draw_game() action = self.choose_action() if action == "quit": sys.exit(0) def choose_action(self): self.window.addstr(0, 0, "Choose action") actions = ["play", "attack", "power", "end", "quit"] index = 0 selected = 0 for action in actions: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) self.text_window.addstr( 0, index * 10, "{0:^9}".format(action), color) index += 1 self.window.refresh() self.text_window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: selected -= 1 if selected < 0: selected = len(actions) - 1 if ch == curses.KEY_RIGHT: selected += 1 if selected == len(actions): selected = 0 index = 0 for action in actions: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) self.text_window.addstr( 0, index * 10, "{0:^9}".format(action), color) index += 1 self.window.refresh() self.text_window.refresh() if ch == 27: return None return actions[selected] def choose_card(self, player): filtered_cards = [card for card in filter( lambda card: card.can_use(player, player.game), player.hand)] if len(filtered_cards) is 0: return None renderer.targets = filtered_cards renderer.selected_target = renderer.targets[0] renderer.draw_game() self.window.addstr(0, 0, "Choose Card") self.window.refresh() ch = 0 index = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: index -= 1 if index < 0: index = len(renderer.targets) - 1 if ch == curses.KEY_RIGHT: index += 1 if index == len(renderer.targets): index = 0 renderer.selected_target = renderer.targets[index] renderer.draw_game() self.window.addstr(0, 0, "Choose Card") self.window.refresh() renderer.targets = None if ch == 27: return None return renderer.selected_target def choose_attacker(self, player): filtered_attackers = [minion for minion in filter( lambda minion: minion.can_attack(), player.minions)] if player.hero.can_attack(): filtered_attackers.append(player.hero) if len(filtered_attackers) is 0: return None renderer.targets = filtered_attackers renderer.selected_target = renderer.targets[0] renderer.draw_game() self.window.addstr(0, 0, "Choose attacker") self.window.refresh() ch = 0 index = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() self.window.addstr(0, 0, "{0}".format(ch)) self.window.refresh() if ch == curses.KEY_LEFT: index -= 1 if index < 0: index = len(renderer.targets) - 1 if ch == curses.KEY_RIGHT: index += 1 if index == len(renderer.targets): index = 0 renderer.selected_target = renderer.targets[index] renderer.draw_game() self.window.refresh() renderer.targets = None if ch == 27: return None return renderer.selected_target def do_card_check(self, cards): self.window.addstr( 0, 0, "Select cards to keep (space selects/deselects a card)") keeping = [True, True, True] if len(cards) > 3: keeping.append(True) index = 0 selected = 0 for card in cards: if keeping[index]: if index == selected: color = curses.color_pair(6) else: color = curses.color_pair(5) else: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(0) self.text_window.addstr( 0, index * 20, "{0:^19}".format(card.name[:19]), color) index += 1 self.window.refresh() self.text_window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: selected -= 1 if selected < 0: selected = len(cards) - 1 if ch == curses.KEY_RIGHT: selected += 1 if selected == len(cards): selected = 0 if ch == 32: keeping[selected] = not keeping[selected] index = 0 for card in cards: if keeping[index]: if index == selected: color = curses.color_pair(6) else: color = curses.color_pair(5) else: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(0) self.text_window.addstr( 0, index * 20, "{0:^19}".format(card.name[:19]), color) index += 1 self.window.refresh() self.text_window.refresh() if ch == 27: return None return keeping def choose_target(self, targets): if len(targets) is 0: return None renderer.targets = targets renderer.selected_target = renderer.targets[0] renderer.draw_game() self.window.addstr(0, 0, "Choose target") self.window.refresh() ch = 0 index = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: index -= 1 if index < 0: index = len(renderer.targets) - 1 if ch == curses.KEY_RIGHT: index += 1 if index == len(renderer.targets): index = 0 renderer.selected_target = renderer.targets[index] renderer.draw_game() self.window.refresh() renderer.targets = None if ch == 27: return None return renderer.selected_target def choose_index(self, card, player): renderer.selection_index = 0 renderer.draw_game() self.window.addstr(0, 0, "Choose placement location") self.window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: renderer.selection_index -= 1 if renderer.selection_index < 0: renderer.selection_index = len(player.minions) if ch == curses.KEY_RIGHT: renderer.selection_index += 1 if renderer.selection_index > len(player.minions): renderer.selection_index = 0 renderer.draw_game() self.window.refresh() index = renderer.selection_index renderer.selection_index = -1 if ch == 27: return -1 return index def choose_option(self, options, player): self.window.addstr(0, 0, "Choose option") index = 0 selected = 0 for option in options: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) if isinstance(option, Card): self.text_window.addstr( 0, index * 20, "{0:^19}".format(option.name[:19]), color) else: self.text_window.addstr( 0, index * 20, "{0:^19}".format(option.card.name[:19]), color) index += 1 self.window.refresh() self.text_window.refresh() ch = 0 while ch != 10 and ch != 27: ch = self.game_window.getch() if ch == curses.KEY_LEFT: starting_selected = selected selected -= 1 if selected < 0: selected = len(options) - 1 while not options[selected].can_choose(player) and selected != starting_selected: selected -= 1 if selected < 0: selected = len(options) - 1 if ch == curses.KEY_RIGHT: starting_selected = selected selected += 1 if selected == len(options): selected = 0 while not options[selected].can_choose(player) and selected != starting_selected: selected += 1 if selected == len(options): selected = 0 index = 0 for option in options: if index == selected: color = curses.color_pair(4) else: color = curses.color_pair(3) if isinstance(option, Card): self.text_window.addstr( 0, index * 20, "{0:^19}".format(option.name[:19]), color) else: self.text_window.addstr( 0, index * 20, "{0:^19}".format(option.card.name[:19]), color) index += 1 self.window.refresh() self.text_window.refresh() if ch == 27: return None return options[selected] def show_text(screen, position, text, color, font_bold=False, font_size=13, font_italic=False): cur_font = pygame.font.SysFont("Monaco", font_size) cur_font.set_bold(font_bold) cur_font.set_italic(font_italic) text_fmt = cur_font.render(text, 1, color) screen.blit(text_fmt, position) def choose_agent(window): agents = registry.get_names() curses.init_pair(3, curses.COLOR_WHITE, curses.COLOR_BLUE) window.addstr(10, 34, "Choose agent") ch = 0 selected = 0 while ch != 10 and ch != 27: index = 0 for agent in agents: if index == selected: color = curses.color_pair(3) else: color = curses.color_pair(0) window.addstr(index + 11, 25, "{:^30}".format(agent), color) index += 1 window.refresh() ch = window.getch() if ch == curses.KEY_UP: selected -= 1 if selected < 0: selected = len(agents) - 1 if ch == curses.KEY_DOWN: selected += 1 if selected == len(agents): selected = 0 window.clear() if ch == 27: sys.exit(0) else: return registry.create_agent(agents[selected]) stdscr.clear() pygame.init() game_window = pygame.display.set_mode((1366, 768), 0, 32) background = pygame.image.load('background.jpg').convert() o_field = pygame.image.load('field.png').convert() end_turn_btn = End_turn_btn(game_window, None, None, (1200, 370)) field_size = width, height = 840, 240 pygame.mouse.set_cursor(*pygame.cursors.tri_left) prompt_window = stdscr.derwin(1, 80, 23, 0) text_window = stdscr.derwin(1, 80, 24, 0) agent = registry.create_agent(registry.get_names()[0]) deck1 = load_deck(sys.argv[1]) deck2 = load_deck(sys.argv[2]) game = Game([deck1, deck2], [TextAgent( stdscr, prompt_window, text_window), agent]) if game.first_player == 0: renderer = GameRender(stdscr, game, game.players[0]) pass else: renderer = GameRender(stdscr, game, game.players[1]) pass current_player = game.players[1] game.pre_game() while(True): pygame.time.Clock().tick(40) for event in pygame.event.get(): if event.type == QUIT: exit() if event.type == pygame.MOUSEMOTION: pass if event.type == pygame.MOUSEBUTTONDOWN: if end_turn_btn.isOver(): end_turn_btn.status = 'hover' pass if event.type == pygame.MOUSEBUTTONUP: if end_turn_btn.isOver(): if end_turn_btn.status == 'hover': game._end_turn() end_turn_btn.status = 'unclicked' else: end_turn_btn.status = 'unclicked' pass #TODO: Render tables game_window.blit(background, (0, 0)) #opponent's field game_window.blit(o_field, ((1366 - 880) / 2, 768 / 2 - height - 1)) #my field game_window.blit(o_field, ((1366 - 880) / 2, 768 / 2 + 1)) end_turn_btn.render() show_text(game_window, (end_turn_btn.position),end_turn_btn.status,(150,150,150)) #TODO: Capture mouse status and generate action pygame.display.update() #刷新一下画面 # self.pre_game() # self.current_player = self.players[1] # while not self.game_ended: # self.play_single_turn() game.start()
# index += 1 # self.window.refresh() # self.text_window.refresh() # if ch == 27: # return None # # return options[selected] if __name__ == '__main__': if len(sys.argv) < 3: port = int(sys.argv[2]) print('Usage: COMMAND host port') sys.exit(1) deck1 = load_deck("zoo.hsdeck") deck2 = load_deck("zoo.hsdeck") logfile = open('hearthbreaker.log', 'a') while True: agent = WebAgent(sys.argv[1], sys.argv[2]) ggame = Game([deck1, deck2], [(agent, "webagent"), (SimpleUCTAgent(0.2, 10), "uct")]) try: ggame.start() agent.reconnect() except ConnectionResetError: logfile.write('Restart game due to connection reset\n') agent.reconnect() except Exception as e: traceback.print_exc(file=logfile) logfile.write('\n') agent.reconnect()