Python 使用具有元组和浮点的极大极小算法时出现类型错误

Python 使用具有元组和浮点的极大极小算法时出现类型错误,python,artificial-intelligence,tic-tac-toe,minimax,Python,Artificial Intelligence,Tic Tac Toe,Minimax,我目前正在做一个项目,我需要实现一个极小极大算法来创建一个tic-tac-toe游戏。在某个时刻,我正在比较元组和浮点,虽然我知道这实际上不可能做到,但我不知道这个问题是从哪里来的,也不知道如何解决它。如果有人能帮我理解这一点,那就太棒了。谢谢 这是我的密码 import copy X = "X" O = "O" EMPTY = None def initial_state(): """ Returns

我目前正在做一个项目,我需要实现一个极小极大算法来创建一个tic-tac-toe游戏。在某个时刻,我正在比较元组和浮点,虽然我知道这实际上不可能做到,但我不知道这个问题是从哪里来的,也不知道如何解决它。如果有人能帮我理解这一点,那就太棒了。谢谢

这是我的密码

import copy

X = "X"
O = "O"
EMPTY = None


def initial_state():
    """
    Returns starting state of the board.
    """
    return [[EMPTY, EMPTY, EMPTY],
            [EMPTY, EMPTY, EMPTY],
            [EMPTY, EMPTY, EMPTY]]


def player(board):
    Xboard_count = board[0].count(X) + board[1].count(X) + board[2].count(X)
    if Xboard_count % 2 == 1:
        return 0
    else:
        return X



def actions(board):
    """
    Returns set of all possible actions (i, j) available on the board.
    """
    move = []
    for i in range(3):
        for j in range(3):
            if board[i][j] == EMPTY:
                move.append((i, j))

    return move


def result(board, move):
    """
    Returns the board that results from making move (i, j) on the board.
    """
    if move not in actions(board):
        raise Exception("this action is not a valid action")

    dcopb = copy.deepcopy(board)
    dcopb[move[0]][move[1]] = player(board)

    return dcopb


def winner(board):
    """
    Returns the winner of the game, if there is one.
    """
    for x in range(3):
        if board[x][0] == board[x][1] == board[x][2] != EMPTY:
            return board[x][0]
    for y in range(3):
        if board[0][y] == board[1][y] == board[2][y] != EMPTY:
            return board[0][y]
    if board[0][0] == board[1][1] == board[2][2] != EMPTY:
        return board[0][0]
    if board[2][0] == board[1][1] == board[0][2] != EMPTY:
        return board[2][0]
    else:
        return None


def terminal(board):
    """
    Returns True if game is over, False otherwise.
    """
    if winner(board) == X:
        return True
    elif winner(board) == O:
        return True

    for x in range(3):
        for y in range(3):
            if board[x][y] is None:
                return False
    return True
    ('si winner est égal à X :\n'
     '            return True\n'
     '        si winner est égal à 0\n'
     '            return true \n'
     '            \n'
     '        si le nombre de cases vides == 0\n'
     '            return true\n'
     '        else:\n'
     '            return false')


def utility(board):
    """
    Returns 1 if X has won the game, -1 if O has won, 0 otherwise.
    """
    if winner(board) == X:
        return 1
    if winner(board) == 0:
        return -1
    else:
        return 0


def minimax(board):
    """
    Returns the optimal action for the current player on the board.
    """
    if terminal(board):
        return None

    if player(board) == X:
        v = v = float('-inf')
        for move in actions(board):
            temp = MinValue(result(board, move))
            if temp > v:
                v = temp
                best = move
    else:
        v = float('inf')
        for move in actions(board):
            temp = MaxValue(result(board, move))
            if temp < v:
                v = temp
                best = move
    return best
    

def MaxValue(board):
    if terminal(board):
        return utility(board), None

    v = float('-inf')
    for move in actions(board):
        v = max(v, MinValue(result(board, move)))
    return


def MinValue(board):
    if terminal(board):
        return utility(board), None

    v = float('inf')

    for move in actions(board):
        v = min(v, MaxValue(result(board, move)))
    return v
导入副本
X=“X”
O=“O”
空=无
def初始_状态():
"""
返回板的开始状态。
"""
return[[EMPTY,EMPTY,EMPTY],
[空,空,空],
[空,空,空]]
def播放器(板):
Xboard_count=板[0]。计数(X)+板[1]。计数(X)+板[2]。计数(X)
如果Xboard_计数%2==1:
返回0
其他:
返回X
def行动(委员会):
"""
返回板上可用的所有可能操作(i,j)的集合。
"""
移动=[]
对于范围(3)中的i:
对于范围(3)内的j:
如果板[i][j]==空:
移动.附加((i,j))
回击
def结果(板,移动):
"""
返回在板上移动(i,j)所产生的板。
"""
如果未在行动中移动(板):
引发异常(“此操作不是有效的操作”)
dcopb=复制。深度复制(板)
dcopb[move[0]][move[1]]=玩家(棋盘)
返回dcopb
def优胜者(董事会):
"""
返回游戏的赢家(如果有)。
"""
对于范围(3)内的x:
如果板[x][0]==板[x][1]==板[x][2]!=空的:
返回板[x][0]
对于范围(3)内的y:
如果板[0][y]==板[1][y]==板[2][y]!=空的:
返回板[0][y]
如果板[0][0]==板[1][1]==板[2][2]!=空的:
返回板[0][0]
如果板[2][0]==板[1][1]==板[0][2]!=空的:
返回板[2][0]
其他:
一无所获
def终端(板):
"""
如果游戏结束,则返回True,否则返回False。
"""
如果获胜者(董事会)=X:
返回真值
elif获胜者(董事会)=O:
返回真值
对于范围(3)内的x:
对于范围(3)内的y:
如果板[x][y]为无:
返回错误
返回真值
('si winner estégaláX:\n'
'返回真值\n'
'si winner estégalá0\n'
'返回真值\n'
“\n”
'si le nombre de cases vides==0\n'
'返回真值\n'
'其他:\n'
“返回false”)
def实用程序(板):
"""
如果X赢了游戏,则返回1;如果O赢了,则返回1;否则返回0。
"""
如果获胜者(董事会)=X:
返回1
如果获胜者(董事会)=0:
返回-1
其他:
返回0
def minimax(电路板):
"""
返回棋盘上当前玩家的最佳动作。
"""
如果终端(板):
一无所获
如果玩家(棋盘)=X:
v=v=float('-inf')
对于入住行动(董事会):
温度=最小值(结果(板、移动))
如果温度>v:
v=温度
最佳=移动
其他:
v=浮点('inf')
对于入住行动(董事会):
温度=最大值(结果(板、移动))
如果温度
我得到了这个确切的错误信息


TypeError:“tuple”和“float”的实例之间不支持“>”

您在
返回实用程序(board)返回一个元组,在
MinValue
中没有。因此,当您在
temp=MinValue(result(board,move))
处调用函数时,如果调用了该返回语句,
temp
就是一个元组


v
是一个浮点数。现在,当您尝试将它与
处的
temp
进行比较时,如果temp
,您将浮点值与元组进行比较首先,MinValue和MaxValue函数存在问题,它们有时返回两个值,而不是一个值


然后,出现了相同的TypeError,这一次在比较非类型变量和浮点时出现了一个问题。原来只是一个小错误,因为我的MaxValue函数没有返回任何内容。

你应该得到一个带有该错误消息的stacktrace,该stacktrace应该告诉你问题出在哪里。谢谢,我已经解决了这个问题,但现在我得到的是非类型错误,而不是元组错误,就像这个文件一样“/home/mrnb/Search//tictactoe.py”,MinValue v=min(v,value)TypeError中的第145行:“您的函数必须返回一个
None
而不是一个数字。请尝试打印返回值