Search code examples
python-3.xboolean-expression

Beginner looking for assistance with Boolean operators in tac tac toe code


I've recently begun learning python, and tried a Tic Tac Toe project, where I followed along with a video. Despite following quite diligently, and referencing the code, I've come to a point where the program terminates after one turn. I've compared my code with the code of the project, and I believe the issue to be in the "Check for win" section of my code, where every comparison converts the "game_still_going" variable to false, thus terminating the game.

I've been reviewing and retrying the code for well over an hour, in addition to copying and pasting sections of the guides code in and out.

Any help regarding the Boolean section would be greatly appreciated.

board = ["_", "_", "_",
         "_", "_", "_",
         "_", "_", "_"]

game_still_going = True

winner = None

current_player = "X"




def display_board():
    print(board[0] + " | " + board[1] + " | " + board[2])
    print(board[3] + " | " + board[4] + " | " + board[5])
    print(board[6] + " | " + board[7] + " | " + board[8])


def handle_turn(player):
    print(player + "'s turn.")
    position = input("Choose a position, from 1-9: ")

    invalid = True
    while invalid == True:

        while position not in ["1", "2", "3", "4", "5", "6", "7", "8", "9"]:
            position = input("Choose a position from 1-9")

        position = int(position) - 1

        if board[position] == "_":
            invalid = False
        else:
            print("You can't go there! Go again.")

    board[position] = player

    display_board()



def check_for_winner():
    global winner
    global game_still_going
    # setup global variables

    # check rows
    row_winner = check_rows()
    # check columns
    column_winner = check_columns()
    # check diagonals
    diagonals_winner = check_diagonals()

    if row_winner:
        winner = row_winner
    elif column_winner:
        winner = column_winner
    elif diagonals_winner:
        winner = diagonals_winner
    else:
        winner = None
    return



def check_rows():
    global game_still_going
    row_1 = board[0] == board[1] == board[2] != ["_"]
    row_2 = board[3] == board[4] == board[5] != ["_"]
    row_3 = board[6] == board[7] == board[8] != ["_"]

    if row_1:
        return board[0]
    elif row_2:
        return board[3]
    elif row_3:
        return board[6]
    else:
        return None




def check_columns():
    global game_still_going
    column_1 = board[0] == board[3] == board[6] != ["_"]
    column_2 = board[1] == board[4] == board[7] != ["_"]
    column_3 = board[2] == board[5] == board[8] != ["_"]

    if column_1 or column_2 or column_3:
        game_still_going = False

    if column_1:
        return board[0]
    elif column_2:
        return board[1]
    elif column_3:
        return board[2]
    else:
        return None




def check_diagonals():
    global game_still_going
    diagonals_1 = board[0] == board[4] == board[8] != ["_"]
    diagonals_2 = board[2] == board[4] == board[6] != ["_"]

    if diagonals_1:
        game_still_going = False
    elif diagonals_2:
        game_still_going = False

    if diagonals_1:
        return board[0]
    elif diagonals_2:
        return board[2]
    else:
        return None








def check_for_tie():
    global game_still_going
    if "_" not in board:
        game_still_going = False
        return True
    else:
        return False


def flip_player():
    global current_player
    if current_player == "X":
        current_player = "O"
    elif current_player == "O":
        current_player = "X"

    return


def check_if_game_over():
    check_for_winner()

    check_for_tie()



def play_game():
    display_board()

    while game_still_going:
        handle_turn(current_player)

        check_if_game_over()

        flip_player()

        print(game_still_going)
   
    if winner == "X" or winner == "O":
        print(winner + 'won!')
    elif winner == None:
        print("Tie!")


play_game()

Solution

  • board[n] is a string, not a list. So this:

        column_1 = board[0] == board[3] == board[6] != ["_"]
        column_2 = board[1] == board[4] == board[7] != ["_"]
        column_3 = board[2] == board[5] == board[8] != ["_"]
    

    should be:

        column_1 = board[0] == board[3] == board[6] != "_"
        column_2 = board[1] == board[4] == board[7] != "_"
        column_3 = board[2] == board[5] == board[8] != "_"
    

    Same with check_diagonals. I haven't checked if that's the only problem.