Exemple #1
0
 def test_viewIsRenderedWithoutException(self):
     try:
         view = GameView(gridDimensions=(4, 4))
         view.render(self.grid)
     except:
         self.fail(
             "Instantiating view and rendering grid raised an exception")
Exemple #2
0
 def __init__(self, player_one: str, player_two: str):
     self.player_one = Player(player_one)
     self.player_two = Player(player_two)
     self.view = GameView(self)
     self.select_match = \
         re.compile(r'^([0-7])\s([0-7])\s([\d])\s([LRUDlrud])\s*$')
     self.game_match = re.compile(r'^([0-7])\s([0-7])\s*$')
    def __init__(self):
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as self.s:
            self.s.connect(('127.0.0.1', 8123))
            self.log: List[str] = []
            self.view = GameView(self)

            p: packet.Packet = packet.receive(self.s)
            if isinstance(p, packet.WelcomePacket):
                self.login()
Exemple #4
0
    def __init__(self, master: tk.Tk, delay: int = 20):
        """Construct a tower defence game in a root window

        Parameters:
            master (tk.Tk): Window to place the game into
        """

        self._master = master
        super().__init__(master, delay=delay)

        self._game = game = TowerGame()

        self.setup_menu()

        # create a game view and draw grid borders
        self._view = view = GameView(master, size=game.grid.cells,
                                     cell_size=game.grid.cell_size,
                                     bg='antique white')
        view.pack(side=tk.LEFT, expand=True)

        self.sidebar_container = tk.Frame(master)
        self.sidebar_container.pack(side=tk.LEFT, expand=True, fill='both')

        # Task 1.3 (Status Bar): instantiate status bar
        self._statusbar = statusbar = StatusBar(self.sidebar_container)
        statusbar.pack(side=tk.TOP, anchor=tk.N)

        # Task 1.5 (Play Controls): instantiate widgets here
        self._play_controls = playcontrols = PlayControls(self.sidebar_container, self.next_wave, self._toggle_paused)
        playcontrols.pack(side=tk.BOTTOM, anchor=tk.S)

        # bind game events
        game.on("enemy_death", self._handle_death)
        game.on("enemy_escape", self._handle_escape)
        game.on("cleared", self._handle_wave_clear)

        # Task 1.2 (Tower Placement): bind mouse events to canvas here
        self._view.bind("<Button-1>", self._left_click)
        self._view.bind("<Motion>", self._move)
        self._view.bind("<Leave>", self._mouse_leave)
        self._view.bind("<Button-2>", self._sell_tower)
        self._view.bind("<Button-3>", self._sell_tower)

        # Level
        self._level = MyLevel()

        self.select_tower(SimpleTower)

        view.draw_borders(game.grid.get_border_coordinates())

        # Get ready for the game
        self._setup_game()
Exemple #5
0
def main():
    # program runner
    global main_word, game_limit, game_hints, bool_index, game_score

    hm_app = QApplication(sys.argv)

    while True:
        view = GameView(game_limit, game_hints, game_score,
                        H.word_output(main_word, bool_index))
        view.show()

        Controller(view=view)
        print(main_word)

        hm_app.exec_()

        __start__()
