Skip to content

Instantly share code, notes, and snippets.

@twitu
Created October 4, 2023 10:50
Show Gist options
  • Save twitu/feee559b23dc1ba48b2ac4f8a13aa68d to your computer and use it in GitHub Desktop.
Save twitu/feee559b23dc1ba48b2ac4f8a13aa68d to your computer and use it in GitHub Desktop.
Ticcy Taccy Toey
import random
class Board:
def __init__(self) -> None:
self.turn = random.choice(['x', 'o'])
self.len = 3
self.state = ['_' for _ in range(self.len * self.len)]
self.patterns = self.check_patterns()
def __str__(self):
board = []
for row in range(self.len):
line = []
for col in range(self.len):
line.append(self.get_tile(row, col))
board.append(''.join(line))
return '\n'.join(board)
def set_tile(self, tile, row, col):
self.state[row*3 + col] = tile
def get_tile(self, row, col):
return self.state[row*3 + col]
def check_patterns(self):
patterns = []
# horizontal lines
for row in range(self.len):
patterns.append([(row, col) for col in range(0, self.len)])
# vertical lines
for col in range(self.len):
patterns.append([(row, col) for row in range(0, self.len)])
# diagonals
patterns.append([(i, i) for i in range(0, self.len)])
patterns.append([(i, self.len - i - 1) for i in range(0, self.len)])
return patterns
def is_win_for(self):
for tiles in self.patterns:
(r, c) = tiles[0]
check_tile = self.get_tile(r, c)
for (r, c) in tiles[1:]:
if check_tile != self.get_tile(r, c):
break
else:
return check_tile
return '_'
def play_tile(self, row, col):
self.set_tile(self.turn, row, col)
self.turn = 'o' if self.turn == 'x' else 'x'
def play_turn(self):
print(f"Player {self.turn}'s turn...")
while True:
while True:
row = int(input(f"Enter row number between 1 and {self.len}: ")) - 1
if 0 <= row < self.len:
break
while True:
col = int(input(f"Enter column number between 1 and {self.len}: ")) - 1
if 0 <= col < self.len:
break
if self.get_tile(row, col) != '_':
print("This tile is already set. Pick a different tile.")
else:
self.play_tile(row, col)
break
if __name__ == "__main__":
print("Starting new game...")
board = Board()
while True:
print(board)
board.play_turn()
winner = board.is_win_for()
if winner != '_':
print(f"Winner is Player {winner}!!")
print(board)
break
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment