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