コード例 #1
0
class GameManager(object):
    def __init__(self, **props):
        self.model = Checkers()
        self._root = props['root']
        self.parent = props['parent']
        self.training = props['training']  # If true, game will be played
        # against an evolved GPController
        statusbar = Label(self._root,
                          relief=SUNKEN,
                          font=('Helvetica', 7),
                          anchor=NW)
        statusbar.pack(side='bottom', fill='x')
        self.view = BoardView(self._root,
                              model=self.model,
                              parent=self,
                              statusbar=statusbar,
                              invisible=True)
        if self.training:
            self.view.override_canvas(TrainingCanvas())
            self.fitness = props['fitness']

        self.player_color = BLACK
        self.num_players = 1
        self.set_controllers()
        self._controller1.start_turn()
        self.filename = None

    def set_controllers(self):
        think_time = self.parent.thinkTime.get()
        if self.num_players == 0:
            self._controller1 = AlphaBetaController(
                model=self.model,
                view=self.view,
                searchtime=think_time,
                end_turn_event=self.turn_finished)
            self._controller2 = AlphaBetaController(
                model=self.model,
                view=self.view,
                searchtime=think_time,
                end_turn_event=self.turn_finished)
        elif self.num_players == 1 and not self.training:
            self._controller2 = PlayerController(
                model=self.model,
                view=self.view,
                end_turn_event=self.turn_finished)
            self._controller1 = GPController(model=self.model,
                                             view=self.view,
                                             searchtime=think_time,
                                             end_turn_event=self.turn_finished,
                                             fitness=None)
        elif self.num_players == 1 and self.training:
            self._controller1 = GPController(model=self.model,
                                             view=self.view,
                                             end_turn_event=self.turn_finished,
                                             fitness=self.fitness)
            self._controller2 = AlphaBetaController(
                model=self.model,
                view=self.view,
                searchtime=think_time,
                end_turn_event=self.turn_finished)
            # swap controllers if White is selected as the player
            if self.player_color == WHITE:
                self._controller1, self._controller2 = self._controller2, self._controller1
        elif self.num_players == 2:
            self._controller1 = PlayerController(
                model=self.model,
                view=self.view,
                end_turn_event=self.turn_finished)
            self._controller2 = PlayerController(
                model=self.model,
                view=self.view,
                end_turn_event=self.turn_finished)
        self._controller1.set_before_turn_event(
            self._controller2.remove_highlights)
        self._controller2.set_before_turn_event(
            self._controller1.remove_highlights)

    def _stop_updates(self):
        # stop alphabeta threads from making any moves
        self.model.curr_state.ok_to_move = False
        self._controller1.stop_process()
        self._controller2.stop_process()

    def _save_curr_game_if_needed(self):
        if self.view.is_dirty():
            msg = 'Do you want to save your changes'
            if self.filename:
                msg += ' to %s?' % self.filename
            else:
                msg += '?'
            result = askyesnocancel(TITLE, msg)
            if result == True:
                self.save_game()
            return result
        else:
            return False

    def new_game(self):
        self._stop_updates()
        self._save_curr_game_if_needed()
        self.filename = None
        self._root.title('Raven ' + VERSION)
        self.model = Checkers()
        self.player_color = BLACK
        self.view.reset_view(self.model)
        self.think_time = self.parent.thinkTime.get()
        self.set_controllers()
        self.view.update_statusbar()
        self.view.reset_toolbar_buttons()
        self.view.curr_annotation = ''
        self._controller1.start_turn()

    def load_game(self, filename):
        self._stop_updates()
        try:
            saved_game = SavedGame()
            saved_game.read(filename)
            self.model.curr_state.clear()
            self.model.curr_state.to_move = saved_game.to_move
            self.num_players = saved_game.num_players
            squares = self.model.curr_state.squares
            for i in saved_game.black_men:
                squares[squaremap[i]] = BLACK | MAN
            for i in saved_game.black_kings:
                squares[squaremap[i]] = BLACK | KING
            for i in saved_game.white_men:
                squares[squaremap[i]] = WHITE | MAN
            for i in saved_game.white_kings:
                squares[squaremap[i]] = WHITE | KING
            self.model.curr_state.reset_undo()
            self.model.curr_state.redo_list = saved_game.moves
            self.model.curr_state.update_piece_count()
            self.view.reset_view(self.model)
            self.view.serializer.restore(saved_game.description)
            self.view.curr_annotation = self.view.get_annotation()
            self.view.flip_board(saved_game.flip_board)
            self.view.update_statusbar()
            self.parent.set_title_bar_filename(filename)
            self.filename = filename
        except IOError as (err):
            showerror(PROGRAM_TITLE, 'Invalid file. ' + str(err))

    def open_game(self):
        self._stop_updates()
        self._save_curr_game_if_needed()
        f = askopenfilename(filetypes=(('Raven Checkers files', '*.rcf'),
                                       ('All files', '*.*')),
                            initialdir=TRAINING_DIR)
        if not f:
            return
        self.load_game(f)

    def save_game_as(self):
        self._stop_updates()
        filename = asksaveasfilename(filetypes=(('Raven Checkers files',
                                                 '*.rcf'), ('All files',
                                                            '*.*')),
                                     initialdir=TRAINING_DIR,
                                     defaultextension='.rcf')
        if filename == '':
            return
        self._write_file(filename)

    def save_game(self):
        self._stop_updates()
        filename = self.filename
        if not self.filename:
            filename = asksaveasfilename(filetypes=(('Raven Checkers files',
                                                     '*.rcf'), ('All files',
                                                                '*.*')),
                                         initialdir=TRAINING_DIR,
                                         defaultextension='.rcf')
            if filename == '':
                return
        self._write_file(filename)

    def _write_file(self, filename):
        try:
            saved_game = SavedGame()
            # undo moves back to the beginning of play
            undo_steps = 0
            while self.model.curr_state.undo_list:
                undo_steps += 1
                self.model.curr_state.undo_move(None, True, True,
                                                self.view.get_annotation())
            # save the state of the board
            saved_game.to_move = self.model.curr_state.to_move
            saved_game.num_players = self.num_players
            saved_game.black_men = []
            saved_game.black_kings = []
            saved_game.white_men = []
            saved_game.white_kings = []
            for i, sq in enumerate(self.model.curr_state.squares):
                if sq == BLACK | MAN:
                    saved_game.black_men.append(keymap[i])
                elif sq == BLACK | KING:
                    saved_game.black_kings.append(keymap[i])
                elif sq == WHITE | MAN:
                    saved_game.white_men.append(keymap[i])
                elif sq == WHITE | KING:
                    saved_game.white_kings.append(keymap[i])
            saved_game.description = self.view.serializer.dump()
            saved_game.moves = self.model.curr_state.redo_list
            saved_game.flip_board = self.view.flip_view
            saved_game.write(filename)
            # redo moves forward to the previous state
            for i in range(undo_steps):
                annotation = self.view.get_annotation()
                self.model.curr_state.redo_move(None, annotation)
            # record current filename in title bar
            self.parent.set_title_bar_filename(filename)
            self.filename = filename
        except IOError:
            showerror(PROGRAM_TITLE, 'Could not save file.')

    def turn_finished(self):
        if self.model.curr_state.to_move == BLACK:
            self._controller2.end_turn()  # end White's turn
            if self._root:
                self._root.update()
            self.view.update_statusbar()
            self._controller1.start_turn()  # begin Black's turn
        else:
            self._controller1.end_turn()  # end Black's turn
            if self._root:
                self._root.update()
            self.view.update_statusbar()
            self._controller2.start_turn()  # begin White's turn
