在python中运行if之后,一些代码执行,而另一些代码不执行

2024-10-03 04:32:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个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)时,即使在输入之后,它每次都执行,即使输入没有执行

我真的不知道有什么问题。你知道吗

提前谢谢。你知道吗


Tags: andfalsetrueifdefpositionsumprint
2条回答

这些检查没有按预期工作:

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:

相反,它检查的是所有的和都是“truthy”(即不是0),最终的和是!= 300,或者-300是“truthy”,这总是这样,因此整个表达式是True。你知道吗

这是this anti-pattern的一个有趣的变体,但有一个转折点:不是针对多个值测试变量,而是针对多个值测试多个变量。你知道吗

您可以尝试将inanyall组合:

if all(s not in (300, -300) for s in (sum(...), ...., sum(...))):

或者你可以只检查和的绝对值:

if all(abs(s) != 300 for s in (sum(...), ...., sum(...))):

与问题无关的其他要点:

  • 您应该考虑合并gameStartsWithOgameStartsWithX,以及displayBoardAfter_X_PlayeddisplayBoardAfter_O_Played函数,因为它们几乎是相同的

  • 不管怎样,只要在if之前定义bvtw = BoardValuesToWin,然后在sum(bvtw[0], ...)条件下测试sum(bvtw[0], ...),就可以使代码变得更短、更可读

  • 你好像忘记检查对角线了

你只需要精确:if all(s not in (300, -300) for s in (sum(...), ...., sum(...))):

相关问题 更多 >