pythontic-tac-toe

I have made a Tic Tac Toe game but it shows the wrong player when someone has won


I have made a Tic Tac Toe game in python and when X wins it shoes that O has won and when O wins it shows that X has won. I am pretty sure that the problem is that it changes player and after that checks if someone has won, I tried making it so it will switch be before the player switch but it still didn't work. I also tried to change player in the is_win function but that also didn't fix it. Could someone please take a look at this and help me fix this.

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

Solution

  • I think it is because, before your game ends, the player gets switched at the of the game() function.

    player = switch_turn(player)
    

    When X makes its winning move, the player gets switched and the current player is now player 'O'. One idea could be checking is_win before the switch.