Skip to content

Instantly share code, notes, and snippets.

@alirezamika
Created December 27, 2020 07:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alirezamika/6d884ec8d5881a4d72015e5e804e1241 to your computer and use it in GitHub Desktop.
Save alirezamika/6d884ec8d5881a4d72015e5e804e1241 to your computer and use it in GitHub Desktop.
class TicTacToe:
def __init__(self, render=True):
self.board = [[0, 0, 0] for _ in range(3)]
self.player = 1
self.repr = {0: ".", 1: "x", -1: "o"}
self.render = render
def _get_winner(self):
# check horizontal
for i in range(3):
if abs(sum(self.board[i])) == 3:
return self.board[i][0]
# check vertical
for i in range(3):
if abs(sum(self.board[j][i] for j in range(3))) == 3:
return self.board[0][i]
# check diagonal
if abs(sum(self.board[i][i] for i in range(3))) == 3:
return self.board[0][0]
if abs(sum(self.board[i][2 - i] for i in range(3))) == 3:
return self.board[0][2]
return None
def get_state(self):
return str(self.board)
def get_valid_actions(self):
actions = []
for i in range(3):
for j in range(3):
if self.board[i][j] == 0:
actions.append((i, j))
return actions
def is_ended(self):
for i in range(3):
for j in range(3):
if self.board[i][j] == 0:
return False
return True
def _print(self):
for row in self.board:
for item in row:
print(self.repr[item], end="\t")
print("\n")
print("-----------------\n")
def play(self, x, y):
if self.board[x][y] != 0:
return None
self.board[x][y] = self.player
if self.render:
self._print()
winner = self._get_winner()
if winner:
return winner
self.player *= -1
return None
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment