【问题标题】:I have made a Tic Tac Toe game but it shows the wrong player when someone has won我做了一个井字游戏,但当有人获胜时显示错误的玩家
【发布时间】:2021-05-19 12:32:31
【问题描述】:

我在 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()

【问题讨论】:

  • get_user_input()set_cell() 调用移到循环顶部。
  • 我在发布问题之前已经尝试过了,它没有帮助。

标签: python tic-tac-toe


【解决方案1】:

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

player = switch_turn(player)

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

【讨论】:

    【解决方案2】:

    在不重写太多代码的情况下,我只需稍微重新安排一下代码即可。您不必在循环开始时检查它是赢还是平,因为它永远不会在游戏开始时为真。这意味着您可以要求输入,设置单元格,然后才能检查获胜/平局。这可以让您在切换回合之前写出获胜者。

    您也不想在 is_win 函数中打印任何内容。由于这是您的 while 循环条件,它将在代码执行后运行该函数并使其与错误的播放器一起运行。通过在 is_win 函数中不打印来解决这个问题,只在 if 语句满足时打印。

    另一个问题是,在您的 elif (win) 语句中,您检查 board is_full AND is_win 是否。只有在最后一个位置获胜时才会发生这种情况。

    你也不必写出“是假的”或“是真的”。我认为如果您删除它们并使用“not”这个词来代替 False,它会更容易阅读。

    游戏循环的粗略代码:

    def game():
        player = 'X'
        print_board(board)
        while not is_win(board, player):
            row, col = get_user_input()
            set_cell(board, row, col, player)
            if is_full(board) and not is_win(board, player):
                print("draw")
                break
            elif is_win(board, player):
                print(player + " has won!")
                break
            player = switch_turn(player) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多