コード例 #2
0
class GameManager(object):
    def __init__(self, **props):
        self.model = Checkers()
        self._root = props['root']
        self.parent = props['parent']
        self.training = props['training']   # If true, game will be played
                                            # against an evolved GPController
        statusbar = Label(self._root, relief=SUNKEN, font=('Helvetica',7),
                          anchor=NW)
        statusbar.pack(side='bottom', fill='x')
        self.view = BoardView(self._root, model=self.model, parent=self,
                            statusbar=statusbar, invisible=True)
        if self.training:
            self.view.override_canvas(TrainingCanvas())
            self.fitness = props['fitness']

        self.player_color = BLACK
        self.num_players = 1
        self.set_controllers()
        self._controller1.start_turn()
        self.filename = None


    def set_controllers(self):
        think_time = self.parent.thinkTime.get()
        if self.num_players == 0:
            self._controller1 = AlphaBetaController(model=self.model,
                                                    view=self.view,
                                                    searchtime=think_time,
                                                    end_turn_event=self.turn_finished)
            self._controller2 = AlphaBetaController(model=self.model,
                                                    view=self.view,
                                                    searchtime=think_time,
                                                    end_turn_event=self.turn_finished)
        elif self.num_players == 1 and not self.training:
            self._controller2 = PlayerController(model=self.model,
                                                 view=self.view,
                                                 end_turn_event=self.turn_finished)
            self._controller1 = GPController(model=self.model,
                                                    view=self.view,
                                                    searchtime=think_time,
                                                    end_turn_event=self.turn_finished,
                                                    fitness = None)
        elif self.num_players == 1 and self.training:
            self._controller1 = GPController(model=self.model,
                                             view=self.view,
                                             end_turn_event=self.turn_finished,
                                             fitness = self.fitness)
            self._controller2 = AlphaBetaController(model=self.model,
                                                    view=self.view,
                                                    searchtime=think_time,
                                                    end_turn_event=self.turn_finished)
            # swap controllers if White is selected as the player
            if self.player_color == WHITE:
                self._controller1, self._controller2 = self._controller2, self._controller1
        elif self.num_players == 2:
            self._controller1 = PlayerController(model=self.model,
                                                 view=self.view,
                                                 end_turn_event=self.turn_finished)
            self._controller2 = PlayerController(model=self.model,
                                                 view=self.view,
                                                 end_turn_event=self.turn_finished)
        self._controller1.set_before_turn_event(self._controller2.remove_highlights)
        self._controller2.set_before_turn_event(self._controller1.remove_highlights)

    def _stop_updates(self):
        # stop alphabeta threads from making any moves
        self.model.curr_state.ok_to_move = False
        self._controller1.stop_process()
        self._controller2.stop_process()

    def _save_curr_game_if_needed(self):
        if self.view.is_dirty():
            msg = 'Do you want to save your changes'
            if self.filename:
                msg += ' to %s?' % self.filename
            else:
                msg += '?'
            result = askyesnocancel(TITLE, msg)
            if result == True:
                self.save_game()
            return result
        else:
            return False

    def new_game(self):
        self._stop_updates()
        self._save_curr_game_if_needed()
        self.filename = None
        self._root.title('Raven ' + VERSION)
        self.model = Checkers()
        self.player_color = BLACK
        self.view.reset_view(self.model)
        self.think_time = self.parent.thinkTime.get()
        self.set_controllers()
        self.view.update_statusbar()
        self.view.reset_toolbar_buttons()
        self.view.curr_annotation = ''
        self._controller1.start_turn()

    def load_game(self, filename):
        self._stop_updates()
        try:
            saved_game = SavedGame()
            saved_game.read(filename)
            self.model.curr_state.clear()
            self.model.curr_state.to_move = saved_game.to_move
            self.num_players = saved_game.num_players
            squares = self.model.curr_state.squares
            for i in saved_game.black_men:
                squares[squaremap[i]] = BLACK | MAN
            for i in saved_game.black_kings:
                squares[squaremap[i]] = BLACK | KING
            for i in saved_game.white_men:
                squares[squaremap[i]] = WHITE | MAN
            for i in saved_game.white_kings:
                squares[squaremap[i]] = WHITE | KING
            self.model.curr_state.reset_undo()
            self.model.curr_state.redo_list = saved_game.moves
            self.model.curr_state.update_piece_count()
            self.view.reset_view(self.model)
            self.view.serializer.restore(saved_game.description)
            self.view.curr_annotation = self.view.get_annotation()
            self.view.flip_board(saved_game.flip_board)
            self.view.update_statusbar()
            self.parent.set_title_bar_filename(filename)
            self.filename = filename
        except IOError as (err):
            showerror(PROGRAM_TITLE, 'Invalid file. ' + str(err))

    def open_game(self):
        self._stop_updates()
        self._save_curr_game_if_needed()
        f = askopenfilename(filetypes=(('Raven Checkers files','*.rcf'),
                                       ('All files','*.*')),
                            initialdir=TRAINING_DIR)
        if not f:
            return
        self.load_game(f)

    def save_game_as(self):
        self._stop_updates()
        filename = asksaveasfilename(filetypes=(('Raven Checkers files','*.rcf'),
                                                ('All files','*.*')),
                                     initialdir=TRAINING_DIR,
                                     defaultextension='.rcf')
        if filename == '':
            return
        self._write_file(filename)

    def save_game(self):
        self._stop_updates()
        filename = self.filename
        if not self.filename:
            filename = asksaveasfilename(filetypes=(('Raven Checkers files','*.rcf'),
                                                    ('All files','*.*')),
                                         initialdir=TRAINING_DIR,
                                         defaultextension='.rcf')
            if filename == '':
                return
        self._write_file(filename)

    def _write_file(self, filename):
        try:
            saved_game = SavedGame()
            # undo moves back to the beginning of play
            undo_steps = 0
            while self.model.curr_state.undo_list:
                undo_steps += 1
                self.model.curr_state.undo_move(None, True, True,
                                                self.view.get_annotation())
            # save the state of the board
            saved_game.to_move = self.model.curr_state.to_move
            saved_game.num_players = self.num_players
            saved_game.black_men = []
            saved_game.black_kings = []
            saved_game.white_men = []
            saved_game.white_kings = []
            for i, sq in enumerate(self.model.curr_state.squares):
                if sq == BLACK | MAN:
                    saved_game.black_men.append(keymap[i])
                elif sq == BLACK | KING:
                    saved_game.black_kings.append(keymap[i])
                elif sq == WHITE | MAN:
                    saved_game.white_men.append(keymap[i])
                elif sq == WHITE | KING:
                    saved_game.white_kings.append(keymap[i])
            saved_game.description = self.view.serializer.dump()
            saved_game.moves = self.model.curr_state.redo_list
            saved_game.flip_board = self.view.flip_view
            saved_game.write(filename)
            # redo moves forward to the previous state
            for i in range(undo_steps):
                annotation = self.view.get_annotation()
                self.model.curr_state.redo_move(None, annotation)
            # record current filename in title bar
            self.parent.set_title_bar_filename(filename)
            self.filename = filename
        except IOError:
            showerror(PROGRAM_TITLE, 'Could not save file.')

    def turn_finished(self):
        if self.model.curr_state.to_move == BLACK:
            self._controller2.end_turn() # end White's turn
            if self._root:
                self._root.update()
            self.view.update_statusbar()
            self._controller1.start_turn() # begin Black's turn
        else:
            self._controller1.end_turn() # end Black's turn
            if self._root:
                self._root.update()
            self.view.update_statusbar()
            self._controller2.start_turn() # begin White's turn