Exemple #1
0
    def __init__(self, master, infoPanel, intervalBar):
        """Constructor

        Parameters:
            master (tk.Tk|tk.Frame): The parent widget
        """
        self._master = master
        self._infoPanel = infoPanel
        self._infoPanel.init_window(master, self)
        self._intervalBar = intervalBar

        self._playing = True

        self._image_manager = ImageManager('images/dots/', loader=load_image)

        # Game
        counts = [10, 15, 25, 25]
        random.shuffle(counts)
        # randomly pair counts with each kind of dot
        objectives = zip(
            [BasicDot(1), BasicDot(2),
             BasicDot(4), BasicDot(3)], counts)

        self._objectives = ObjectiveManager(objectives)
        self._infoPanel.set_objectives(
            [self._objectives.get_status()[i][1] for i in range(4)])

        # Game
        dead_cells = {(2, 2), (2, 3), (2, 4), (3, 2), (3, 3), (3, 4), (4, 2),
                      (4, 3), (4, 4), (0, 7), (1, 7), (6, 7), (7, 7)}
        self._game = DotGame({ButterflyDot: 1},
                             objectives=self._objectives,
                             kinds=(1, 2, 3, 4),
                             size=(8, 8),
                             dead_cells=dead_cells)

        # The following code may be useful when you are implementing task 2:
        for i in range(0, 4):
            for j in range(0, 2):
                position = i, j
                self._game.grid[position].set_dot(ButterflyDot(3))
        self._game.grid[(7, 3)].set_dot(ButterflyDot(1))

        # Grid View
        self._grid_view = GridView(master,
                                   size=self._game.grid.size(),
                                   image_manager=self._image_manager)
        self._grid_view.pack()
        self._grid_view.draw(self._game.grid)
        self.draw_grid_borders()

        # Events
        self.bind_events()

        # Set initial score again to trigger view update automatically
        self._refresh_status()
Exemple #2
0
    def reset_with_com(self):
        # initialize pygame
        pygame.init()
        # load background music
        pygame.mixer.music.load('bgm2.ogg')
        pygame.mixer.music.play(-1, 0.0)
        pygame.mixer.music.set_volume(0.3)

        counts = [10, 15, 25, 25]
        random.shuffle(counts)
        # randomly pair counts with each kind of dot
        objectives = zip(
            [BasicDot(1), BasicDot(2),
             BasicDot(4), BasicDot(3)], counts)
        self._objectives = ObjectiveManager(list(objectives))

        # reset the objectives
        self._obj.draw(self._objectives.get_status())

        dead_cells = {(2, 2), (2, 3), (2, 4), (3, 2), (3, 3), (3, 4), (4, 2),
                      (4, 3), (4, 4), (0, 7), (1, 7), (6, 7), (7, 7)}
        self._game = CompanionGame({
            BasicDot: 1,
            CompanionDot: 1
        },
                                   companion=EskimoCompanion(),
                                   objectives=self._objectives,
                                   kinds=(1, 2, 3, 4),
                                   size=(8, 8),
                                   dead_cells=dead_cells)
        # reset the game(score, move)
        self._game.reset()

        # reset the grid
        self.draw_grid()

        # reset the score
        scores = self.info_panel.set_scores()
        scores.config(text=str(self._game.get_score()))
        # reset the move
        moves = self.info_panel.remain_moves()
        moves.config(text=str(self._game.get_moves()))

        # reset the interval bar
        self.interval_bar.progress_bar(0)
        self._game.companion.reset()
        # reset the companion bar
        self.interval_bar.com_charge_bar_reset()
        # reset the companion charge button
        self.action_bar.companion_charge().config(state='normal')
        # reset the color remover button
        self.action_bar.colour_remove().config(state='normal')
Exemple #3
0
 def activate(self, position, game, activated, has_loop=False):
     self._expired = True
     kind = self.get_kind()
     dots = list(
         game.grid.get_adjacent_cells(position, deltas=RADIAL_DELTAS))
     for i in dots:
         if game.grid[i].is_open():
             if game.grid[i].get_dot().get_name() == 'basic':
                 game.grid[i].set_dot(BasicDot(kind))
             elif game.grid[i].get_dot().get_name() == 'swirl':
                 game.grid[i].set_dot(SwirlDot(kind))
             elif game.grid[i].get_dot().get_name() == 'companion':
                 game.grid[i].set_dot(CompanionDot(kind))