Exemple #6
0
def main() -> None:
    model = GameModel()
    controller = GameController(model)
    view = GameView(controller, board_size=300, grid_size=3)
                    str(self._player_2_cards[i][lastIndex].getSuit()))
                image = pygame.image.load(img_string)
                screen.blit(image, ((DIST_BETWEEN_COLUMNS * (i + 1)) +
                                    (TRANS_COL_WIDTH / 4), (HEIGHT / 3.3) +
                                    ((lastIndex + 1) * DIST_BETWEEN_NUMBERS) +
                                    DIST_FROM_BOTTOM + 10))
            except IndexError:
                pass

    def displaySideCard(self, screen, card):
        if card is None:
            SIDE_CARD_IMG = pygame.image.load('resources/backCard.gif')
            screen.blit(SIDE_CARD_IMG,
                        (WIDTH - DIST_FROM_RIGHT_SIDE, HEIGHT // 2))
        else:
            try:
                img_string = 'resources/{0}{1}.gif'.format(
                    str(card.getRank()), str(card.getSuit()))
                image = pygame.image.load(img_string)
                screen.blit(image, (WIDTH - DIST_FROM_RIGHT_SIDE, HEIGHT // 2))
            except IndexError:
                pass


if __name__ == '__main__':
    play = Play()
    view = GameView()
    game = GameController(play, view, play.__getPlayer1Hands__(),
                          play.__getPlayer2Hands__())
    game.start()
Exemple #8
0
    def __init__(self, master: tk.Tk, delay: int = 20):
        """Construct a tower defence game in a root window

        Parameters:
            master (tk.Tk): Window to place the game into
        """

        self._master = master
        super().__init__(master, delay=delay)

        self._game = game = TowerGame()

        self.setup_menu()

        # create a game view and draw grid borders
        self._view = view = GameView(master,
                                     size=game.grid.cells,
                                     cell_size=game.grid.cell_size,
                                     bg='antique white')
        view.pack(side=tk.LEFT, expand=True)
        self._master.title("Towers")
        # initialise the status bar
        self._statusbar = StatusBar(master)
        self._statusbar.pack(side=tk.TOP)

        # Initialise the frame for the play, next wave buttown
        self._Frame = tk.Frame(self._master, bg="#4a2f48")
        self._Frame.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
        self._button_next_wave = tk.Button(self._Frame,
                                           text="Next Wave",
                                           command=self.next_wave)
        self._button_next_wave.pack(side=tk.LEFT, anchor=S, padx=(40, 0))
        self._button_pause = tk.Button(self._Frame,
                                       text="Play",
                                       state=ACTIVE,
                                       command=self._toggle_paused)
        self._button_pause.pack(side=tk.LEFT, anchor=S)
        # initialise the shop window
        self._towers = [
            SimpleTower, EnerygyTower, PulseTower, MissileTower, IceTower
        ]

        # Create views for each tower & store to update if availability changes
        shop = tk.Frame(self._master, bg="#4a2f48")
        shop.pack(fill=tk.X)
        self._tower_views = []
        for tower_class in self._towers:
            tower = tower_class(self._game.grid.cell_size // 2)

            tower_view = ShopTowerView(shop,
                                       tower,
                                       click_command=lambda class_=tower_class:
                                       self.select_tower(class_))
            tower_view.pack(fill=tk.BOTH)
            self._tower_views.append(
                (tower, tower_view)
            )  # Can use to check if tower is affordable when refreshing view
        # bind game events
        game.on("enemy_death", self._handle_death)
        game.on("enemy_escape", self._handle_escape)
        game.on("cleared", self._handle_wave_clear)
        # bind the game event to the functions
        self._view.bind("<Button-1>", self._left_click)
        self._view.bind("<Button-2>", self._right_click)
        self._view.bind("<Motion>", self._move)
        self._view.bind("<Leave>", self._mouse_leave)

        # Level
        self._level = MyLevel()

        self.select_tower(SimpleTower)

        view.draw_borders(game.grid.get_border_coordinates())

        # Get ready for the game
        self._setup_game()
Exemple #9
0
from controller import BasicController, UserController
from ai_controller import AIController
from game_model import GameModel
from view import GameView

if __name__ == '__main__':
    model = GameModel(board_size=30)
    view = GameView(model.board_size)
    # controller = UserController(model, view)
    controller = AIController(model, view, delay=0)
    controller.play()
    def __init__(self, master: tk.Tk, delay: int = 20):
        """Construct a tower defence game in a root window

        Parameters:
            master (tk.Tk): Window to place the game into
        """

        self._master = master
        super().__init__(master, delay=delay)

        self._game = game = TowerGame()

        self.setup_menu()

        # create a game view and draw grid borders
        self._view = view = GameView(master, size=game.grid.cells,
                                     cell_size=game.grid.cell_size,
                                     bg='antique white')
        view.pack(side=tk.LEFT, expand=True)

        # Task 1.3 (Status Bar): instantiate status bar
        # ...
        self._player = tk.Frame(master, bg='pink')
        self._player.pack(side=tk.LEFT, expand=True, fill=tk.BOTH)
        self._status = StatusBar(self._player)

        # Task 1.5 (Play Controls): instantiate widgets here
        # ...
        self._controlsArea = tk.Frame(self._player)
        self._controlsArea.pack(side=tk.BOTTOM)

        self._nextWave = tk.Button(self._controlsArea, text='Next wave', command=self.next_wave)
        self._nextWave.pack(side=tk.LEFT)

        self._pause = tk.Button(self._controlsArea, text='Play', command=self._toggle_paused)
        self._pause.pack(side=tk.LEFT)

        self._highscorefile = HighScoreManager()

        # bind game events
        game.on("enemy_death", self._handle_death)
        game.on("enemy_escape", self._handle_escape)
        game.on("cleared", self._handle_wave_clear)

        # Task 1.2 (Tower Placement): bind mouse events to canvas here
        # ...
        self._view.bind("<Motion>", self._move)
        self._view.bind("<Button-1>", self._left_click)
        self._view.bind("<Leave>", self._mouse_leave)
        self._view.bind("<Button-3>",self._right_click)

        # Level
        self._level = MyLevel()

        self.select_tower(SimpleTower)

        view.draw_borders(game.grid.get_border_coordinates())

        # Get ready for the game
        self._setup_game()

        # Remove the relevant lines while attempting the corresponding section
        # Hint: Comment them out to keep for reference

        # Task 1.2 (Tower Placement): remove these lines
        towers = [
            ([(2, 2), (3, 0), (4, 1), (4, 2), (4, 3)], MissileTower),
            ([(2, 5)], EnergyTower)
        ]

        for positions, tower in towers:
            for position in positions:
                game.place(position, tower_type=tower)

        # Task 1.5 (Tower Placement): remove these lines
        #game.queue_wave([], clear=True)
        #self.next_wave()

        # Task 1.5 (Play Controls): remove this line
        #self.start()
        #shop
        towers = [
        SimpleTower,
        MissileTower,
        EnergyTower
        ]

        # Create views for each tower & store to update if availability changes
        self._tower_views = []
        for tower_class in towers:
            tower = tower_class(self._game.grid.cell_size // 2)

            # bg=BACKGROUND_COLOUR, highlight="#4b3b4a",
            shopView = ShopTowerView(self._player, tower, click_command=lambda class_=tower_class: self.select_tower(class_))
            shopView.pack(side=tk.TOP)

            # Can use to check if tower is affordable when refreshing view
            self._tower_views.append((tower, shopView))

        self.refresh_view()
Exemple #11
0
    def __init__(self, master: tk.Tk, delay: int = 30):
        """Construct a tower defence game in a root window

        Parameters:
            master (tk.Tk): Window to place the game into
        """

        self._master = master
        master.title('Towers')
        super().__init__(master, delay=delay)

        self._game = game = TowerGame()

        self.setup_menu()

        # create a game view and draw grid borders
        self._view = view = GameView(master,
                                     size=game.grid.cells,
                                     cell_size=game.grid.cell_size,
                                     bg='antique white')
        view.pack(side=tk.LEFT, fill=tk.BOTH, expand=False)

        #        # Task 1.3 (Status Bar): instantiate status bar

        self._level = MyLevel()
        self._status_bar = StatusBar(master, self._level.get_max_wave())
        self._status_bar.pack(fill=tk.BOTH, side=tk.TOP, expand=False)

        self._play_and_upgrades = tk.Frame(master,
                                           bg='white',
                                           height=40,
                                           width=200)
        self._play_and_upgrades.pack(side=tk.BOTTOM, expand=True, fill=tk.BOTH)
        self._pause_button = tk.Button(self._play_and_upgrades,
                                       text='Pause',
                                       command=self._toggle_paused)
        self._pause_button.pack(side=tk.LEFT, anchor=tk.N, expand=False)
        self._pause_button.place(x=160, y=0)
        self._next_wave_button = tk.Button(self._play_and_upgrades,
                                           text='Next Wave',
                                           command=self.next_wave)
        self._next_wave_button.pack(side=tk.LEFT, anchor=tk.N, expand=False)
        self._next_wave_button.place(x=90, y=0)

        #highscores object
        self._high_scores = HighScoreManager()

        #Used for fixing bug where clicking New Game would make game faster
        try:
            if self._new_game_called:
                pass
        except AttributeError:  #raised when new_game hasn't been called
            self._new_game_count = 0
        #whether upgrades has been called before. Whether to clear upgrade buttons
        #or not.
        self._called_before = 0
        self._speed_upgrade = 0
        self._simple_upgrade = 0
        self._no_coins_ice = 0
        self._no_coins_speed = 0
        self._missile_upgrade = 0
        self._no_coins_simple = 0
        self._ice_upgrade = 0
        self._confirm_upgrades = 0

        #Shop Class instantiation
        self._towers = towers = [
            MissileTower, IceTower, PulseTower, EnergyTower
        ]

        self._shop = tk.Frame(master, bg='purple')
        self._shop.pack(fill=tk.BOTH, side=tk.BOTTOM, expand=False)
        #
        ##         Create views for each tower & store to update if availability changes
        #        self._tower_views = []
        #        col = 0
        #        for tower_class in towers:
        #            tower = tower_class(self._game.grid.cell_size)
        #            self._shop_view = ShopTowerView(self._shop, tower_class, #highlight="#4b3b4a",
        #                                 click_command=lambda class_=tower_class: self.select_tower(class_), bg=colours[col])
        #            self._shop_view.pack(fill=tk.BOTH, side=tk.TOP, expand=True)
        #            self._tower_views.append((tower, self._shop_view))
        #            Can use to check if tower is affordable when refreshing view
        #            col+=1

        self._tower_views = []
        col = 0
        for tower_class in towers:
            #            tower = tower_class(self._game.grid.cell_size // 2)
            tower = tower_class(30)
            view = ShopTowerView(
                self._shop,
                tower,
                bg='purple',  #, highlight="#4b3b4a",
                click_command=lambda class_=tower_class: self.select_tower(
                    class_))
            view.pack(fill=tk.X)
            self._tower_views.append((tower, view))
            col += 1

#         Task 1.5 (Play Controls): instantiate widgets here

# bind game events
        game.on("enemy_death", self._handle_death)
        game.on("enemy_escape", self._handle_escape)
        game.on("cleared", self._handle_wave_clear)

        # Task 1.2 (Tower Placement): bind mouse events to canvas here
        self._view.bind("<Button-1>", self._left_click)
        self._view.bind("<Motion>", self._move)
        self._view.bind("<Leave>", self._mouse_leave)
        self._view.bind("<Button-3>", self._right_click)
        # Level
        self._level = MyLevel()

        self.select_tower(MissileTower)

        self._view.draw_borders(game.grid.get_border_coordinates())

        # Get ready for the game
        self._setup_game()
Exemple #12
0
    def __init__(self, master: tk.Tk, delay: int = 20):
        """Construct a tower defence game in a root window

        Parameters:
            master (tk.Tk): Window to place the game into
        """

        self._master = master
        super().__init__(master, delay=delay)

        master.title('Towers')

        self._game = game = TowerGame()

        self.setup_menu()

        # create a game view and draw grid borders
        self._view = view = GameView(master,
                                     size=game.grid.cells,
                                     cell_size=game.grid.cell_size,
                                     bg='antique white')
        view.pack(side=tk.LEFT, expand=True)

        self._right_frame = tk.Frame(master, bg=BACKGROUND_COLOUR)
        self._right_frame.pack(side=tk.LEFT, fill=tk.Y)

        # Task 2.4 (High Scores): load files into a high score manager instance
        self._high_score_manager = HighScoreManager()
        self._high_score_manager.load(self._high_score_manager._filename)

        # Task 1.3 (Status Bar): instantiate status bar
        self._status = status = StatusBar(self._right_frame)
        status.pack(side=tk.TOP, fill=tk.X, anchor=tk.N, expand=False)

        # Task 2.3 (Shop): instantiation
        towers = [SimpleTower, MissileTower, EnergyTower, SlowTower]

        shop = tk.Frame(self._right_frame)
        shop.pack(side=tk.TOP, anchor=tk.N, fill=tk.X)

        # Create views for each tower & store to update if availability changes
        self._tower_views = []
        for tower_class in towers:
            tower = tower_class(self._game.grid.cell_size // 2)

            v = ShopTowerView(shop,
                              tower,
                              bg=BACKGROUND_COLOUR,
                              highlight="#4b3b4a",
                              click_command=lambda class_=tower_class: self.
                              select_tower(class_))
            v.pack(fill=tk.X)
            self._tower_views.append(
                (tower, v)
            )  # Can use to check if tower is affordable when refreshing view

        # Task 1.5 (Play Controls): instantiate widgets here
        self._control = control = tk.Frame(self._right_frame)
        self._next_wave = tk.Button(control,
                                    text="Next Wave",
                                    command=self.next_wave,
                                    font=("TkDefaultFont", 12, "normal"))
        self._next_wave.pack(side=tk.LEFT)
        self._play = tk.Button(control,
                               text="Play",
                               command=self._toggle_paused,
                               font=("TkDefaultFont", 12, "normal"))
        self._play.pack(side=tk.LEFT)
        self._control.pack(side=tk.BOTTOM, anchor=tk.S)

        # Task 3.3 (Upgrade Tower): GUI
        self._upgrade_button = tk.Button(self._right_frame,
                                         text="Upgrade selected tower",
                                         state="disabled",
                                         command=self.upgrade_selected_tower,
                                         font=("TkDefaultFont", 12, "normal"))
        self._upgrade_button.pack(side=tk.BOTTOM, anchor=tk.S)
        self._selected_tower_level_up_cost = tk.Label(
            self._right_frame,
            text="Cost to upgrade: N/A",
            bg=BACKGROUND_COLOUR,
            fg="white",
            font=("TkDefaultFont", 12, "normal"))
        self._selected_tower_level_up_cost.pack(side=tk.BOTTOM, anchor=tk.S)
        self._selected_tower_level = tk.Label(
            self._right_frame,
            text="Selected tower level: None",
            bg=BACKGROUND_COLOUR,
            fg="white",
            font=("TkDefaultFont", 12, "normal"))
        self._selected_tower_level.pack(side=tk.BOTTOM, anchor=tk.S)

        # bind game events
        game.on("enemy_death", self._handle_death)
        game.on("enemy_escape", self._handle_escape)
        game.on("cleared", self._handle_wave_clear)

        # Task 1.2 (Tower Placement): bind mouse events to canvas here
        self._view.bind("<Motion>", self._move)
        self._view.bind("<Button-1>", self._left_click)
        self._view.bind("<Leave>", self._mouse_leave)

        # Task 2.1: bind mouse event
        self._view.bind("<Button-2>", self._sell_tower)

        # Level
        self._level = MyLevel()

        self.select_tower(SimpleTower)

        view.draw_borders(game.grid.get_border_coordinates())

        # Get ready for the game
        self._setup_game()

        self._check_availability()
Exemple #13
0
    def __init__(self, master: tk.Tk, delay: int = 20):
        """Construct a tower defence game in a root window

        Parameters:
            master (tk.Tk): Window to place the game into
        """
        #Setting title of the Window
        master.title("Towers")

        self._master = master
        super().__init__(master, delay=delay)

        self._game = game = TowerGame()

        self.setup_menu()

        # create a game view and draw grid borders
        self._view = view = GameView(master,
                                     size=game.grid.cells,
                                     cell_size=game.grid.cell_size,
                                     bg='antique white')
        view.pack(side=tk.LEFT, expand=True)

        # Task 4.1 Postgraduate advanced feature. Initialise pygame and sounds
        pygame.init()
        mixer.init()
        self.build_sound = pygame.mixer.Sound("sound/build.wav")
        self.increase_coin = pygame.mixer.Sound("sound/coin.wav")
        self.decrease_life = pygame.mixer.Sound("sound/heart.wav")
        self.wave_m = pygame.mixer.Sound("sound/next_wave.wav")
        self.pause_play = pygame.mixer.Sound("sound/pause_play.wav")
        self.quit_m = pygame.mixer.Sound("sound/quit.wav")

        # Task 4.1 Postgraduate advanced feature. Play music
        pygame.mixer.music.load("sound/game_music.mp3")
        pygame.mixer.music.play(-1)

        # Task 1.3 (Status Bar): instantiate status bar

        # Put the status bar in a frame
        self._right_frame = tk.Frame(master, bg="white")
        self._right_frame.pack(fill=tk.BOTH, expand=True)

        self._status_bar = StatusBar(self._right_frame)
        self._status_bar.pack(side=tk.TOP)

        # Task 2.4 (High Score): instantiate highscore
        self._high_score = HighScoreManager()

        # Task 1.5 (Play Controls): instantiate widgets here
        # Create a frame for widgets
        self._bottom_frame = tk.Frame(master, bg=BACKGROUND_COLOUR)
        self._bottom_frame.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)

        #Create button for next wave
        self._next_wave_btn = tk.Button(self._bottom_frame,
                                        text="Next Wave",
                                        state=tk.NORMAL,
                                        command=self.next_wave)
        self._next_wave_btn.pack(side=tk.LEFT,
                                 ipadx=10,
                                 padx=10,
                                 ipady=10,
                                 pady=10)
        #Create button for play/pause
        self._play_btn = tk.Button(self._bottom_frame,
                                   text="Pause",
                                   state=tk.NORMAL,
                                   command=self._toggle_paused)
        self._play_btn.pack(side=tk.LEFT, ipadx=10, padx=10, ipady=10)

        # bind game events
        game.on("enemy_death", self._handle_death)
        game.on("enemy_escape", self._handle_escape)
        game.on("cleared", self._handle_wave_clear)

        # Task 1.2 (Tower Placement): bind mouse events to canvas here
        # On leaving canvas hide mouse
        # On left click place tower
        # On right click sell tower
        self._view.bind('<Motion>', self._move)
        self._view.bind('<Leave>', self._mouse_leave)
        self._view.bind('<Button-1>', self._left_click)
        self._view.bind('<Button-3>', self._right_click)

        # Level
        self._level = MyLevel()

        #Choose tower on initialisation
        self.select_tower(SimpleTower)

        #Draw borders
        view.draw_borders(game.grid.get_border_coordinates())

        # Get ready for the game
        self._setup_game()

        # Task 2.3 (Shop) Creating Shop

        #Store towers present in the game for Shop
        towers = [
            SimpleTower, EnergyTower, PulseTower, MissileTower, SlowTower
        ]

        #Create frmae for Shop window
        self._right_middle_frame = tk.Frame(master, bg=BACKGROUND_COLOUR)
        self._right_middle_frame.pack(fill=tk.BOTH, expand=True)

        #Put shop in the frame created
        shop = tk.Frame(self._right_middle_frame, bg=BACKGROUND_COLOUR)
        shop.pack(side=tk.BOTTOM, fill=tk.X)

        # Create views for each tower & store to update if availability changes
        self._tower_views = []
        for tower_class in towers:
            tower = tower_class(self._game.grid.cell_size // 2)
            view = ShopTowerView(shop,
                                 tower,
                                 bg=BACKGROUND_COLOUR,
                                 click_command=lambda class_=tower_class: self.
                                 select_tower(class_))
            view.pack(fill=tk.X)
            self._tower_views.append(
                (tower, view)
            )  # Can use to check if tower is affordable when refreshing view

        # Task 1.4 On pressing delete(X) button in window prompt user before exit

        def callback():
            """Prompt user on pressing delete(X)"""
            if messagebox.askokcancel("Quit", "Do you really wish to quit?"):
                self._high_score.save()
                pygame.mixer.Sound.play(self.quit_m)
                master.destroy()

        master.protocol("WM_DELETE_WINDOW", callback)
Exemple #14
0
    def __init__(self, master: tk.Tk, delay: int = 20):
        """Construct a tower defence game in a root window

        Parameters:
            master (tk.Tk): Window to place the game into
        """

        self._master = master
        super().__init__(master, delay=delay)

        self._game = game = TowerGame()

        self.setup_menu()

        # create a game view and draw grid borders
        self._view = view = GameView(master, size=game.grid.cells,
                                     cell_size=game.grid.cell_size,
                                     bg='antique white')
        view.pack(side=tk.LEFT, expand=True)

        # Task 1.3 (Status Bar): instantiate status bar
        # ...

        # Task 1.5 (Play Controls): instantiate widgets here
        # ...

        # bind game events
        game.on("enemy_death", self._handle_death)
        game.on("enemy_escape", self._handle_escape)
        game.on("cleared", self._handle_wave_clear)

        # Task 1.2 (Tower Placement): bind mouse events to canvas here
        # ...

        # Level
        self._level = MyLevel()

        self.select_tower(SimpleTower)

        view.draw_borders(game.grid.get_border_coordinates())

        # Get ready for the game
        self._setup_game()

        # Remove the relevant lines while attempting the corresponding section
        # Hint: Comment them out to keep for reference

        # Task 1.2 (Tower Placement): remove these lines
        towers = [
            ([(2, 2), (3, 0), (4, 1), (4, 2), (4, 3)], SimpleTower),
            ([(2, 5)], MissileTower)
        ]

        for positions, tower in towers:
            for position in positions:
                self._game.place(position, tower_type=tower)

        # Task 1.5 (Tower Placement): remove these lines
        self._game.queue_wave([], clear=True)
        self._wave = 4 - 1  # first (next) wave will be wave 4
        self.next_wave()

        # Task 1.5 (Play Controls): remove this line
        self.start()
Exemple #15
0
    def __init__(self, master: tk.Tk, delay: int = 20):
        """Construct a tower defence game in a root window

        Parameters:
            master (tk.Tk): Window to place the game into
        """

        self._master = master
        super().__init__(master, delay=delay)
        master.title("tkDefend")
        
        self._game = game = TowerGame()

        self._highscores = {}

        self.setup_menu()
        self._master.configure(menu=self._menu)

        #create a game view and draw grid borders
        self._view = view = GameView(master, size=game.grid.cells,
                                     cell_size=game.grid.cell_size,
                                     bg='#000033') #was antique white
        view.pack(side=tk.LEFT, expand=True)

        #have a menu frame on the right
        self._right_frame = tk.Frame(self._master)
        self._right_frame.pack(side=tk.RIGHT, expand=True, fill=tk.Y)

        #Task 1.3 (Status Bar): instantiate status bar
        self._status_bar = StatusBar(self._right_frame)

        #shop goes between status bar and control frame
        shop = tk.Frame(self._right_frame, bg="#ff6600")
        shop.pack(side=tk.TOP, expand = True, anchor=tk.N, fill=tk.BOTH)


        self._towers = towers = [
            SimpleTower,
            SlowTower,
            InfernoTower,
            LaserTower,
            MissileTower,
            GunTower,
        ]

        self._towers.sort(key=lambda tower_class:tower_class.base_cost)

        #Create views for each tower & store to update if availability changes
        self._tower_views = []
        for tower_class in towers:
            tower = tower_class(self._game.grid.cell_size // 2)

            #lambda class_=tower_class: self.select_tower(class_)

            view = ShopTowerView(shop, tower, 
                lambda class_=tower_class: 
                    self.select_tower(class_),
                bg="#ff6600", highlightbackground="#4b3b4a",bd=0,highlightthickness=0)


            view.pack(fill=tk.X)
            #Used to check if tower is affordable when refreshing view
            self._tower_views.append((tower, view)) 



        #Task 1.5 (Play Controls): instantiate widgets here
        self._control_frame = tk.Frame(self._right_frame)
        self._control_frame.pack(expand=True)
        self._wave_button = tk.Button(self._control_frame,
            text="next wave", command=self.next_wave)
        self._wave_button.pack(side=tk.LEFT)

        self._play_button_text = tk.StringVar()
        self._play_button_text.set("play")
        self._play_button = tk.Button(self._control_frame, textvariable=self._play_button_text,
            command=self._toggle_paused)
        self._play_button.pack(side=tk.RIGHT)

        #6.3 initiate upgrade dictionary to store upgrade controls for each tower
        self._upgrade_controls = {}


        #bind game events
        game.on("enemy_death", self._handle_death)
        game.on("enemy_escape", self._handle_escape)
        game.on("cleared", self._handle_wave_clear)

        #Task 1.2 (Tower Placement): bind mouse events to canvas here
        #Binds left click, mouse motion and mouse leave
        self._view.bind("<Button-1>", self._left_click)
        self._view.bind("<Motion>", self._move)
        #self._view.bind("<ButtonRelease-1>", self._mouse_leave)
        self._view.bind("<Leave>",self._mouse_leave)
        self._view.bind("<Button-2>", self._right_click)

        #high scores
        self._high_score_manager = HighScoreManager()



        #handling close window
        import sys
        if len(sys.argv) == 1:
            self._master.protocol("WM_DELETE_WINDOW", self._exit)
        #catching keyboard event Destroy
        #self._master.bind("<Destroy>", self._exit)

        #Level
        self._level = MyLevel()

        #self.select_tower(SimpleTower)
        self.select_tower(SimpleTower)

        self._view.draw_borders(game.grid.get_border_coordinates(), "#66ff66")

        #Get ready for the game
        self._setup_game()

        #laser count
        self._laser_count = 0
Exemple #16
0
    def __init__(self, master: tk.Tk, delay: int = 20):
        """Construct a tower defence game in a root window

        Parameters:
            master (tk.Tk): Window to place the game into
        """

        self._master = master
        master.title("Towers")
        super().__init__(master, delay=delay)

        self._game = game = TowerGame()

        self.setup_menu()

        # setup the HighScoreManager to process records.
        self._score_manager = high_score_manager.HighScoreManager()

        # create a game view and draw grid borders
        self._view = GameView(master,
                              size=game.grid.cells,
                              cell_size=game.grid.cell_size,
                              bg='antique white')
        self._view.pack(side=tk.LEFT, expand=True)

        # Task 1.3 (Status Bar): instantiate status bar
        self._status_bar = StatusBar(master, bg='white', width=80, height=16)
        self._status_bar.pack(side=tk.TOP, fill=tk.X)

        # Task 1.5 (Play Controls): instantiate widgets here
        self._control_frame = tk.Frame(master, bg="#4B2E49")
        self._control_frame.pack(side=tk.BOTTOM, fill=tk.X)

        self._frame1 = tk.Frame(self._control_frame)
        self._frame1.pack(anchor=tk.CENTER)

        self._button1 = tk.Button(self._frame1,
                                  text='Next Wave',
                                  state=tk.NORMAL,
                                  command=self.next_wave)
        self._button1.pack(side=tk.LEFT, padx=1, pady=1)
        self._button2 = tk.Button(self._frame1,
                                  text='Play',
                                  state=tk.NORMAL,
                                  command=self._toggle_paused)
        self._button2.pack(side=tk.LEFT, padx=1, pady=1)

        # A frame for checkbox and it will be created by _show_checkbox method.
        self._frame2 = tk.Frame(self._control_frame)

        # bind game events
        game.on("enemy_death", self._handle_death)
        game.on("enemy_escape", self._handle_escape)
        game.on("cleared", self._handle_wave_clear)

        # Task 1.2 (Tower Placement): bind mouse events to canvas here
        self._view.bind("<Button-1>", self._left_click)
        self._view.bind("<Motion>", self._move)
        self._view.bind("<Leave>", self._mouse_leave)
        self._view.bind("<Button-3>", self._right_click)

        # instantiate shop bar
        self._shop = tk.Frame(master, bg='#4B2E49')
        self._shop.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
        towers = [
            SimpleTower, MissileTower, custom.CustomTower, custom.AdvancedTower
        ]
        self._tower_views = []

        # Create views for each tower & store to update if availability changes
        for tower_class in towers:
            tower = tower_class(self._game.grid.cell_size // 2)
            tower_view = ShopTowerView(self._shop,
                                       tower,
                                       click_command=lambda class_=tower_class:
                                       self.select_tower(class_),
                                       bg="#4B2E49")

            tower_view.pack(fill=tk.X)
            self._tower_views.append((tower, tower_view))

        # Level
        self._level = MyLevel()

        self.select_tower(SimpleTower)

        self._view.draw_borders(game.grid.get_border_coordinates())

        # Get ready for the game
        self._setup_game()
Exemple #17
0
    def __init__(self, master: tk.Tk, delay: int = 20):
        """Construct a tower defence game in a root window

        Parameters:
            master (tk.Tk): Window to place the game into
        """
        self._master = master
        super().__init__(master, delay=delay)

        self._highscore = highscore = HighScoreManager()
        highscore.load(filename='high_scores.json')
        
        self._game = game = TowerGame()
        master.title("Tower of Defence by Minjae Lee")
        self.setup_menu(master)

        # create a game view and draw grid borders
        self._view = view = GameView(master, size=game.grid.cells,
                                     cell_size=game.grid.cell_size,
                                     bg='antique white')
        view.pack(side=tk.LEFT, expand=True)

        # Task 1.3 (Status Bar): instantiate status bar

        self._status_bar = StatusBar(master)
        self._status_bar.pack(fill = tk.X)

        # Task 1.5 (Play Controls): instantiate widgets here
        
        self.play_control = tk.Frame(master, bg = 'white')
        self.play_control.pack(side = tk.BOTTOM, fill = tk.Y)

        self.click_next_wave = tk.Button(self.play_control, text = "Next Wave", command = self.next_wave)
        self.click_next_wave.pack(side = tk.LEFT)
        
        self.click_play = tk.Button(self.play_control, text = "Play", command =self._toggle_paused)
        self.click_play.pack(side = tk.LEFT)
        
        # bind game events
        game.on("enemy_death", self._handle_death)
        game.on("enemy_escape", self._handle_escape)
        game.on("cleared", self._handle_wave_clear)

        # Task 1.2 (Tower Placement): bind mouse events to canvas here
        self._view.bind('<Button-1>', self._left_click)
        self._view.bind('<Motion>', self._move)
        self._view.bind('<Leave>', self._mouse_leave)

        self._view.bind('<Button-3>', self._right_click)

        # Level
        self._level = MyLevel()

        self.select_tower(SimpleTower)
        view.draw_borders(game.grid.get_border_coordinates())

        # Get ready for the game
        self._setup_game()

        towers = [ ]
        for positions, tower in towers:
            for position in positions:
                self._game.place(position, tower_type=tower)

##        # Task 2.3 (ShopTowerView): instantiate gui here
        self.towers = [
            SimpleTower,
            MissileTower,
            EnergyTower,
            PulseTower,
            TurretTower,
            CoinTower
        ]

        shop = tk.Frame(master)
        shop.pack(fill=tk.X)
        
        # Create views for each tower & store to update if availability changes
        self._tower_views = []
        for tower_class in self.towers:
            tower = tower_class(self._game.grid.cell_size // 2)

            self._shop_view = view= ShopTowerView(shop, tower, bg=BACKGROUND_COLOUR, highlight="#4b3b4a",
                                 click_command=lambda class_=tower_class: self.select_tower(class_))
            view.pack(fill=tk.X)
            self._tower_views.append((tower, view))  # Can use to check if tower is affordable when refreshing view
Exemple #18
0
    def __init__(self, master: tk.Tk, delay: int = 20):
        """
        Construct a tower defence game in a root window

        Parameters:
            master (tk.Tk): Window to place the game into
        """

        #Initiating the basics of the GUI
        self._master = master
        master.title("Towers")
        master.maxsize(700, 400)
        master.minsize(700, 400)
        super().__init__(master, delay=delay)
        self._game = game = TowerGame()
        self.setup_menu()

        #Create a game view and draw grid borders to pack into a game frame
        self._game_frame = tk.Frame(master, bg="black")
        self._game_frame.pack(side=tk.LEFT,
                              anchor=tk.NW,
                              expand=True,
                              fill=tk.BOTH)

        self._view = view = GameView(self._game_frame,
                                     size=game.grid.cells,
                                     cell_size=game.grid.cell_size,
                                     bg="light yellow")
        view.pack(side=tk.LEFT, expand=True)

        #Bind game events
        game.on("enemy_death", self._handle_death)
        game.on("enemy_escape", self._handle_escape)
        game.on("cleared", self._handle_wave_clear)

        #1.2 Bind mouse events to canvas
        view.bind("<Motion>", self._move)
        view.bind("<Leave>", self._mouse_leave)
        view.bind("<Button-1>", self._left_click)
        view.bind("<Button-3>", self._right_click)

        #Create Right Frame for all the stuff next to GameView
        self._right_frame = tk.Frame(master, bg="light blue")
        self._right_frame.pack(side=tk.RIGHT,
                               anchor=tk.NE,
                               expand=True,
                               fill=tk.BOTH)

        #1.3 Status Bar
        self._up_frame = tk.Frame(self._right_frame, bg="pink")
        self._up_frame.pack(side=tk.TOP, expand=False, fill=tk.BOTH)

        self._down_frame = tk.Frame(self._right_frame, bg="pink")
        self._down_frame.pack(side=tk.TOP, expand=False, fill=tk.BOTH)

        self._lives_img = tk.PhotoImage(file="images/heart.gif")
        self._lives_image = tk.Button(self._down_frame,
                                      image=self._lives_img,
                                      bg="pink",
                                      command=self.buy_lives)
        self._lives_image.bind(
            "<Motion>", lambda event, : self.toggle_callback(
                event, self._lives_image, "violet"))
        self._lives_image.bind(
            "<Leave>", lambda event, : self.toggle_callback(
                event, self._lives_image, "pink"))

        self._status = StatusBar(self._up_frame, self._down_frame,
                                 self._lives_image, "images/coins.gif")
        self._status.pack(side=tk.TOP, anchor=tk.N, expand=True, fill=tk.BOTH)

        #1.5 Play Controls
        self._controls_frame = tk.Frame(self._right_frame, bg="light green")
        self._controls_frame.pack(side=tk.BOTTOM, fill=tk.BOTH, anchor=tk.S)

        self._button_frame = tk.Frame(self._controls_frame, bg="black")
        self._button_frame.pack(side=tk.BOTTOM, anchor=tk.S, expand=True)

        self._next_wave_button = tk.Button(self._button_frame,
                                           bg="white",
                                           text="Next Wave",
                                           command=self.next_wave)
        self._next_wave_button.pack(side=tk.LEFT, expand=True)
        self._next_wave_button.bind(
            "<Motion>", lambda event, : self.toggle_callback(
                event, self._next_wave_button, "grey"))
        self._next_wave_button.bind(
            "<Leave>", lambda event, : self.toggle_callback(
                event, self._next_wave_button, "white"))

        self._play_button = tk.Button(self._button_frame,
                                      bg="white",
                                      text="Play",
                                      command=self._toggle_paused)
        self._play_button.pack(side=tk.RIGHT, expand=True)
        self._play_button.bind(
            "<Enter>", lambda event, : self.toggle_callback(
                event, self._play_button, "grey"))
        self._play_button.bind(
            "<Leave>", lambda event, : self.toggle_callback(
                event, self._play_button, "white"))

        #Shop Frame (2.3)
        towers = [SimpleTower, MissileTower, EnergyTower, FireTower]

        self._shop_frame = tk.Frame(self._right_frame, bg="light blue")
        self._shop_frame.pack(fill=tk.BOTH)

        #Create views for each tower & store to update if availability changes
        self._tower_views = []

        for tower_class in towers:
            tower = tower_class(self._game.grid.cell_size // 2)

            self._shop_view = ShopTowerView(
                self._shop_frame,
                tower,
                click_command=lambda event, class_=tower_class: self.
                select_tower(class_))
            self._shop_view.pack(expand=True, fill=tk.BOTH)

            #Can use to check if tower is affordable when refreshing view
            self._tower_views.append((tower, self._shop_view))

        #Getting ready for the game
        self.game_over_restart()