локальная переменная «бета», на которую ссылаются перед назначением

#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, это должно сработать. Посмотрите на псевдокод для минимакса.