我正在开发一个可以玩井字游戏的极小极大算法,但不知为何,max_value和min_value函数偶尔会返回None。
def player(board): if Terminal(board) != False: return None else: if turn(board) == "X": value,move = max_value(board) return move else: value,move = min_value(board) return move def max_value(board): if Terminal(board) != False: return Utility(board),None else: v = -1000 move = None for action in Actions(board): aux,act = min_value(Result(board,action)) print(aux) if aux > v: v = aux move = action if v == 1: return v,move return v,movedef min_value(board): if Terminal(board) != False: return Utility(board),None else: v = 1000 move = None for action in Actions(board): aux,act = max_value(Result(board,action)) print(aux) if aux < v: v = aux move = action if v == -1: return v,move return v,move
Terminal函数返回游戏状态,Action函数返回可能的移动,Result函数根据给定的动作创建棋盘。
我得到的错误是'>' not supported between instances of 'NoneType' and 'int'
,这个错误出现在if aux < v:
和if aux > v:
处。当我打印aux时,它偶尔会显示为None
。谢谢。
回答:
你分享的代码是正确的。
错误信息表明Utility
在调用时返回了None
。这不应该发生。Utility
在游戏结束时应该始终返回一个整数,根据你的代码,它应该返回-1、0或1。
还有一种可能性是Utility
在游戏未结束时返回None,但Terminal
存在错误,即使游戏未结束,它也会返回非False
的值。
以下是Terminal
和Utility
函数的实现,它们不会产生你遇到的问题,并且按预期工作。
实际上,我根据一个由9个字符组成的字符串表示的棋盘,添加了所有缺失的函数,以及一个游戏循环,这样你就可以与极小极大算法对战了:
import redef Utility(board): m = re.findall(r"([XO])(?:\1\1(?:...)*$|..\1..\1|...\1...\1|.\1.\1..$)", board) return -1 if "O" in m else len(m) def Terminal(board): return "O X"[Utility(board)+1].strip() or not board.count(".") and "draw"def turn(board): return "OX"[board.count(".") % 2]def Actions(board): return (i for i in range(9) if board[i] == ".")def Result(board, action): return board[:action] + turn(board) + board[action+1:]board = "." * 9while True: # 人机交互游戏 print(f"{board[:3]}\n{board[3:6]}\n{board[6:]}") winner = Terminal(board) if winner: print(f"获胜者: {winner}") break if turn(board) == "X": action = int(input("你的移动(0..8)? ")) if board[action] != ".": print("无效移动。请重试。") continue else: action = player(board) print("极小极大算法选择", action) board = Result(board, action)