Exemple #4
0
    def generate_dot(name, kind):
        """(AbstractDot) Load previous game data from file

        Parameters:
            name (str): The name of the dot to be create
            kind (str): The kind of the dot
        """
        dot = None
        if name == 'basic':
            dot = BasicDot(kind)
        elif name == 'companion':
            dot = CompanionDot(kind)
        elif name == 'wildcard':
            dot = WildcardDot()
        elif name == 'balloon':
            dot = BalloonDot()
        elif name == 'butterfly':
            dot = ButterflyDot()
        elif name == 'swirl':
            dot = SwirlDot(kind)
        elif name == 'beam':
            dot = BeamDot(kind)
        return dot
Exemple #5
0
    def __init__(self, master, icon=None, switch=False):
        """Constructor

        Parameters:
            master (tk.Tk|tk.Frame): The parent widget
        """
        self._master = master
        master.title(self.DEFAULT_TITLE)

        self.flag = False

        self.default_icon = tk.PhotoImage(file='images/companions/useless.gif')

        self.extra_icon = tk.PhotoImage(file='images/companions/penguin.gif')

        self.icon = icon if icon else self.default_icon

        self.default_step = 1

        self.score = 0

        self._playing = True

        self._image_manager = ImageManager('images/dots/', loader=load_image)

        menu_bar = tk.Menu(master)
        master.config(menu=menu_bar)

        file_menu = tk.Menu(menu_bar)
        menu_bar.add_cascade(label='File', menu=file_menu)
        file_menu.add_command(label='New Game', command=self.reset)
        file_menu.add_command(label='Exit Game', command=self.close)

        master.protocol('WM_DELETE_WINDOW', self.close)

        # Game
        counts = [10, 15, 25, 25]
        random.shuffle(counts)
        # randomly pair counts with each kind of dot
        objectives = zip(
            [BasicDot(1), BasicDot(2),
             BasicDot(4), BasicDot(3)], counts)

        self._objectives = ObjectiveManager(objectives)

        dead_cells = {(2, 2), (2, 3), (2, 4), (3, 2), (3, 3), (3, 4), (4, 2),
                      (4, 3), (4, 4), (0, 7), (1, 7), (6, 7), (7, 7)}
        self.dot_game = DotGame({BasicDot: 1},
                                objectives=self._objectives,
                                kinds=(1, 2, 3, 4),
                                size=(8, 8),
                                dead_cells=dead_cells)
        self.companion_game = CompanionGame(
            {
                BasicDot: 43,
                CompanionDot: 9,
                WildcardDot: 6
            },
            BuffaloCompanion(),
            objectives=self._objectives,
            kinds=(1, 2, 3, 4),
            size=(8, 8),
            dead_cells=dead_cells)

        # Game
        self._game = self.companion_game if switch else self.dot_game
        if self.FIRST:
            reply = askquestion(
                type=messagebox.YESNO,
                title='Select Model',
                message=
                'Would you like to start a new game with "Companion Dot"?')
            if reply == messagebox.YES:
                showinfo('"Companion Dot" Model',
                         'Enjoy the game with "Companion Dot"!')
                self.icon = self.extra_icon
                self._game = self.companion_game
                self._master.title('Dots & Co - "Companion Dot"')
            else:
                showinfo('New Game', 'Enjoy the basic game!')
                self._game = self.dot_game
            self.FIRST = False

        # The following code may be useful when you are implementing task 2:
        # for i in range(0, 4):
        #     for j in range(0, 2):
        #         position = i, j
        #         self._game.grid[position].set_dot(BasicDot(3))
        # self._game.grid[(7, 3)].set_dot(BasicDot(1))

        # InfoPanel
        self.info_panel = InfoPanel(master)
        self.info_panel.set_default_icon(self.icon)
        self.info_panel.decrease_remaining_moves_and_increase_score(
            self._game.get_moves(), self._game.get_score())
        self.info_panel.set_objectives(self._image_manager,
                                       self._objectives.get_status())
        self.info_panel.pack()

        # IntervalBar
        self.interval_bar = IntervalBar(master)
        self.interval_bar.draw_step(self.default_step)
        self.interval_bar.pack()

        # Grid View
        self._grid_view = GridView(master,
                                   size=self._game.grid.size(),
                                   image_manager=self._image_manager)
        self._grid_view.pack()
        self._grid_view.draw(self._game.grid)
        self.draw_grid_borders()

        # Events
        self.bind_events()

        # Set initial score again to trigger view update automatically
        self._refresh_status()
