from board import Board from player import Player from bot import Bot from restore_bot import RestoreBot from cup import Cup import numpy as np class Game: def __init__(self, config = None): self.config = config self.board = Board.initial_state self.p1 = None self.p2 = None # TODO remove this self.cup = Cup() def set_up_bots(self): self.p1 = Bot(1, config = self.config, name = "p1") self.p2 = Bot(1, config = self.config, name = "p2") def roll(self): return self.cup.roll() def best_move_and_score(self): roll = self.roll() move_and_val = self.p1.make_move(self.board, self.p1.get_sym(), roll) self.board = move_and_val[0] return move_and_val def next_round(self): roll = self.roll() #print(roll) self.board = Board.flip(self.p2.make_move(Board.flip(self.board), self.p2.get_sym(), roll)[0]) return self.board def board_state(self): return self.board def play_against_player(self): self.board = Board.initial_state coin_flip = random.random() if coin_flip > 0.5: user_color = input("Pick a number, 1 (white) or -1 (black)") if int(user_color) == 1: p1 = Player(1) p2 = Bot(-1) else: p1 = Bot(1) p2 = Player(-1) else: p1 = Bot(1) p2 = Player(-1) # Since we have to make sure that the Bot always plays as if it's white, we have to flip # the board when it's not actually. if p1.__name__ == "Bot" and p1.get_sym() == 1: while Board.outcome(self.board) == None: roll = self.roll() self.board = p1.make_move(self.board, p1.get_sym(), roll) roll = self.roll() self.board = p2.make_move(self.board, p2.get_sym(), roll) if p1.__name__ == "Bot" and p1.get_sym() == -1: while Board.outcome(self.board) == None: roll = self.roll() self.board = Board.flip(p1.make_move(Board.flip(self.board), p1.get_sym(), roll)) roll = self.roll() self.board = p2.make_move(self.board, p2.get_sym(), roll) if p2.__name__ == "Bot" and p1.get_sym() == -1: while Board.outcome(self.board) == None: roll = self.roll() self.board = p1.make_move(self.board, p1.get_sym(), roll) roll = self.roll() self.board = Board.flip(p2.make_move(Board.flip(self.board), p2.get_sym(), roll)) print(Board.outcome(self.board)) def next_round_test(self): print(self.board) print() self.next_round() print("--------------------------------") print(self.board) print("--------------------------------") def play(self, episodes = 1000): outcomes = [] for i in range(episodes): self.board = Board.initial_state while Board.outcome(self.board) is None: # count += 1 # print("Turn:",count) roll = self.roll() # print("type of board: ", type(self.board)) # print("Board:",self.board) # print("{} rolled: {}".format(self.p1.get_sym(), roll)) self.board = (self.p1.make_random_move(self.board, self.p1.get_sym(), roll)) # print(self.board) # print() # count += 1 roll = self.roll() # print("{} rolled: {}".format(self.p2.get_sym(), roll)) self.board = Board.flip(self.p2.make_random_move(Board.flip(self.board), self.p2.get_sym(), roll)) if Board.outcome(self.board)[1] > 0: print_winner = "1: White, " + str(Board.outcome(self.board)) else: print_winner = "-1: Black " + str(Board.outcome(self.board)) outcomes.append(Board.outcome(self.board)[1]) print("The winner is {}!".format(print_winner)) print("Round:",i) # print("Final board:",Board.pretty(self.board)) return outcomes # return count highest = 0