Esempio n. 1
0
class Game_offline(tk.Tk):
    def __init__(self, mode):
        tk.Tk.__init__(self)
        self.stop_game = False
        self.player = 1
        self.mode = mode
        self.states = [[0 for i in range(BOARD_SIZE)]
                       for j in range(BOARD_SIZE)]
        self.board = Board(self, self, mode)
        self.board.pack()
        self.board.tkraise()
        if mode == 1:  #1v1
            self.callback = self.callback_1v1
        if mode == 2:  #AI
            self.callback = self.callback_AI
            self.history = []
            self.AI = AI()

    def callback_AI(self, r, c):
        if self.states[r][c] != 0 or self.stop_game:
            return
        self.AI.capture_location((r, c), 1)
        self.history.append([r, c])
        self.board.step(r, c, self.player)
        self.states[r][c] = self.player
        self.player = (self.player % 2) + 1
        dir, self.stop_game = self.check_for_winner(r, c)
        if self.stop_game:
            self.board.draw_win(r, c, dir)
            return
        Tk.update_idletasks(self)
        step = self.AI.get_AI_move()
        r, c = step[0], step[1]
        self.history.append([r, c])
        if self.states[r][c] != 0 or self.stop_game:
            return
        self.AI.capture_location((r, c), 2)
        self.board.step(r, c, self.player)
        self.states[r][c] = self.player
        self.player = (self.player % 2) + 1
        dir, self.stop_game = self.check_for_winner(r, c)
        if self.stop_game:
            self.board.draw_win(r, c, dir)
            return

    def callback_1v1(self, r, c):
        if self.states[r][c] != 0 or self.stop_game:
            return
        self.board.step(r, c, self.player)
        self.states[r][c] = self.player
        self.player = (self.player % 2) + 1
        dir, self.stop_game = self.check_for_winner(r, c)
        if self.stop_game:
            self.board.draw_win(r, c, dir)

    def start_play(self):
        self.stop_game = False

    def undo(self):
        if len(self.history) < 2:
            return
        field = self.history[-1]
        self.board.undo(field[0], field[1])
        self.AI.free_location(field)
        del self.history[-1]
        field = self.history[-1]
        self.board.undo(field[0], field[1])
        self.AI.free_location(field)
        del self.history[-1]

    def check_for_winner(self, r, c):
        for dir in [[0, 1], [1, 0], [1, 1], [1, -1]]:
            num = 1
            for sign in [1, -1]:
                i, j = r, c
                while True:
                    i, j = i + sign * dir[0], j + sign * dir[1]
                    if any(x in set([i, j]) for x in [-1, BOARD_SIZE]):
                        break
                    if self.states[i][j] == self.states[r][c]:
                        num += 1
                        if num == 5:
                            return dir, True
                    else:
                        break
        return None, False