首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >赋值前引用的局部变量'beta‘

赋值前引用的局部变量'beta‘
EN

Stack Overflow用户
提问于 2021-12-04 12:36:01
回答 1查看 24关注 0票数 0

我的程序使用极大极小算法来选择在tic-tac-toe中针对人类玩家的最优移动。(这是有效的)

在那之后,我尝试实现alpha-beta-pruning,以优化算法所需的时间,以便获得最优移动。(这不起作用)

我知道为什么会出现这个错误,但我不明白为什么这个错误是由'alpha‘和'beta’引发的,而不是由'board‘、'minX’或'minY‘引发的。

我认为我声明的变量都应该是全局变量,对吗?

错误: UnboundLocalError:赋值前引用了局部变量'beta‘

代码语言:javascript
复制
#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 < beta:
          break
        wert = min()
        board[x][y] = "-"
        if wert > 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 > beta:
          break
        wert = max()
        board[x][y] = "-"
        if wert < 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 > beta:
          break
        wert = max()
        board[x][y] = "-"
        if wert < 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()
EN

回答 1

Stack Overflow用户

发布于 2021-12-04 18:00:26

你应该将alpha和beta分别设置为-999和999,而不是maximalwert,这应该是可行的。看一下minimax的伪代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70225628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档