首页 > 解决方案 > 我做了一个井字游戏,但当有人获胜时显示错误的玩家

问题描述

我在 python 中做了一个井字游戏,当 X 获胜时,它表明 O 已经获胜,当 O 获胜时,它表明 X 已经获胜。我很确定问题在于它改变了玩家,然后检查是否有人赢了,我试着让它在玩家切换之前切换,但它仍然不起作用。我还尝试在 is_win 函数中更改播放器,但这也没有解决它。有人可以看看这个并帮我解决这个问题。

initial_board = [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
board = initial_board
def empty_board():       #use board = empty_board() everytime you want to empty the board
    board = [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
    return(board)
def switch_turn(player):    #use player = switch_turn(player) everytime you want to switch players
    if player == 'X':
        return 'O'
    return 'X'
def print_board(board):
    print(*board, sep = "\n")
def is_full(board):
    return all('_' not in box for box in board)
def is_valid(board, row, col):
    x = board[row]
    if x[col] == '_':
        return True
    return False
def set_cell(board, row, col, player):
    x = board[row]
    if is_valid(board,row,col) is True:
        x[col] = player
        print_board(board)
    else:
        print("already taken")
def get_user_input():
    while True:
        while True:
            row = int(input("Enter the row you want (0-2): "))
            if row > 2 or row < 0:
                print("The number you entered is not valid")
                continue
            break
        while True:
            col = int(input("Enter the column you want (0-2): "))
            if col > 2 or col < 0:
                print("The number you entered is not valid")
                continue
            break
        if is_valid(board,row,col) is True:
            return row,col
        else:
            print("This place is taken")
            continue
def is_win(board,player):
    row1 = board[0]
    row2 = board[1]
    row3 = board[2]
    if row1[0] == row1[1] == row1[2] != '_':
        print(player + " Has won!")
        return True
    elif row2[0] == row2[1] == row2[2] != '_':
        print(player + " Has won!")
        return True
    elif row3[0] == row3[1] == row3[2] != '_':
        print(player + " Has won!")
        return True
    elif row1[0] == row2[0] == row3[0] != '_':
        print(player + " Has won!")
        return True
    elif row1[1] == row2[1] == row3[1] != '_':
        print(player + " Has won!")
        return True
    elif row1[2] == row2[2] == row3[2] != '_':
        print(player + " Has won!")
        return True
    elif row1[0] == row2[1] == row3[2] != '_':
        print(player + " Has won!")
        return True
    elif row1[2] == row2[1] == row3[0] != '_':
        print(player + " Has won!")
        return True
    else:
        return False
def game():
    player = 'X'
    print_board(board)
    while is_win(board, player) is False:
        if is_full(board) is True and is_win(board, player) is False:
            print("draw")
            break
        elif is_full(board) is True and is_win(board, player) is True:
            print(is_win(board, player))
            break
        row, col = get_user_input()
        set_cell(board, row, col, player)
        player = switch_turn(player)
game()

标签: pythontic-tac-toe

解决方案


我认为这是因为,在你的游戏结束之前,玩家会在 game() 函数中切换。

player = switch_turn(player)

当 X 取得胜利时,玩家切换并且当前玩家现在是玩家“O”。一个想法可能是在切换之前检查 is_win 。


推荐阅读