class Application:

    sorter = None

    def __init__(self, window):
        pygame.init()
        self.window = window
        self.event_handler = EventHandler()
        self.renderer = Renderer(window)
        self.data = Data(10, 300, 64)
        self.buttons = [
            RandomizeButton(BLACK, 25, 25, 125, 25, 'Randomize Data', WHITE,
                            self.data),
            SorterButton(BLACK, 175, 25, 125, 25, 'Bubble Sort', WHITE,
                         BubbleSorter(self.renderer), self.data),
            SorterButton(BLACK, 325, 25, 125, 25, 'Selection Sort', WHITE,
                         SelectionSorter(self.renderer), self.data),
            SorterButton(BLACK, 475, 25, 125, 25, 'Insertion Sort', WHITE,
                         InsertionSorter(self.renderer), self.data),
            SorterButton(BLACK, 625, 25, 125, 25, 'Merge Sort', WHITE,
                         MergeSorter(self.renderer), self.data),
            SorterButton(BLACK, 775, 25, 125, 25, 'Quick Sort', WHITE,
                         QuickSorter(self.renderer), self.data)
        ]
        self.event_handler.register_buttons(self.buttons)
        self.renderer.register_buttons(self.buttons)
        self.renderer.register_data(self.data)

    def run(self):
        while 1:
            # check if any new events have occured
            self.event_handler.handle_events()

            # render window
            self.renderer.refresh()
            self.renderer.render_buttons()
            self.renderer.render_data()

            # update display
            pygame.display.update()
