#variables #global-variables #tic-tac-toe #minimax #alpha-beta-pruning
Вопрос:
Моя программа использует минимаксный алгоритм для выбора наиболее оптимального хода против человеческого игрока в крестики-нолики. (это работает)
После этого я попытался реализовать альфа-бета-обрезку, чтобы оптимизировать время, необходимое алгоритму для получения оптимального хода. (это не работает)
Я знаю, почему возникает ошибка, но я не понимаю, почему ошибка возникает из-за «альфа» и «бета», а не из-за «доски», «шалуньи» или «минИ».
Я думаю, что все переменные, которые я объявил, должны быть глобальными переменными, не так ли?
Ошибка: UnboundLocalError: локальная переменная «бета», на которую ссылались перед назначением
#Global Variables values = [0,1,2] minX = 0 minY = 0 alpha = -999 beta = 999 global alpha global beta board = [["-" for x in range(3)] for y in range(3)] #ausgabe def ausgabe(): for zeile in range(3): for spalte in range(3): print("|" str(board[zeile][spalte]),end="") print("|") #auswertung #liefert 0, wenn O gewonnen hat #liefert 2, wenn X gewonnen hat #liefert 1, wenn es unentschieden ausgeht #liefert -1 wenn noch nicht klar def auswertung(): for i in ("X", "O"): for x in range(3): if board[x][0] == i and board[x][1] == i and board[x][2] == i: return i for y in range(3): if board[0][y] == i and board[1][y] == i and board[2][y] == i: return i if board[0][0] == i and board[1][1] == i and board[2][2] == i: return i if board[0][2] == i and board[1][1] == i and board[2][0] == i: return i for zeile in range(3): for spalte in range(3): if board[zeile][spalte] == "-": return -1 return 1 #max def max(): temp = auswertung() if temp != -1: if temp == "X": return 2 elif temp == "O": return 0 else: return temp maximalwert = -999 for x in range(3): for y in range(3): if board[x][y] == "-": board[x][y] = "X" temp = alpha alpha = beta beta = temp if alpha lt; beta: break wert = min() board[x][y] = "-" if wert gt; maximalwert: maximalwert = wert return maximalwert #min def min(): temp = auswertung() if temp != -1: if temp == "X": return 2 elif temp == "O": return 0 else: return temp minimalwert = 999 for x in range(3): for y in range(3): if board[x][y] == "-": board[x][y] = "O" temp = beta beta = alpha alpha = temp if alpha gt; beta: break wert = max() board[x][y] = "-" if wert lt; minimalwert: minimalwert = wert return minimalwert #wo befindet sich das min def minWo(): temp = auswertung() if temp != -1: if temp == "X": return 2 elif temp == "O": return 0 else: return temp global minX global minY minimalwert = 999 for x in range(3): for y in range(3): if board[x][y] == "-": board[x][y] = "O" temp = beta beta = alpha alpha = temp if alpha gt; beta: break wert = max() board[x][y] = "-" if wert lt; minimalwert: minX = x minY = y minimalwert = wert return minimalwert def user_input(): while True: try: number1 = int(input("number1: ")) number2 = int(input("number2: ")) if number1 in values and number2 in values: if board[number1][number2] == "-": return number1, number2 else: print("Invalid Input!ttry again") except ValueError: print("Invalid Input!ttry again") def game_still_going(): winner = auswertung() if winner == "X" or winner == "O": print("Player " winner " won the game") return False elif winner == 1: print("It's a draw") return False return True def play_game(): while game_still_going(): number1,number2 = user_input() board[number1][number2] = "X" minWo() board[minX][minY] = "O" ausgabe() play_game()
Комментарии:
1. Я решил ошибку, которую я допустил с альфа-бета-обрезкой, но я все еще не понимаю, почему переменные «альфа» и «бета» должны указываться вручную, если они являются глобальными.
Ответ №1:
Вы должны установить альфа-и бета-версии на -999 и 999 вместо maximalwert, это должно сработать. Посмотрите на псевдокод для минимакса.