学习Python-TypeError:“ NoneType”对象不可下标

时间:2020-07-30 01:35:37

标签: python tic-tac-toe

最近,我换了专业并且对计算机科学世界着迷了,我正在努力学习Python。我真的很喜欢它,但是有时候很多人都会卡住。我目前正在上Udemy课程,并尝试着手解决第一个里程碑问题,但是似乎一切都应运而生,但是...结果出错...我所想的还没有完成,但是我想测试一下只是为了确保一切都按计划进行。

我收到以下错误,但仍然给我结果... 如果有人对初学者有任何提示或建议,请多加赞赏! (第一篇文章!不错!:'))

     | | 
     | | 
     | | 
    Player 1 are you X or O? X
    Please Input a Number 1-9: 6
     | | 
     | |O
     | | 
    Traceback (most recent call last):
      File "C:/Users/Danny/Desktop/Python/Python Bootcamp/Milestones/TicTacToe.py", line 76, in <module>
        display(gameon_Board)
      File "C:/Users/Danny/Desktop/Python/Python Bootcamp/Milestones/TicTacToe.py", line 17, in display
        print(board[7]+'|'+board[8]+'|'+board[9])
    TypeError: 'NoneType' object is not subscriptable 

以下代码

"""This is a TIC TAC TOE GAME!
    
You need to do the following...

We need to print a board.
Take in player input.
Place their input on the board.
Check if the game is won,tied, lost, or ongoing.
Repeat c and d until the game has been won or tied.
Ask if players want to play again.

Good Luck! """

#Display Board

def display(board):
    print(board[7]+'|'+board[8]+'|'+board[9])
    print(board[4]+'|'+board[5]+'|'+board[6])
    print(board[1]+'|'+board[2]+'|'+board[3])

#Sets up player markers
def player_Marker():
    marker = ' '
    while marker != 'X' and marker != 'O':
        marker = input("Player 1 are you X or O? ")
        
    player1 = marker
    
    if player1 == 'X':
        player2 = 'O'
    else:
        player2 = 'X'
    
    return (player1,player2)

#Takes User Position Input On Board
def player_Choice():
    position = 'wrong'
    while position not in range(1,10):
        position = int(input("Please Input a Number 1-9: "))  
    
    return position

#Tack on Inputs to Board

# CLEAN_Board = ['#',' ',' ',' ',' ',' ',' ',' ',' ',' ']

gameon_Board = ['#',' ',' ',' ',' ',' ',' ',' ',' ',' ']

def boardUP(board,position):
    turn = 1
    if turn == 1:
        gameon_Board[position] = player1_Marker
        turn = turn - 1
    if turn == 0:
        gameon_Board[position] = player2_Marker
        turn += 1

    return display(gameon_Board)


# All Together

game_on = True
gameon_Board = ['#',' ',' ',' ',' ',' ',' ',' ',' ',' ']

while game_on:
    display(gameon_Board)
    
    player1_Marker , player2_Marker = player_Marker()
    
    position = player_Choice()

    gameon_Board = boardUP(gameon_Board,position)

    display(gameon_Board)

1 个答案:

答案 0 :(得分:0)

display()不返回任何内容,它仅打印电路板。因此,默认返回值为None

但是boardUP()return display(gameon_Board)结尾,因此它返回的是None值。

然后使用

将结果分配回变量

gameon_Board = boardUP(gameon_Board,position)

因此,在第一次迭代之后,gameon_Board不再包含板元素列表,而是包含None。然后,当您尝试访问其下标时,会出现错误。

此外,您将木板作为boardUP的参数传递,但它从不使用它。它改为使用全局变量。您应该使用参数。

将功能更改为:

def boardUP(board,position):
    turn = 1
    if turn == 1:
        board[position] = player1_Marker
        turn = turn - 1
    if turn == 0:
        board[position] = player2_Marker
        turn += 1

    display(board)
    return board