Example #2
0
class Driver:
    """
    Game driver. Sets matches, takes input, controls game flow and checks for a winner.
    """
    def __init__(self, map_screen, background_screen, text_screen):
        """
        Constructor.
        :param map_screen: Surface 
        :param background_screen: Surface
        :param text_screen: Surface
        """
        self.amount_of_enemies = 0
        self.amount_of_empty_colonies = 0
        self.map_to_load = None
        self.race_manager = RaceManager()
        self.human_players = []
        self.players = []
        self.map = Map(GUISettings.SCREEN_WIDTH, GUISettings.SCREEN_HEIGHT)
        self.event_handler = EventHandler(self)
        self.screen = map_screen
        self.background_screen = background_screen
        self.player_one = Player()
        self.human_players.append(self.player_one)
        self.sound_driver = SoundDriver()
        self.map_loader = MapLoader(self)
        self.text_screen = text_screen
        self.running = True
        self.map_manager = MapManager()
        self.state = MainMenu(self)
        self.menu = MenuSettings.MAIN_MENU(self)

    def get_races(self):
        """
        :return: Dictionary with available races 
        """
        return self.race_manager.get_races()

    def get_races_array(self):
        """
        :return: Array with available races 
        """
        return self.race_manager.get_races_array()

    def get_maps(self):
        """
        :return: Dictionary with available maps 
        """
        return self.map_manager.get_maps()

    def get_maps_array(self):
        """
        :return: Array with available maps 
        """
        return self.map_manager.get_maps_array()

    def is_running(self):
        """
        :return: True if the game is running and False otherwise
        :rtype: bool
        """
        return self.running

    def quit(self):
        """
        Set running state to False. 
        """
        self.running = False

    def load_map(self):
        """
        Load map from selected data.
        """
        # Clear players
        self.players = []
        # Load map
        self.map_loader.load_in_map(self.map_to_load, self.map,
                                    self.human_players)
        # Set new players
        self.players = self.map_loader.players

    def add_random_player(self):
        """
        Add an enemy with a random race.
        """
        self.players.append(RandomPlayer())

    def set_player_name(self, name):
        """
        Set a name for the player.
        :param name: Name to set
        """
        # TODO: Set and use player name
        self.player_one.set_name(name)

    def set_player_race(self, race):
        """
        Set race for the human player.
        :param race: Race to set
        """
        self.player_one.set_race(race)

    def get_player_name(self):
        """
        :return: Player's name 
        """
        return self.player_one.name

    def get_player_race(self):
        """
        :return: Player's race 
        """
        return self.player_one.race

    def add_player(self, player):
        """
        :param player: Add a new player to the game 
        """
        self.players.append(player)

    def check_winning_condition(self):
        """
        Check if there's a winner. A race is the winning race when there are no other races on the map.
        :return The winner
        :rtype AbstractRace
        """
        win = NullRace()
        for gr_col in self.map.graphic_colonies:
            race = gr_col.colony.race
            if win.same_type(NullRace()):
                win = race
            if not race.same_type(NullRace()) and not race.same_type(win):
                return NullRace()
        for gr_pty in self.map.graphic_parties:
            if not gr_pty.party.race.same_type(win):
                return NullRace()
        self.won(win)
        return win

    def won(self, race):
        """
        React after a winner has been found.
        :param race: Winning race
        :type race: AbstractRace
        """
        self.state.won(race)

    def set_state(self, state):
        """
        Change current game state.
        :param state: The new state
        :type state: GameState
        """
        self.state = state

    def tick(self):
        """
        Actions to perform every tick.
        """
        # Handle input
        self.handle_events()
        # Update background
        self.map.tick_background()
        # Draw background
        self.map.draw_background(self.background_screen)
        # Run main
        self.run()
        # Check for a winner
        self.check_winning_condition()

    def handle_events(self):
        """
        Ask the event handler to handle input. 
        """
        self.event_handler.handle_events()

    def run(self):
        """
        Run main, specified by current state.
        """
        self.state.run()

    def get_colonies_in(self, position):
        """
        Get colonies that contain given point.
        :param position: Point to scan
        :type position: Point
        :return: Array of colonies
        :rtype List
        """
        return self.map.get_colonies_in(position)

    def select(self, position):
        """
        Select given position and act according to current state.
        :param position: Position selected
        :type position: tuple
        """
        position = Point(position[0], position[1])
        self.state.select(position)

    def release_mouse(self, position):
        """
        Release mouse at given position and act according to current state.
        :param position: Position where release occurs
        :type position: tuple
        """
        position = Point(position[0], position[1])
        self.state.release_mouse(position)

    def hover(self, position):
        """
        Hover at given position and act according to current state.
        :param position: Position to hover
        :type position: tuple
        """
        position = Point(position[0], position[1])
        self.state.hover(position)

    def update_mouse_position(self, position):
        """
        Acknowledge current mouse position.
        :param position: Mouse position
        :type position: tuple
        """
        position = Point(position[0], position[1])
        self.state.update_mouse_position(position)

    def pause_key(self):
        """
        Pause key has been pressed.
        """
        self.state.pause()

    def main_menu_key(self):
        """
        Main menu key has been pressed.
        """
        self.state.main_menu_key()

    def selection_left(self):
        """
        Selection left key has been pressed.
        """
        self.state.selection_left()

    def selection_right(self):
        """
        Selection right key has been pressed.
        """
        self.state.selection_right()

    def selection_up(self):
        """
        Selection up key has been pressed.
        """
        self.state.selection_up()

    def selection_down(self):
        """
        Selection down key has been pressed.
        """
        self.state.selection_down()

    def select_key(self):
        """
        Selection key has been pressed.
        """
        self.state.select_key()

    def load_random_map(self):
        """
        Load a random map.
        """
        # Make screen transparent in one tick
        self.move_alpha_to(self.screen, 0, 255)
        # Remove all players
        self.players = []
        # Load map
        # # self.map_loader.load_in_map(FOUR_BASES, self.map, self.human_players)
        self.map_loader.load_random(self.map, self.amount_of_empty_colonies,
                                    40, 60, self.human_players,
                                    self.amount_of_enemies,
                                    self.race_manager.get_races_array())
        # Retrieve players for this match
        self.players = self.map_loader.players

    @staticmethod
    def move_alpha_to(surface,
                      target,
                      speed=GUISettings.DEFAULT_ALPHA_CHANGE_SPEED):
        """
        Move alpha of a given surface towards a target value. 
        :param surface: Surface which alpha to change
        :type surface: Surface
        :param target: Target alpha value
        :type  target: int
        :param speed: Maximum change
        :type speed: int
        """
        current_alpha = surface.get_alpha()
        if not current_alpha == target:
            move_dir = (target - current_alpha) / abs(target - current_alpha)
            move_amount = min(speed, abs(target - current_alpha))
            surface.set_alpha(current_alpha + move_dir * move_amount)

    def start_game(self):
        """
        Start game. Load a map and change state.
        """
        self.load_random_map()
        self.set_state(InGame(self))

    def start_custom_map_game(self):
        """
        Start game. Load a map and change state.
        """
        self.load_map()
        self.set_state(InGame(self))

    def set_menu(self, menu):
        """
        Set current menu.
        :param menu: Next menu
        :type menu: Menu
        """
        self.menu = menu

    def play_select(self):
        """
        Play select sound.
        """
        self.sound_driver.play_select()

    def play_move_selection(self):
        """
        Play move selection sound.
        """
        self.sound_driver.play_move_selection()

    def play_taken(self):
        """
        Play taken sound.
        """
        self.sound_driver.play_taken()