Exemple #6
0
    def __init__(self, master):
        """Constructor

        Parameters:
            master (tk.Tk|tk.Frame): The parent widget
        """
        pygame.init()
        self._master = master
        master.title('Dots')
        self._playing = True
        self._over = None
        self._player = 'None'
        self._scores = {}
        self._steps = 0
        self._image_manager = ImageManager('images/dots/', loader=load_image)

        # InfoPanel
        self._info = InfoPanel(master)
        self._info.pack(fill=tk.BOTH, expand=1)

        # Login
        top = tk.Toplevel()
        top.title('Login')
        tk.Label(top, text='Welcome to the Dots & Co game!').pack()
        frame = tk.Frame(top)
        frame.pack(side=tk.BOTTOM)
        tk.Label(frame, text="Name: ").pack(side=tk.LEFT)
        entry = tk.Entry(frame, width=20)
        entry.pack(side=tk.LEFT)

        def record(*args):
            self._player = entry.get()
            if self.read_score() == None:
                self.save_score()
            top.destroy()

        tk.Button(frame, text="Start!", command=record).pack(side=tk.RIGHT)
        top.bind('<Return>', record)

        # Menu
        menubar = tk.Menu(master)
        master.config(menu=menubar)
        filemenu = tk.Menu(menubar)
        menubar.add_cascade(label='File', menu=filemenu)
        newgame = tk.Menu(menubar)
        filemenu.add_cascade(label='New Game', menu=newgame)
        newgame.add_command(label='With a Companion',
                            command=self.with_companion)
        newgame.add_command(label='Without a Companion',
                            command=self.without_companion)
        filemenu.add_command(label='Exit', command=self.exit)
        master.protocol("WM_DELETE_WINDOW", self.exit)

        # Game
        counts = [10, 15, 25, 25]
        random.shuffle(counts)
        # randomly pair counts with each kind of dot
        objectives = zip(
            [BasicDot(1), BasicDot(2),
             BasicDot(4), BasicDot(3)], counts)

        self._objectives = ObjectiveManager(list(objectives))
        self._info.set_objectives(list(objectives))

        self._dead_cells = {(2, 2), (2, 3), (2, 4), (3, 2), (3, 3), (3, 4),
                            (4, 2), (4, 3), (4, 4), (0, 7), (1, 7), (6, 7),
                            (7, 7)}
        self._companion = EskimoCompanion()
        self._game = CompanionGame(
            {
                TurtleDot: 1,
                CompanionDot: 4,
                BasicDot: 11
            },
            objectives=self._objectives,
            companion=self._companion,
            kinds=(1, 2, 3, 4),
            size=(8, 8),
            dead_cells=self._dead_cells)

        # Grid View
        self._grid_view = GridView(self._master,
                                   size=self._game.grid.size(),
                                   image_manager=self._image_manager)
        self._grid_view.pack()
        self._grid_view.draw(self._game.grid)
        self.draw_grid_borders()

        # Events
        self.bind_events()

        # Set initial score again to trigger view update automatically
        self._refresh_status()

        self.read_score()
