class CLIRunner: def __init__(self): self.board = GameBoard() self.ai = Expectimax() self.init_game() print_board(self.board) self.run_game() self.over = False def init_game(self): self.insert_random_tile() self.insert_random_tile() def run_game(self): moves = 0 while True and moves < 2: move = self.ai.get_move(self.board) print("Player's Turn:", end="") self.board.move(move) print(dirs[move]) print_board(self.board) print("Computer's Turn") self.insert_random_tile() print_board(self.board) if len(self.board.get_available_moves()) == 0: print("GAME OVER (max tile): " + str(self.board.get_max_tile())) break moves += 1 if DELAY: time.sleep(DELAY) def insert_random_tile(self): if randint(0,99) < 100 * 0.9: value = 2 else: value = 4 cells = self.board.get_available_cells() pos = cells[randint(0, len(cells) - 1)] if cells else None if pos is None: return None else: self.board.insert_tile(pos, value) return pos
class Batch: def __init__(self): # MEASURES self.total_moves_time = 0 self.total_moves = 0 self.fastest_move = -1 self.longest_move = 0 self.time_to_reach = [] # setup game & ai self.board = GameBoard() self.ai = Expectimax() self.init_game() # run ai on game self.start = timer() self.run_game() end = timer() # MEASURES self.total_time = end - self.start # total time to run self.avg_move_time = self.total_moves_time / self.total_moves # moves done self.max_tile = self.board.get_max_tile() # max tile self.states_visited = self.ai.states_visited # states visited def init_game(self): self.insert_random_tile() self.insert_random_tile() def run_game(self): cur_max_tile = 8 while True: move_start = timer() move = self.ai.get_move(self.board) move_end = timer() # save move time move_time = move_end - move_start self.total_moves_time += move_time self.total_moves += 1 if self.fastest_move == -1 or move_time < self.fastest_move: self.fastest_move = move_time if move_time > self.longest_move: self.longest_move = move_time # do the actual move + the response self.board.move(move) self.insert_random_tile() # check if we got a bigger tile if cur_max_tile in self.board.grid: reached_end = timer() self.time_to_reach.append((cur_max_tile, reached_end - self.start)) cur_max_tile *= 2 # if no more moves, game over if len(self.board.get_available_moves()) == 0: break def insert_random_tile(self): if randint(0,99) < 100 * 0.9: value = 2 else: value = 4 cells = self.board.get_available_cells() pos = cells[randint(0, len(cells) - 1)] if cells else None if pos is None: return None else: self.board.insert_tile(pos, value) return pos