def abminval(board, turn, a, b): val = 2 # has to be less than owin # check whose turn it is... if turn == common.constants.O: next_ = common.constants.X else: next_ = common.constants.O # Check if the game is already finished or not... gstat = common.game_status(board) if gstat == common.constants.O: val = -1 elif gstat == common.constants.X: val = 1 elif common.constants.NONE not in board: val = 0 else: for i in range(3): for j in range(3): cval = common.get_cell(board, i, j) if cval == common.constants.NONE: newboard = board[:] common.set_cell(newboard, i, j, turn) val = min(val, abmaxval(newboard, next_, a, b)) if val <= a: return val b = min(val, b) return val
def min_value(board, a, b): """ Returns the minimum value for thr board. """ # initialize v = +infinity v = 1000000 # Check state result = common.game_status(board) # Check results if result == common.constants.X: return 1 elif result == common.constants.O: return -1 elif check_tie(board): return 0 # If game is not finished - check the value of v for y in range(TICTACTOE_HEIGHT): for x in range(TICTACTOE_WIDTH): if common.get_cell(board, y, x) == common.constants.NONE: new_board = board[:] common.set_cell(new_board, y, x, common.constants.O) v = min(v, max_value(new_board, a, b)) # For abprun_tictactoe() if (a is not None) and (b is not None): if v <= a: return v b = min(b, v) return v
def is_terminal(self): status = common.game_status(self.board) # 1 if X wins, 2 if O wins, 0 else if is_tie(self.board) or status != 0: self.outcome = status return True else: return False
def abprun_tictactoe_helper(board, turn, alpha, beta): result = common.game_status(board) #common.print_board(board) #print("\n") if result == common.constants.O or result == common.constants.X: return result if result == common.constants.NONE and isFull(board) == 1: return result if turn == common.constants.X: return max_val_ABPrun(board, alpha, beta) if turn == common.constants.O: return min_val_ABPrun(board, alpha, beta)
def min_value(state, turn): v = 10000 status = common.game_status(state) if status == common.constants.X: return 1 elif (common.constants.NONE not in state and status == common.constants.NONE): return 0 elif status == common.constants.O: return -1 for successor in expand(state, turn): v = min(v, max_value(successor, common.constants.X)) return v
def min_value(board): v = common.constants.X result = common.game_status(board) if ((result == common.constants.X) or (result == common.constants.O)): return result elif tie(board): return common.constants.NONE else: for i in range(0, len(board)): if board[i] == 0: board[i] = common.constants.O v = minimum(v, max_value(board)) board[i] = 0 return v
def minmax_tictactoe(board, turn): result = common.game_status(board) # terminal state, someone winning if result == common.constants.X or result == common.constants.O: return result # terminal state, tie if result == common.constants.NONE and boardFull(board): return result # otherwise, keep playing if turn == common.constants.X: return maxX(board) if turn == common.constants.O: return maxO(board)
def abmin_value(state, turn, alpha, beta): v = 10000 status = common.game_status(state) if status == common.constants.X: return 1 if (common.constants.NONE not in state and status == common.constants.NONE): return 0 if status == common.constants.O: return -1 for successor in expand(state, turn): v = min(v, abmax_value(successor, common.constants.X, alpha, beta)) if v <= alpha: return v beta = min(beta, v) return v
def ab_min_value(board, alpha, beta): v = common.constants.X result = common.game_status(board) if ((result == common.constants.X) or (result == common.constants.O)): return result elif tie(board): return common.constants.NONE else: for i in range(0, len(board)): if board[i] == 0: board[i] = common.constants.O v = minimum(v, ab_max_value(board, alpha, beta)) board[i] = 0 if (v == minimum(v, alpha)): return v beta = minimum(beta, v) return v
def minmax_tictactoe(board, turn): #put your code here: #it must return common.constants.X(1), common.constants.O(2) or common.constants.NONE(0) for tie. #use the function common.game_status(board), to evaluate a board #it returns common.constants.X(1) if X wins, common.constants.O(2) if O wins or common.constants.NONE(0) if tie or game is not finished #the program will keep track of the number of boards evaluated #result = common.game_status(board); result = common.game_status(board) #common.print_board(board) # print("\n") if result == common.constants.O or result == common.constants.X: return result if result == common.constants.NONE and isFull(board) == 1: return result if turn == common.constants.X: return max_val(board) if turn == common.constants.O: return min_val(board)
def minvalue(board_state): score = float('inf') #initialize the score result = common.game_status(board_state) if result == common.constants.X: return 1 elif result == common.constants.O: return -1 elif istie_game(board_state): # common.print_board(board_state) return 0 # return common.constants.NONE else: for i in range(0, len(board_state)): if board_state[i] == 0: board_state[i] = common.constants.O score = min(score, maxvalue(board_state)) board_state[i] = 0 return score
def abprun_helper(board, turn, alpha, beta): result = common.game_status(board) # alpha is worst so far for O alpha = common.constants.X # beta is worst so far for X beta = common.constants.O # terminal state, someone winning if result == common.constants.X or result == common.constants.O: return result # terminal state, tie if result == common.constants.NONE and boardFull(board): return result # otherwise, keep playing if turn == common.constants.X: return maxAbX(board, alpha, beta) if turn == common.constants.O: return maxAbO(board, alpha, beta)
def maximizer(board, prune, alpha, beta): status = common.game_status(board) if (status != 0) or (is_complete(board) and status == 0): if status == 2: return -1 else: return status else: v = float('-inf') for i in range(9): if board[i] == 0: board[i] = 1 v = max(v, minimizer(board, prune, alpha, beta)) board[i] = 0 if prune: if v >= beta: return v alpha = max(alpha, v) return v
def maxvalue_ab(board_state, a, b): score = float('-inf') #initialize the score result = common.game_status(board_state) if result == common.constants.X: return 1 elif result == common.constants.O: return -1 elif istie_game(board_state): # common.print_board(board_state) return 0 # return common.constants.NONE else: for i in range(0, len(board_state)): if board_state[i] == 0: board_state[i] = common.constants.X score = max(score, minvalue_ab(board_state, a, b)) board_state[i] = 0 if score >= b: return score a = max(a, score) return score
def set_outcome(self): self.outcome = common.game_status(self.board)