Newer
Older
PyTicTacToe / TicTacToe.py
@sato sato on 1 Mar 2022 1 KB 最初のコミット
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