for i in range(1, 10):
valid_move = False
while not valid_move:
move = (input("Player1 your turn with X. Please choose a cell: "))
if not move.isdigit():
print("Please insert a cell number from 1-9.")
else:
valid_move = make_move(player1,move)
if valid_move:
printBoard(theBoard)
break
if (theBoard['7'] == theBoard['8'] == theBoard['9'] == player1) or \
(theBoard['4'] == theBoard['5'] == theBoard['6'] == player1) or \
(theBoard['1'] == theBoard['2'] == theBoard['3'] == player1) or \
(theBoard['7'] == theBoard['4'] == theBoard['1'] == player1) or \
(theBoard['8'] == theBoard['5'] == theBoard['2'] == player1) or \
(theBoard['9'] == theBoard['6'] == theBoard['3'] == player1) or \
(theBoard['7'] == theBoard['5'] == theBoard['3'] == player1) or \
(theBoard['9'] == theBoard['5'] == theBoard['1'] == player1):
print("Player1 wins!")
theBoard = {key: ' ' for key in theBoard} # Reset the board
break
valid_move = False
while not valid_move:
move = (input("Player2 your turn with O. Please choose a cell: "))
if not move.isdigit():
print("Please insert a cell number.")
else:
valid_move = make_move(player2, move)
if valid_move:
printBoard(theBoard)
break
if (theBoard['7'] == theBoard['8'] == theBoard['9'] == player2) or \
(theBoard['4'] == theBoard['5'] == theBoard['6'] == player2) or \
(theBoard['1'] == theBoard['2'] == theBoard['3'] == player2) or \
(theBoard['7'] == theBoard['4'] == theBoard['1'] == player2) or \
(theBoard['8'] == theBoard['5'] == theBoard['2'] == player2) or \
(theBoard['9'] == theBoard['6'] == theBoard['3'] == player2) or \
(theBoard['7'] == theBoard['5'] == theBoard['3'] == player2) or \
(theBoard['9'] == theBoard['5'] == theBoard['1'] == player2):
print("Player2 wins!")
theBoard = {key: ' ' for key in theBoard} # Reset the board
break
`if i == 9:
print("It's a draw!")
theBoard = {key: ' ' for key in theBoard}
break # Reset the board`
elif start_question.lower() == "no":
print("The game is over.")
game = False
else:
print("Please respond 'Yes' or 'No'.")
I was trying to use the function in order to stop the tic-tac-toe game after the 9th round, which implifies the draw of the game. However, the function is not triggered and doesn't react if all 9 rounds have gone.
I tried to implement the function, which would stop a game when the 9 rounds are gone.
The condition
i == 9is not true at the moment of a draw. The draw occurs earlier, since in every iteration of your loop two moves are made. If a draw is reached, it will always be the first player that plays the last move (their fifth move), so the draw-check should be made before the second player takes their turn.So the solution is to move this block:
... and place it just before
valid_move = False(half-way the loop's body), and change the condition:You can then also change the
forloop's range, although it is not absolutely necessary as the loop will always end with abreak.Unlrelated, but there are many things that can be improved in your code. Some high-level hints:
printBoard: good example), or business logic (likemake_move, which I hope, doesn't print). The main loop should then only call functions of either type.is_win) that take argument(s) to cover for the slight differences (like: which player), and introduce the concept of toggling the player, so that you can reuse the same code for a different player.