我的井字游戏 Python 脚本有问题

时间:2020-12-27 14:20:18

标签: python python-3.x tic-tac-toe

我正在制作基于控制台的井字游戏。我的脚本如下:

game_board = [
    ["_", "_", "_",],
    ["_", "_", "_",],
    ["_", "_", "_",],

]

#This variable is made for checking eligible ans
eligible_ans = [0, 1, 2, 3]

#Game and is a variable by which game will continue or not
end = False


#Player list with all values
#player = [row, col, player num , state]
player1 = [0, 0, 1, False]
player2 = [0, 0, 2, False]

#Shows game board:
def show_gameboard():
    for num in range(3):
        print("|" + game_board[num][0] + "|" + game_board[num][1] + "|" + game_board[num][2] + "|")

#Takes eligible input from player
def get_move(player):
    x = 4
    y = 4
  
    while x not in eligible_ans and y not in eligible_ans:
        x = int(input("Enter your row: ")) - 1
        y = int(input("Enter your colum: ")) - 1

    player[0] = x
    player[1] = y

#Switches on the state item on player list
def switch_on_state(player):
    player[3] = True

def switch_off_state(player):
    player[3] = False

#Checks if the slot is empty    
def check_slot(player):
    if game_board[player[0]][player[1]] == "_":
        switch_on_state(player)
    else:
        while not player[3]:
            get_move(player)
            if game_board[player[0]][player[1]] == "_":
                switch_on_state(player)     

#Places the move
def move(player):
    if player[3] == True:
        if player[2] == 1:
            game_board[player[0]][player[1]] = "X"

        else:
            game_board[player[0]][player[1]] = "O"
    
    switch_off_state(player)

#Checks row for winner
def check_row():
    if game_board[0][0] == game_board[0][1] and game_board[0][1] == game_board[0][2]:
        end = True
    elif game_board[1][0] == game_board[1][1] and game_board[1][1] == game_board[1][2]:
        end = True
    elif game_board[2][0] == game_board[2][1] and game_board[2][1] == game_board[2][2]:
        end = True

#Check column for winner
def check_col():
    if game_board[0][0] == game_board[1][0] and game_board[1][0] == game_board[2][0]:
        end = True
    elif game_board[0][1] == game_board[1][1] and game_board[1][1] == game_board[2][1]:
        end = True
    elif game_board[0][2] == game_board[1][2] and game_board[1][2] == game_board[2][2]:
        end = True
    else:
        pass

#Check diagonal for winner
def check_diagonal():
        #Down to up check
        if game_board[2][0] == game_board[1][1] and game_board[1][1] == game_board[0][2]:
            end = True 

        #Up to down check
        elif game_board[0][0] == game_board[1][1] and game_board[1][1] == game_board[2][2]:
            end = True


#Checks for whole winner
def check_winner():
    check_row()
    check_col()
    check_diagonal()

#The main workarround
def main():
    i = 0
    while not end and i < 3:
        show_gameboard()
        print("Player1=> \n")
        get_move(player1)
        check_slot(player1)
        move(player1)
        check_winner()
        if end:
            print("Player 1 won")
            break
        print(end)

        show_gameboard()
        print("Player2=> \n")
        get_move(player2)
        check_slot(player2)
        move(player2)
        check_winner()
        if end:
            print("Player 2 won")
            break
        print(end)         #*****The problem is here******

        i += 1

if __name__ == "__main__":
    try:
        main()
    except:
        print("\nProgram Failed.\nTry again!!!\n")

我的问题是,即使有人赢了,为什么 print(end) 将 end 的值显示为 False?

print(end) 位于 main() 函数中,其中 “问题就在这里” 写成

即使有人获胜并且通过函数 check_winner(),结束变量也应该是 True。但是为什么最终变量仍然显示/包含 False 作为值。

1 个答案:

答案 0 :(得分:0)

end 是一个局部变量。尝试添加:

global end

在 check_row()、check_col() 和 check_diagonal() 的第一行 并在 main() 中。

例如:

#Check column for winner
def check_col():
    global end
    if game_board[0][0] == game_board[1][0] and game_board[1][0] == game_board[2][0]:
        end = True
    elif game_board[0][1] == game_board[1][1] and game_board[1][1] == game_board[2][1]:
        end = True
    elif game_board[0][2] == game_board[1][2] and game_board[1][2] == game_board[2][2]:
        end = True
    else:
        pass

你可以用另一种方式来做到这一点,尝试从这些函数中返回“结束”并在 main() 中接收返回值。