# python – A beginner’s first tic tac toe implementation

I’ve been teaching myself python and decided to make a Tic Tac Toe game for a bit of practice. Any criticisms or pointers are welcome! Thanks.

``````class TicTacToe:
"""A class for playing tic tac toe"""

def __init__(self):
self.values = ("-", "-", "-",
"-", "-", "-",
"-", "-", "-")
self.player = "x"

def show_board(self):
print(f"{self.values(0)} | {self.values(1)} | {self.values(2)}")
print(f"{self.values(3)} | {self.values(4)} | {self.values(5)}")
print(f"{self.values(6)} | {self.values(7)} | {self.values(8)}")

def play_game(self):
# display initial board
self.show_board()
# play for 9 turns max
for i in range(9):
self.handle_turn(self.values)
if self.check_tie() or self.winner():
break

def handle_turn(self, values):
# get next move from a player
try:
turn = int(input(f"Player {self.player} pick a square (1-9) from left to right: "))
except ValueError:
self.handle_turn(self.values)
return

# change values to show the move made (check square empty)
if self.values(turn-1) == "x" or self.values(turn-1) == "o":
print("That square has been played already!")
self.handle_turn(self.values)
else:
self.values(turn-1) = self.player
self.show_board()
# switch turns
self.flip_player()

def winner(self):
# check all possible win methods
self.row_winner = self.check_rows()
self.column_winner = self.check_columns()
self.diagonal_winner = self.check_diagonals()
#declare a winner
if self.row_winner:
winner = self.check_rows()
print(f"{winner} has won the game!")
return True
elif self.column_winner:
winner = self.check_columns()
print(f"{winner} has won the game!")
return True
elif self.diagonal_winner:
winner = self.check_diagonals()
print(f"{winner} has won the game!")
return True

def check_rows(self):
# Check for a win in the rows
row1 = self.values(0) == self.values(1) == self.values(2) != "-"
row2 = self.values(3) == self.values(4) == self.values(5) != "-"
row3 = self.values(6) == self.values(7) == self.values(8) != "-"
# Return the player that has won
if row1:
return self.values(0)
elif row2:
return self.values(3)
elif row3:
return self.values(6)

def check_columns(self):
# Check for a win in the columns
col1 = self.values(0) == self.values(3) == self.values(6) != "-"
col2 = self.values(1) == self.values(4) == self.values(7) != "-"
col3 = self.values(2) == self.values(5) == self.values(8) != "-"
# Return the winning player
if col1:
return self.values(0)
elif col2:
return self.values(1)
elif col3:
return self.values(2)

def check_diagonals(self):
# Check for win in the diagonals
dia1 = self.values(0) == self.values(4) == self.values(8) != "-"
dia2 = self.values(2) == self.values(4) == self.values(6) != "-"
# Return the player that has won
if dia1:
return self.values(0)
elif dia2:
return self.values(2)

def check_tie(self):
if "-" not in self.values:
print("Game is a tie!")
return True
else:
return False

def flip_player(self):
if self.player == "x":
self.player = "o"
else:
self.player = "x"

if __name__ == "__main__":
new_board = TicTacToe()
new_board.play_game()
$$```$$
``````