Exemple #7
0
    def __init__(self, master):
        """Constructor

        Parameters:
            master (tk.Tk|tk.Frame): The parent widget
        """
        self._master = master
        self._master.title('Dot')
        self._playing = True
        self._image_manager = ImageManager('images/dots/', loader=load_image)

        # initialize pygame
        pygame.init()

        # load background music
        pygame.mixer.music.load('bgm2.ogg')
        pygame.mixer.music.play(-1, 0.0)
        pygame.mixer.music.set_volume(0.3)

        # create an instance of InfoPanel
        self.info_panel = InfoPanel(master)
        self.info_panel.pack()

        # create an instance of IntervalBar
        self.interval_bar = IntervalBar(master)
        self.interval_bar.pack()

        # create an instance of ActionBar
        self.action_bar = ActionBar(master)
        self.action_bar.pack(side=tk.BOTTOM)

        # add command to two button
        self.action_bar.companion_charge().config(command=self.com_button)
        self.action_bar.colour_remove().config(command=self.colour_activate)

        # File menu
        menubar = tk.Menu(self._master)
        # tell master what it's menu is
        self._master.config(menu=menubar)
        filemenu = tk.Menu(menubar)
        menubar.add_cascade(label="File", menu=filemenu)
        filemenu.add_command(label="New Game(companion)",
                             command=self.reset_with_com)
        filemenu.add_command(label="New Game(no-companion)",
                             command=self.reset_without_com)
        filemenu.add_command(label="Exit", command=self.exit)

        # Game
        counts = [10, 15, 25, 25]
        random.shuffle(counts)
        # randomly pair counts with each kind of dot
        objectives = zip(
            [BasicDot(1), BasicDot(2),
             BasicDot(4), BasicDot(3)], counts)
        self._objectives = ObjectiveManager(list(objectives))
        # show the objectives
        self._obj = self.info_panel.set_object()
        self._obj.draw(self._objectives.get_status())

        # Game
        dead_cells = {(2, 2), (2, 3), (2, 4), (3, 2), (3, 3), (3, 4), (4, 2),
                      (4, 3), (4, 4), (0, 7), (1, 7), (6, 7), (7, 7)}
        self._game = CompanionGame({
            BasicDot: 1,
            CompanionDot: 1
        },
                                   companion=EskimoCompanion(),
                                   objectives=self._objectives,
                                   kinds=(1, 2, 3, 4),
                                   size=(8, 8),
                                   dead_cells=dead_cells)

        # show the remaining moves
        moves = self.info_panel.remain_moves()
        moves.config(text=str(self._game.get_moves()))
        # show the scores
        scores = self.info_panel.set_scores()
        scores.config(text=str(self._game.get_score()))

        # control the reset type(with/without companion)
        self._play_with_com = True

        # Grid View
        self._grid_view = GridView(master,
                                   size=self._game.grid.size(),
                                   image_manager=self._image_manager)
        self._grid_view.pack()
        self._grid_view.draw(self._game.grid)
        self.draw_grid_borders()

        # Events
        self.bind_events()

        # Set initial score again to trigger view update automatically
        self._refresh_status()
Exemple #8
0
    def __init__(self, master):
        """Constructor

        Parameters:
            master (tk.Tk|tk.Frame): The parent widget
        """
        self._master = master
        self._playing = True
        self._image_manager = ImageManager('images/dots/', loader=load_image)

        # Game
        self._size = (8, 8)
        counts = [20, 15, 20, 25]
        random.shuffle(counts)
        # Randomly pair counts with each kind of dot
        objectives = zip(
            [BasicDot(1), BasicDot(2),
             BasicDot(8), BasicDot(3)], counts)

        self._objectives = ObjectiveManager(objectives)

        # Define companions
        self._companions = {
            'penguin': PenguinCompanion(max_charge=6),
            'eskimo': EskimoCompanion(max_charge=6, dot_count=4),
            'buffalo': BuffaloCompanion(max_charge=5, dot_count=5),
            'captain': CaptainCompanion(max_charge=5, dot_count=4),
            'aristotle': AristotleCompanion(max_charge=4, dot_count=2)
        }

        # Define dead cell maps
        dead_cells = {
            'endless': {},
            'companion': {(2, 1), (2, 2), (3, 1), (3, 2), (5, 4), (5, 5),
                          (5, 6)},
        }

        # Define game types
        self._games = {
            'endless':
            EndlessGame({BasicDot: 1},
                        size=self._size,
                        dead_cells=dead_cells['endless'],
                        kinds=(1, 2, 3, 4, 8)),
            'companion':
            AdvancedGame(
                {
                    BasicDot: 1,
                    CompanionDot: COMPANION_DOT_RATE
                },
                size=self._size,
                dead_cells=dead_cells['companion'],
                kinds=(1, 2, 3, 8),
                companion=random.choice(list(self._companions.values())),
                objectives=self._objectives,
                moves=20,
            )
        }

        # Choose a initial game to play
        self._game_mode = 'companion'
        self._game = self._games[self._game_mode]

        # Info Panel
        self._info_panel = InfoPanel(master, image_manager=self._image_manager)
        self._info_panel.pack(expand=True, fill=tk.BOTH)
        self._info_panel.set_companion(self._game.companion.get_name())
        self._info_panel.set_interval(self._game.companion.get_max_charge(),
                                      self._game.companion.get_charge())

        # Grid View
        self._grid_view = AdvancedGridView(master,
                                           size=self._game.grid.size(),
                                           image_manager=self._image_manager)
        self._grid_view.pack()
        self.draw_grid()
        self.draw_grid_borders()

        # Action Panel
        self._action_bar = ActionBar(master)
        self._action_bar.pack()

        # Menu & Title
        self._main_menu = MainMenu(master)
        self._master.config(menu=self._main_menu)

        # Events
        self.bind_events()
        for game in self._games.values():
            self.bind_game_events(game)

        # Set initial score again to trigger view update automatically
        self._refresh_status()

        # Set windows position to center
        self._update_title()
        self._move_to_center()