对于我的井字游戏程序,我决定创建一个函数来检查玩家的输入是否可用。我定义了一个名为 checkOverride()
的函数来检查玩家的输入。如果输入已被选择并且具有 "X"
或 "O"
,则该函数将返回 True
。否则它会返回 False
。但是,在测试程序时,我试图让函数返回 True
,但函数返回的值是 None
。这是为什么?
def main():
# Welcome the players
print("Welcome players to Tic-Tac-Toe!")
# Variables for creating game board
top = "1|2|3"
middle = "4|5|6"
bottom = "7|8|9"
divider = "-+-+-"
# Display game board
Board = createGameBoard(top, middle, bottom, divider)
print(Board)
playerOneWin = False
playerTwoWin = False
while playerOneWin == False and playerTwoWin == False:
# Get input from player One
playerOneInput = input("x's turn to choose a square (1-9): ")
# Check for override
override = checkOverride(Board, playerOneInput)
if override == True:
print(f"{playerOneInput} has already been filled. Please choose another square.")
continue
elif override == False:
Board = playerOneMove(Board, playerOneInput)
print(Board)
# Get input from player Two
playerTwoInput = input("o's' turn to choose a square(1-9): ")
# Check for override
override = checkOverride(Board, playerTwoInput)
if override == True:
print(f"{playerTwoInput} has already been filled. Please choose another square.")
continue
elif override == False:
Board = playerTwoMove(Board, playerTwoInput)
print(Board)
def createGameBoard(top, middle, bottom, divider):
'''
Create a Tic-Tac-Toe game board.
'''
Board = f"{top}\n{divider}\n{middle}\n{divider}\n{bottom}"
return Board
def playerOneMove(Board, playerOneInput):
'''
Take player one's input and display it onto the board.
'''
# Identify where player one's move and replace number with 'X'
if playerOneInput in Board:
Board = Board.replace(playerOneInput, 'X')
return Board
def playerTwoMove(Board, playerTwoInput):
'''
Take player two's input and display it onto the board.
'''
# Identify where player one's move and replace number with 'X'
if playerTwoInput in Board:
Board = Board.replace(playerTwoInput, "O")
return Board
def checkOverride(Board, playerOneInput="", playerTwoInput=""):
'''
Look at the input of player one or player two and see if their input is already taken.
'''
if playerOneInput:
if playerOneInput in Board:
square = Board.index(playerOneInput)
if Board[square] == "X" or Board[square] == "O":
return True
else:
return False
elif playerTwoInput:
if playerTwoInput in Board:
square = Board.index(playerTwoInput)
if Board[square] == "X" or Board[square] == "O":
return True
else:
return False
答案 0 :(得分:1)
函数返回 None
的唯一方式是 playerOneInput
和 playerTwoInput
都等于 ""
、False
或 {{1} }(因为它们会失败条件)或者在 Board 中找不到 None
和 playerOneInput
(如果是这种情况,那么我们无法提供帮助,因为您没有提供我们提供了董事会的代码,以便我们可以看到问题出在哪里)。
因此,函数返回 playerTwoInput
的原因是因为您在不带参数的情况下运行它,使其默认为 None
和 ""
的值 playerOneInput
。< /p>
答案 1 :(得分:1)
通常,如果函数结束时没有到达带有值的 None
,则函数返回 return
。
在您的函数中,这可以通过两种方式发生:
playerOneInput
和 playerTwoInput
都是假的。当发生这种情况时,代码执行将在两个 if
块下方结束,在那里没有更多的代码要执行,并且 None
将被返回,因为没有任何东西可以返回。 (要理解“真实”和“虚假”的含义,this SO answer 解释得很好。
)playerOneInput
和 playerTwoInput
之一为真,也会发生同样的事情,但在测试它是否为 in Board
时,结果为 False
。没有 else:
存在来捕获执行,它最终没有返回值,因此它返回 None
。要修复 2,您可能需要更改
if playerOneInput:
if playerOneInput in Board:
到
if playerOneInput and playerOneInput in Board:
如果您需要两者都为 True
并且您不想在玩家输入为真但不在棋盘中时以不同方式处理它。
要修复 1,您需要弄清楚是否要在开始时测试输入,并在既不是 playerOneInput
也不是 playerTwoInput
(甚至可能是 Board
)时引发错误是可用的,或者如果您想在函数末尾的 else:
中处理它。
此外,您可能只想接收一个玩家的输入,然后调用该函数两次。