Python Forum
Simple Tic Tac Toe but I'm confused
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Simple Tic Tac Toe but I'm confused
#1
So I started learning to code and followed a tutorial making a simple tic tac toe game. Later that day, I wanted to do it again, but without help this time. I've gone through everything, but it didn't work as intended. So I took the code I made with the tutorial and compared them. After a few simplifying steps, I still didn't know why it wasn't working as well as the other... So I just renamed all my variables and functions, so that they are the same in both codes, and suddenly, it worked!
I literally didn't do anything else than renaming my variables and functions (and making some lines and comments for better looks). So, can anyone explain to me, why this could have happened?

Sadly I cannot post the code pre-renaming, as it is already overwritten and so on... (I, the dumb***, didn't think about making an extra savestate... uff)

PS: I coded in Visual Studio Code. Somehow when I press "Run", it does not run the code from the beginning, if another "game" is still running. Is that because it uses console commands to run the script? (Because my game is asking for input until it's finished)


For those interested, here's the working code:

# ------ Global Var ------

# Game Board
board = ["-", "-", "-", 
         "-", "-", "-", 
         "-", "-", "-",]

# If game ist still going
game_still_going = True

#Who won? Or tie?
winner = None

# Whose turn is it?
current_player = "X"



# ------- Functions --------

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

# Actual Game
def play_game():
    # Setup global variables (because of "Wanna play again")
    global game_still_going
    global winner
    global board
    global current_player
    
    # Display initial board
    display_board()

    # While game is still going 
    while game_still_going:
        # Handle a single turn of an abitrary player
        handle_turn(current_player)

        # Check if the game has ended
        check_if_game_over()

        # Switch to other player
        switch_player()
    
    # The game has ended
    if winner == "X" or winner == "O":
        print(winner + " won.")
    elif winner == None:
        print("Tie.")

    # Replay? (Selfmade)
    print("Want to play again? Enter 'Yes' or 'No'. ")
    replay = input()
    while replay not in ["Yes", "No"]:
        replay = input("Input valid answer.")
    if replay == "Yes":
        print(" ")
        print("Okay, then lets go!")
        game_still_going = True
        winner = None
        current_player = "X"
        for x in range(8):
            board[x] = "-"
        play_game()
    elif replay == "No":
        print("Alright, your choice!")
        game_still_going = False

# Handle a single turn of an abitrary player
def handle_turn(player):

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

    # Input validation
    valid = False
    while not valid:
        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] == "-":
            valid = True
        else:
            print("Can't go there. Go again.")

    # Input happening
    board[position] = player

    # Display updated board
    display_board()

# Check if the game has ended
def check_if_game_over():
    check_for_winner()
    check_if_tie()

# Check if a player has won
def check_for_winner():
    
    #Setup global variables
    global winner
    
    #check rows
    row_winner = check_rows()
    #check culumns
    column_winner = check_columns()
    #check diagonals
    diagonal_winner = check_diagonals()

    if row_winner:
        winner = row_winner
    elif column_winner:
        winner = column_winner
    elif diagonal_winner:
        winner = diagonal_winner
    else:
        winner = None

def check_rows():
    #Setup global variables
    global game_still_going

    #Check any rows
    row_1 = board[0] == board[1] == board[2] != "-"
    row_2 = board[3] == board[4] == board[5] != "-"
    row_3 = board[6] == board[7] == board[8] != "-"

    #Any row -> flag as win
    if row_1 or row_2 or row_3:
        game_still_going = False
    
    #Return winner (X or O)
    if row_1:
        return board[0]
    if row_2:
        return board[3]
    if row_3:
        return board[6]

def check_columns():
    #Setup global variables
    global game_still_going

    #Check any column
    column_1 = board[0] == board[3] == board[6] != "-"
    column_2 = board[1] == board[4] == board[7] != "-"
    column_3 = board[2] == board[5] == board[8] != "-"

    #Any column -> flag as win
    if column_1 or column_2 or column_3:
        game_still_going = False
    
    #Return winner (X or O)
    if column_1:
        return board[0]
    if column_2:
        return board[1]
    if column_3:
        return board[2]

def check_diagonals():
    #Setup global variables
    global game_still_going

    #Check any diagonal
    diagonal_1 = board[0] == board[4] == board[8] != "-"
    diagonal_2 = board[6] == board[4] == board[2] != "-"
   

    #Any diagonal -> flag as win
    if diagonal_1 or diagonal_2:
        game_still_going = False
    
    #Return winner (X or O)
    if diagonal_1:
        return board[0]
    if diagonal_2:
        return board[2]


# Check if there is a tie
def check_if_tie():

    # Setup global variables
    global game_still_going

    # If board is filled up, then Tie
    if "-" not in board:
        game_still_going = False

# Switch to other player
def switch_player():
    # Setup global variables
    global current_player

    # Change to opposite player
    if current_player == "X":
        current_player = "O"
    elif current_player == "O":
        current_player = "X"




# ------------- actual Code -------------- LMAO

play_game()

To describe the problem before renaming: You got 3 X in a row (or column or diagonal), but it would still ask O to put it's sign before declaring X the winner... (sorry for that spelling and grammar...)
Reply
#2
Look for statements that are in loops and shouldn't be (indentation error)
dumb but effective example:
ziggy = []
for x in range(10):
    ziggy.append(x)
    print(ziggy)
    ziggy = []
this code should be:
ziggy = []
for x in range(10):
    ziggy.append(x)
print(ziggy)
ziggy = []
and also look for the opposite (things outside of loop that should be in)
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Pandas confused DPaul 6 204 Sep-19-2021, 06:45 AM
Last Post: DPaul
  is and '==' i'm confused hshivaraj 6 351 Sep-15-2021, 09:45 AM
Last Post: snippsat
  Confused with 'flags' tester_V 10 1,280 Apr-12-2021, 03:03 AM
Last Post: tester_V
  I am really confused with this error. Runar 3 831 Sep-14-2020, 09:27 AM
Last Post: buran
  Confused by 'break' in the official documents Chuck_Norwich 2 850 Apr-12-2020, 09:26 PM
Last Post: Chuck_Norwich
  Confused on how to go about writing this or doing this... pythonforumuser 3 977 Feb-10-2020, 09:15 AM
Last Post: snippsat
  I always get 'None' returned. Confused. What did I miss? jpezz 2 1,082 Apr-07-2019, 10:06 AM
Last Post: jpezz
  Confused by order of operations ward 4 1,256 Jan-22-2019, 08:53 PM
Last Post: Larz60+
  Confused by this modulo equation VikramSuh 3 1,477 Sep-05-2018, 12:43 PM
Last Post: VikramSuh
  I am new to python , i am confused with this syntax , please help aankrose 3 1,414 Aug-03-2018, 06:49 PM
Last Post: aankrose

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020