查询 python 代码中的 Tic Tac To Typeerror

Query about Typeerror in python code for Tic Tac To

我已经成功地完成了 python 中井字游戏的代码,它在输赢的情况下完全有效,但是每当出现平局时,它就会显示以下类型错误,请帮助我来解决这个问题。 我认为在函数 insertLetter() 中插入“O”存在一些问题,但我用 2 个参数定义了函数,这是一个字母和要插入字母的位置。

请帮我找出代码中的错误。

Traceback (most recent call last):
  File "tictactoe.py", line 126, in <module>
    main()
  File "tictactoe.py", line 110, in main
    insertLetter('O', move)
  File "tictactoe.py", line 4, in insertLetter
    board[pos] = letter
TypeError: list indices must be integers or slices, not NoneType

我的代码是:

board = [' ' for x in range(10)]

def insertLetter(letter,pos):
    board[pos] = letter

def spaceIsfree(pos):
    return board[pos] == ' '

def printBoard(board):
    print("   |   |   ")
    print(" " + board[1] + " | " + board[2] + " | " + board[3])
    print("   |   |   ")
    print("------------")
    print("   |   |   ")
    print(" " + board[4] + " | " + board[5] + " | " + board[6])
    print("   |   |   ")
    print("------------")
    print("   |   |   ")
    print(" " + board[7] + " | " + board[8] + " | " + board[9])
    print("   |   |   ")

def isBoardFull(board):
    if board.count(' ') > 1:
        return False
    else:
        return True

def isWinner(b,l):
    return ((b[1] == l and b[2] ==l and b[3] == l) or
    (b[4] == l and b[5] ==l and b[6] == l) or
    (b[7] == l and b[8] ==l and b[9] == l) or
    (b[1] == l and b[4] ==l and b[7] == l) or
    (b[2] == l and b[5] ==l and b[8] == l) or
    (b[3] == l and b[6] ==l and b[9] == l) or
    (b[1] == l and b[5] ==l and b[9] == l) or
    (b[3] == l and b[5] ==l and b[7] == l))

def playerMove():
    run =True
    while run:
        move = input("Please select a position to enter the X b/w 1 to 9: ")
        try:
            move = int(move)
            if  move > 0 and move < 10:
                if spaceIsfree(move):
                    run = False
                    insertLetter('X', move)
                else:
                    print("Sorry, this space is occupied")
            else:
               print("Please type a number b/w 1 and 9")
        except:
            print("Please type a number!")

def computerMove():
    possibleMoves = [x for x , letter in enumerate(board) if letter == ' ' and x != 0 ]
    move = 0

    for let in ['O' , 'X']:
        for i in possibleMoves:
            boardcopy = board[:]
            boardcopy[i] = let
            if isWinner(boardcopy, let):
                move = i
                return move
    cornersOpen = []
    for i in possibleMoves:
        if i in [1, 3, 7, 9]:
            cornersOpen.append(i)

    if len(cornersOpen) > 0:
        move = selectRandom(cornersOpen)
        return move

    if 5 in possibleMoves:
        move = 5
        return move

    edgesOpen = []
    for i in possibleMoves:
        if i in [2,4,6,8]:
            edgesOpen.append(i)

    if len(edgesOpen) > 0:
        move = selectRandom(edgesOpen)
        return move

def selectRandom(li):
    import random
    ln = len(li)
    r = random.randrange(0,ln)
    return li[r]

def main():
    print("Welcome to the game! ")
    printBoard(board)

    while not(isBoardFull(board)):
        if not(isWinner(board, "O")):
            playerMove()
            printBoard(board)
        else:
            print("sorry, you loose!")
            break
        if not(isWinner(board, "X")):
            move = computerMove()
            if move == 0:
                print(" ")
            else:
                insertLetter('O', move)
                print('computer placed an O on position', move, ':')
                printBoard(board)
        else:
            print("You win!")
            break


    if isBoardFull(board):
        print("Tie game!")

while True:
    x = input("Do you want to play again ? (y/n): ")
    if x.lower() == "y":
        board = [' ' for x in range(10)]
        print("--------------------")
        main()
    else:
        break

问题是您试图在板已满时插入一封信。 我建议你把

if isBoardFull(board):
     print("Tie game!")
     break

在这里

while not(isBoardFull(board)):
    if not(isWinner(board, "O")):
        playerMove()
        printBoard(board)
    else:
        print("sorry, you loose!")
        break
    
    if isBoardFull(board):
        print("Tie game!")
        break
    
    if not(isWinner(board, "X")):
        move = computerMove()
        if move == 0:
            print(" ")
        else:
            insertLetter('O', move)
            print('computer placed an O on position', move, ':')
            printBoard(board)
    else:
        print("You win!")
        break