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