Python Tic-Tac-Toe游戏的问题

Python Tic-Tac-Toe游戏的问题,python,Python,我正在做一个井字游戏,但是我在做的时候遇到了一些问题 第一个问题是,当我有董事会时: X | - | X 或者说: - | X | X 这算是一场胜利,我不知道为什么。如果我说: X | X | - 这没问题 第二个问题是,我想阻止用户选择一个已经在使用的位置,所以我的想法是将已经选择的位置添加到列表中,并比较它是否已经在其中。问题是,当我第二次调用该函数时,它没有包含previus位置信息的previus列表,因此它会生成一个新的previus列表,因此它从未检测到用户给出的位置已

我正在做一个井字游戏,但是我在做的时候遇到了一些问题

第一个问题是,当我有董事会时:

 X | - | X  
或者说:

- | X | X
这算是一场胜利,我不知道为什么。如果我说:

X | X | -
这没问题

第二个问题是,我想阻止用户选择一个已经在使用的位置,所以我的想法是将已经选择的位置添加到列表中,并比较它是否已经在其中。问题是,当我第二次调用该函数时,它没有包含previus位置信息的previus列表,因此它会生成一个新的previus列表,因此它从未检测到用户给出的位置已经在使用中

board = ["-","-","-",
           "-","-","-",
           "-","-","-"]

def display():

    print(board[0] + " | " + board[1] + " | " + board[2])
    print(board[3] + " | " + board[4] + " | " + board[5])
    print(board[6] + " | " + board[7] + " | " + board[8])

def turn():

    exist=[]

    pos = int(input("Choose your position"))

    while True:
        if pos not in exist:
            exist.append(pos)
            print(exist)
            print("Correct position")
            break

        else:
            print("That position has been selected, choose another one")

    board[pos-1] = "X"
    display()

def checkwin():
    #row
    if (board[0] and board[1] and board[2] == "X") or (board[3] and board[4] and board[5] == "X") or (board[6] and board[7] and board[8] == "X"):
        print("Victory")
        return False
    else:
        return True


display()
while checkwin():
    turn()
    checkwin()
    print(board)

print("Game has ended")
注意:现在游戏只能有X玩家,我还需要添加O玩家。而且,它只能检测行的赢。我还在研究这个问题。

电路板[0]和电路板[1]以及电路板[2]==X的逻辑将不起作用,因为您只检查的是电路板[2]==X',其他的都是真的,因此“-”也将计算为真

您应该像这个板一样检查[0]==板[1]==板[2]==X。
这确保了所有值都等于“X”

对于第二个问题,您在函数turn中声明了列表,每次玩家做出选择时都会调用该函数。当函数返回时,其所有局部变量都不再可访问。将其与您的代码进行比较

def addToList( item ):
    items = []
    items.append( item )
addToList( 'item1' )
addToList( 'item2' )
每次调用函数时,也会调用items=[]。编辑以澄清我的第一句话,函数创建自己的作用域。变量的范围是在程序中可用的位置。比如说

def addItem( item ):
    items = []
    items.append( item )
addItem( "item1" )
print( items )
ERROR: items is not defined

sin Triba明确指出了为什么你的回合功能会如此

至于如何让它正常工作。。。也许我遗漏了一些东西,但是你不想确保你不能选择一个已经被占用的空间吗?为此,你可以直接检查电路板

def转弯: pos=输入选择您的位置 而电路板[pos-1]==X: pos=输入已选择的位置,请选择另一个 打印正确的位置 电路板[pos-1]=X 陈列
这将一直询问,直到您指定一个空方块。

注意,您还可以检查是否有玩家使用:棋盘[0]==棋盘[1]==棋盘[2]和棋盘[0]!=-。将要测试的所有索引组合放在一个列表中,并使用循环来防止过度的代码重复,这可能会有所帮助。哦,我明白了。这完全可以理解,非常感谢各位。你知道我的第二期吗?我的功能不正确我喜欢这种解释,这很有帮助!谢谢。这是一个解决问题的有趣方法,谢谢!