我正在创建一个tictactoe游戏,有些代码不会在if语句中执行。你知道吗
整个代码在这里:
import random
BoardValues = [" ", " ", " ", " ", " ", " ", " ", " ", " "]
BoardValuesToWin = [0, 0, 0, 0, 0, 0, 0, 0, 0]
player1Is_X = True
player1Score = 0
player2Score = 0
switchToTurnOfO = False
def playerSymbol():
global player1
player1 = ""
while not (player1 == "X" or player1 == "O"):
player1 = input("Choose a side, it must be \"O\" or \"X\"").upper().replace(" ", "")
if player1 == "X":
player1Is_X = True
playerName()
elif player1 == "O":
player1Is_X = False
playerName()
def playerName():
global player1Name
global player2Name
player1Name = ""
player2Name = ""
print(f"Player 1 defined as {player1}")
player1Name = input("Player 1, please specify your name")
player2Name = input("Your turn to specify your name, Player 2")
displayBoard()
def displayBoard():
print(f"\n{player1Name}: {player1Score}\t {player2Name}: {player2Score} ")
print(f" | | ")
print(f" {BoardValues[0]} | {BoardValues[1]} | {BoardValues[2]} ")
print(f" | | ")
print(f"-------|-------|-------")
print(f" | | ")
print(f" {BoardValues[3]} | {BoardValues[4]} | {BoardValues[5]} ")
print(f" | | ")
print(f"-------|-------|-------")
print(f" | | ")
print(f" {BoardValues[6]} | {BoardValues[7]} | {BoardValues[8]} ")
print(f" | | ")
starterPlayer()
def starterPlayer():
randomStart = random.randint(0, 1)
starter = "xStarts" if randomStart == 0 else "oStarts"
if starter == "xStarts":
switchToTurnOfO = False
gameStartsWithX(switchToTurnOfO)
else:
switchToTurnOfO = True
gameStartsWithO(switchToTurnOfO)
def gameStartsWithX(switchToTurnOfO):
position = 0
if player1Is_X == True:
if switchToTurnOfO == False:
if (sum((BoardValuesToWin[0], BoardValuesToWin[1], BoardValuesToWin[2])) and sum(
(BoardValuesToWin[3], BoardValuesToWin[4], BoardValuesToWin[5])) and sum(
(BoardValuesToWin[6], BoardValuesToWin[7], BoardValuesToWin[8])) and sum(
(BoardValuesToWin[0], BoardValuesToWin[3], BoardValuesToWin[6])) and sum(
(BoardValuesToWin[1], BoardValuesToWin[4], BoardValuesToWin[7])) and sum(
(BoardValuesToWin[2], BoardValuesToWin[5], BoardValuesToWin[8]))) != 300 or -300:
position = int(input("Take a look at the NUMPAD and choose a number for the position of your marker!"))
BoardValues[position] = "X"
BoardValuesToWin[position] += 100
switchToTurnOfO = False
displayBoardAfter_X_Played()
else:
pass
def gameStartsWithO(switchToTurnOfO):
position = 0
if player1Is_X == False:
if switchToTurnOfO == False:
if (sum((BoardValuesToWin[0], BoardValuesToWin[1], BoardValuesToWin[2])) and sum(
(BoardValuesToWin[3], BoardValuesToWin[4], BoardValuesToWin[5])) and sum(
(BoardValuesToWin[6], BoardValuesToWin[7], BoardValuesToWin[8])) and sum(
(BoardValuesToWin[0], BoardValuesToWin[3], BoardValuesToWin[6])) and sum(
(BoardValuesToWin[1], BoardValuesToWin[4], BoardValuesToWin[7])) and sum(
(BoardValuesToWin[2], BoardValuesToWin[5], BoardValuesToWin[8]))) != 300 or -300:
position = int(input("Take a look at the NUMPAD and choose a number for the position of your marker!"))
BoardValues[position] = "O"
BoardValuesToWin[position] -= 100
switchToTurnOfO = True
displayBoardAfter_O_Played()
else:
pass
def displayBoardAfter_X_Played():
print(f"\n{player1Name}: {player1Score}\t {player2Name}: {player2Score} ")
print(f" | | ")
print(f" {BoardValues[0]} | {BoardValues[1]} | {BoardValues[2]} ")
print(f" | | ")
print(f"-------|-------|-------")
print(f" | | ")
print(f" {BoardValues[3]} | {BoardValues[4]} | {BoardValues[5]} ")
print(f" | | ")
print(f"-------|-------|-------")
print(f" | | ")
print(f" {BoardValues[6]} | {BoardValues[7]} | {BoardValues[8]} ")
print(f" | | ")
gameStartsWithO(switchToTurnOfO)
def displayBoardAfter_O_Played():
print(f"\n{player1Name}: {player1Score}\t {player2Name}: {player2Score} ")
print(f" | | ")
print(f" {BoardValues[0]} | {BoardValues[1]} | {BoardValues[2]} ")
print(f" | | ")
print(f"-------|-------|-------")
print(f" | | ")
print(f" {BoardValues[3]} | {BoardValues[4]} | {BoardValues[5]} ")
print(f" | | ")
print(f"-------|-------|-------")
print(f" | | ")
print(f" {BoardValues[6]} | {BoardValues[7]} | {BoardValues[8]} ")
print(f" | | ")
gameStartsWithX(switchToTurnOfO)
playerSymbol()
当它到达def gameStartsWithX(switchToTurnOfO):
函数时,它有时执行输入,有时不执行,但是当我在那里写print("something)
时,即使在输入之后,它每次都执行,即使输入没有执行
我真的不知道有什么问题。你知道吗
提前谢谢。你知道吗
这些检查没有按预期工作:
相反,它检查的是所有的和都是“truthy”(即不是
0
),最终的和是!= 300
,或者-300
是“truthy”,这总是这样,因此整个表达式是True
。你知道吗这是this anti-pattern的一个有趣的变体,但有一个转折点:不是针对多个值测试变量,而是针对多个值测试多个变量。你知道吗
您可以尝试将
in
与any
或all
组合:或者你可以只检查和的绝对值:
与问题无关的其他要点:
您应该考虑合并
gameStartsWithO
和gameStartsWithX
,以及displayBoardAfter_X_Played
和displayBoardAfter_O_Played
函数,因为它们几乎是相同的不管怎样,只要在
if
之前定义bvtw = BoardValuesToWin
,然后在sum(bvtw[0], ...)
条件下测试sum(bvtw[0], ...)
,就可以使代码变得更短、更可读你好像忘记检查对角线了
你只需要精确:
if all(s not in (300, -300) for s in (sum(...), ...., sum(...))):
相关问题 更多 >
编程相关推荐