import numpy as np
from numba import jit
PLAYER = {
"None": 0,
"First": 1,
"Second": 2
}
JUDGE = {
"None": "none",
"OUT_OF_RANGE" : "out_of_range",
"OVERLAP": "overlap",
"WIN": "win",
"DRAW": "draw"
}
class TicTacToe:
def __init__(self, turn_limit = 100):
self.BOARD_ROWS = 3
self.BOARD_COLS = 3
self.BOARD_SIZE = 9
self.REMAIN_PIECES = 3
self.PLAYERS = 2
self.TURN_LIMIT = turn_limit
self.NONE = 0
self.LINES = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6]])
self.Board = np.array([self.NONE for i in range(self.BOARD_SIZE)])
def Init(self):
self.Player = PLAYER["First"]
self.Turn = 1
self.Judge = JUDGE["None"]
def Set(self, pos):
self.LastSet = pos
if (pos < 0 or pos >= self.BOARD_SIZE):
self.Judge = JUDGE["OUT_OF_RANGE"]
return
if (self.Board[pos] != 0):
self.Judge = JUDGE["OVERLAP"]
return
if (self.Turn > self.REMAIN_PIECES):
self.Board[np.where(0 < self.Board)] -= 1
self.Board[pos] = self.REMAIN_PIECES
else:
self.Board[pos] = self.Turn
for line in self.LINES:
if (self.Board[line[0]] > 0 and self.Board[line[1]] > 0 and self.Board[line[2]] > 0):
self.Judge = JUDGE["WIN"]
return
if self.Player == PLAYER["First"]:
self.Player = PLAYER["Second"]
else:
self.Player = PLAYER["First"]
self.Turn += 1
if (self.Turn >= self.TURN_LIMIT):
self.Judge = JUDGE["DRAW"]
return
self.FlipBoard()
return
def FlipBoard(self):
self.Board *= -1
def GetBoard(self):
return self.Board