예제 #1
0
def run_game():
    # 初始化游戏并创建一个屏幕对象
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
    # 设置窗口标题
    pygame.display.set_caption("Enemy Invasion")

    # 创建Play按钮
    play_button = Button(ai_settings, screen, "Play")

    # 创建一个用于存储游戏统计信息的实例,并创建记分牌
    stats = GameStats(ai_settings)
    scoreboard = Scoreboard(ai_settings, screen, stats)

    # 创建一艘新的战斗机、一个子弹编组和一个敌机编组
    fighter = Fighter(ai_settings, screen)
    bullets = Group()
    enemies = Group()

    # 创建敌机舰队
    gf.create_fleet(ai_settings, screen, fighter, enemies)

    # 开始游戏的主循环
    while True:
        # 监听键盘和鼠标事件
        gf.check_events(ai_settings, screen, stats, scoreboard, play_button, fighter, enemies, bullets)

        if stats.game_active:
            fighter.update()
            gf.update_bullets(ai_settings, screen, stats, scoreboard, fighter, enemies, bullets)
            gf.update_enemies(ai_settings, screen, stats, scoreboard, fighter, enemies, bullets)

        gf.update_screen(ai_settings, screen, stats, scoreboard, fighter, enemies, bullets, play_button)
예제 #2
0
def run_game():
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption('Zombie Appocalypse')

    play_button = Button(ai_settings, screen, "Play Game")

    fighter = Fighter(ai_settings, screen)
    bullets = Group()
    zombies = Group()

    gf.create_fighter(ai_settings, screen, fighter, zombies)

    stats = GameStats(ai_settings)
    sb = Scoreboard(ai_settings, screen, stats)

    while True:
        gf.check_events(ai_settings, screen, stats, sb, play_button, fighter, zombies, bullets)
        if stats.game_active:
            fighter.update()
            bullets.update()
            gf.update_bullets(ai_settings, screen, stats, sb, fighter, zombies, bullets)
            gf.update_zombies(ai_settings, stats, screen, fighter, zombies, bullets)

        gf.update_screen(ai_settings, screen, stats, sb, fighter, zombies, bullets, play_button)
예제 #3
0
class TetrisDumpUniverse:
    """Main Class to manage game assests and behavior"""
    def __init__(self):
        """Inits game and create game resources"""
        # * inits background setting for pygame
        pygame.init()

        # * creates Surface display window, for drawing game
        # instance of Settings
        self.settings = Settings()

        # *  ASSIGNS MAIN DISPLAY SURFACE
        self.screen = pygame.display.set_mode(
            (self.settings.screen_width, self.settings.screen_height))

        # *  CREATE FULLSCREEN
        # self.screen = pygame.display.set_mode(
        #     (0, 0), pygame.FULLSCREEN)
        # self.settings.screen_width = self.screen.get_rect().width
        # self.settings.screen_height = self.screen.get_rect().height

        pygame.display.set_caption("Tetris Dump Universe")

        # * FIGHTER INSTANCE
        # Fighter requires one instance of TDU game so we pass self for the current intance of the TDU game class
        self.fighter = Fighter(self)

        # * BULLETS INSTANCES
        self.bullets = pygame.sprite.Group()

        # * ALIEN GROUP INSTANCE
        self.aliens = pygame.sprite.Group()
        self._create_fleet()

# *********************** FUNCTIONS *********************************************

    def run_game(self):
        """Start MAIN LOOP for the game"""
        # while loop: manage Event loop and Screen updates
        while True:
            # Event Loop: Watch for keyboard and mouse events
            self._check_events()
            self.fighter.update()
            self.bullets.update()
            self._update_bullets()
            self._update_aliens()
            self._update_screen()

    def _check_events(self):
        """DETECTS REVELANT USER INPUT EVENTS"""
        for event in pygame.event.get():  # returns list of events
            if event.type == pygame.QUIT:
                sys.exit()
            # * On KEYDOWN = True
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)

            # * On KEYUP = False
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)

    def _check_keydown_events(self, event):
        if event.key == pygame.K_RIGHT:
            # Move the fighter to the right
            self.fighter.moving_right = True
        elif event.key == pygame.K_LEFT:
            # Move the fighter left
            self.fighter.moving_left = True
        elif event.key == pygame.K_q:
            sys.exit()
            # shoots bullet
        elif event.key == pygame.K_SPACE:
            self._fire_bullet()

    def _check_keyup_events(self, event):
        if event.key == pygame.K_RIGHT:
            self.fighter.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.fighter.moving_left = False

    def _fire_bullet(self):
        """Create a new bullet and add it to the bullets group"""
        # first we check the elngth of bullets that are active
        if len(self.bullets) < self.settings.bullets_allowed:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)

    def _update_bullets(self):
        """Update position of bullets and get rid of old bullets"""
        # Update bullet position
        for bullet in self.bullets.copy():
            if bullet.rect.bottom <= 0:
                self.bullets.remove(bullet)

    def _update_aliens(self):
        """Checl if the fleet is at an edge Update the position of all aliens in the fleet"""
        self._check_fleet_edges()
        self.aliens.update()

    def _create_fleet(self):
        """Create the fleet of alien"""
        # Create an alien and find the number of aliens in a row
        # Spacing between each alien is equal to the one alien width
        alien = Alien(self)  # Make an alien for calculations
        alien_width, alien_height = alien.rect.size
        # alien_width = alien.rect.width  # get alien width

        # Calc horizontal space available for aliens and the number of aliensthat can fit
        available_space_x = self.settings.screen_width - (2 * alien_width)
        number_alien_x = available_space_x // (2 * alien_width)

        # Determinate the number of rows of alien that fit on the screen
        fighter_height = self.fighter.rect.height
        available_space_y = (self.settings.screen_height -
                             (10 * alien_height) - fighter_height)
        number_rows = available_space_y // (2 * alien_height)

        # Create fleet of aliens
        for row_number in range(number_rows):
            for alien_number in range(number_alien_x):
                self._create_alien(alien_number, row_number)

    def _create_alien(self, alien_number, row_number):
        """Create an alien and place it in the row"""
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        # each alien is push to the right 1 alien width of space from the left margin
        # Calc:The alien width * 2  to account for the empty spaceincluding the empty space to the right the * by the alien's position.
        alien_width = alien.rect.width
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
        # adds alien to group
        self.aliens.add(alien)

    def _check_fleet_edges(self):
        """Respond appropriately if any aliens have reached an edge"""
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_fleet_direction()
                break

    def _change_fleet_direction(self):
        """Drop the entire fleet and change the fleet's direction"""
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *= -1

    def _update_screen(self):
        """Redraw the screen during each pass through the loop"""
        self.screen.fill(self.settings.bg_color)
        self.fighter.blitme()
        # bullets.sprite returns a list of all sprites in bullets
        for bullet in self.bullets.sprites():
            # calls draw_bullet() on bullet
            bullet.draw_bullet()

        # adds or draw aliens to screen
        self.aliens.draw(self.screen)
        # Make the most recently drawn screen visible (updates loc of game elements)
        pygame.display.flip()
예제 #4
0
class Game:
    def __init__(self, screen, clock):

        self.screen = screen
        self.clock = clock
        self.width, self.height = self.screen.get_size()

        self.world = World(self.width, self.height)
        self.knight = Fighter('Knight', 30, 10, 3, 0)
        self.bandits = self.create_bandits(2)

    def run(self):

        self.playing = True

        while self.playing:

            self.clock.tick(FPS)
            self.events()
            self.draw()
            self.update()

    def events(self):

        for event in pg.event.get():

            if event.type == pg.QUIT:
                pg.quit()
                sys.exit()

            if event.type == pg.KEYDOWN:

                if event.key == pg.K_ESCAPE:
                    pg.quit()
                    sys.exit()

    def update(self):

        self.knight.update()

        for bandit in self.bandits:
            bandit.update()

    def draw(self):

        self.world.draw(self.screen)
        self.knight.draw(self.screen)

        for bandit in self.bandits:
            bandit.draw(self.screen)

        pg.display.flip()

    def create_bandits(self, amount):

        arr = []

        for i in range(amount):
            arr.append(Fighter("Bandit", 20, 6, 1, i))

        return arr
예제 #5
0
class Game:
    def __init__(self):
        pygame.mixer.pre_init(frequency=22050, size=-16, channels=8, buffer=256)
        pygame.init()
        pygame.display.set_caption("Injection")
        pygame.mixer.init()
        self.clock = pygame.time.Clock()
        self.surface = pygame.display.set_mode((1024, 768), pygame.DOUBLEBUF)
        self.viewport = Viewport(self)
        self.world = World(self, "gfx/world01.json")
        self.fighter1 = Fighter(self, 'g', startpos=(100, 0))
        self.fighter2 = Fighter(self, 'r', startpos=(850, 0))
        self.fighter2.rect.left = 800
        self.pointsbar1 = PointsBar(self.fighter1, pygame.Rect(22, 17, 323, 27), color=1)
        self.pointsbar2 = PointsBar(self.fighter2, pygame.Rect(683, 17, 323, 27), color=2)
        self.injectionsbar1 = InjectionsBar(self.fighter1, pygame.Rect(33, 50, 300, 27))
        self.injectionsbar2 = InjectionsBar(self.fighter2, pygame.Rect(695, 50, 300, 27))
        self.roundcounter = RoundCounter(self, pygame.Rect(427, 0, 167, 50))
        self.ai = FightingAi(self, self.fighter2)
        self.menu = Menu(self)
        self.ignore_keys = False
        self.multiplayer = 0

        self.fireballs = []
        pygame.mixer.music.load("snd/music.wav")
        pygame.mixer.music.set_volume(.35)
        #pygame.mixer.music.set_volume(0)
        pygame.mixer.music.play()
        self.f = self.fighter1
    def ev_quit(self, e):
        pass

    def ev_keydown(self, e):
        if self.ignore_keys:
            return

        # Fighter 2
        if self.multiplayer:
            if e.key == pygame.K_RIGHT:
                self.fighter2.right()
            elif e.key == pygame.K_LEFT:
                self.fighter2.left()
            elif e.key == pygame.K_DOWN:
                self.fighter2.block()
            elif e.key == pygame.K_SLASH:
                self.fighter2.jump()
            elif e.key == pygame.K_PERIOD:
                self.fighter2.punch()
            elif e.key == pygame.K_COMMA:
                self.fighter2.kick()
            elif e.key == pygame.K_UP:
                if self.fighter2.current_injection < len(self.fighter2.injections) - 1:
                    self.fighter2.switch_to_injection(self.fighter2.current_injection + 1)

        # Fighter 1
        if e.key == pygame.K_d:
            self.fighter1.right()
        elif e.key == pygame.K_a:
            self.fighter1.left()
        elif e.key == pygame.K_s:
            self.fighter1.block()
        elif e.key == pygame.K_j:
            self.fighter1.jump()
        elif e.key == pygame.K_h:
            self.fighter1.punch()
        elif e.key == pygame.K_g:
            self.fighter1.kick()
        elif e.key == pygame.K_w:
            if self.fighter1.current_injection < len(self.fighter1.injections) - 1:
                self.fighter1.switch_to_injection(self.fighter1.current_injection + 1)

        elif e.key == pygame.K_ESCAPE:
            self.menu.current_menu = 0
            self.menu.active = 1
            self.roundcounter.round = -1
            self.fighter1.wins = 0
            self.fighter2.wins = 0
 
    def ev_keyup(self, e):
        if self.ignore_keys:
            return

        # Fighter 2
        if self.multiplayer:
            if e.key == pygame.K_LEFT:
                self.fighter2.stop_left()
            elif e.key == pygame.K_RIGHT:
                self.fighter2.stop_right()

        # Fighter 1
        if e.key == pygame.K_a:
            self.fighter1.stop_left()
        elif e.key == pygame.K_d:
            self.fighter1.stop_right()


    def opponent(self, caller):
        opp = self.fighter2
        if opp == caller:
            opp = self.fighter1
        return opp

    def hit_opponent(self, caller, damage, hit_boxes=None, kind='physical'):
        opp = self.opponent(caller)
        opp_hb = opp.hit_boxes()
        direction = 1
        if caller.looking_right:
            direction = -1
        if hit_boxes == None:
            hit_boxes = caller.hit_boxes()
        if any([x.collidelist(opp_hb) != -1 for x in hit_boxes]):
            opp.take_damage(damage, direction, kind=kind)
            return True
        return False

    def game_over(self):
        if self.fighter1.wins > self.fighter2.wins:
            gameover_image = pygame.image.load("gfx/player1won.png")
        else:
            gameover_image = pygame.image.load("gfx/player2won.png")

        self.surface.blit(gameover_image, (330, 140))
        self.roundcounter.render(self.surface)
        pygame.display.flip()
        while True:
            for e in pygame.event.get():
                if e.type == pygame.KEYDOWN:
                    if e.key == pygame.K_RETURN:
                        self.roundcounter.round = -1
                        self.fighter1.wins = 0
                        self.fighter2.wins = 0
                        self.fighter1.reset()
                        self.fighter2.reset()
                        self.menu.activate()
                        return

    def next_round(self):
        if self.roundcounter.round < len(self.roundcounter.rounds) - 1:
            if self.fighter1.wins == 2 or self.fighter2.wins == 2:
                self.game_over()
                return
            self.fighter1.reset()
            self.fighter2.reset()
            self.ai.reset()
            for inj in self.injectionsbar1.injections[1:]:
                inj.disabled = False
                inj.activate = False
            for inj in self.injectionsbar2.injections[1:]:
                inj.disabled = False
                inj.activate = False
            self.pointsbar1.health = self.fighter1.health
            self.pointsbar2.health = self.fighter2.health
            self.viewport.offset = 0
            self.roundcounter.next_round()
        else:
            self.game_over()

    def check_state(self):
        if self.fighter1.health <= 0:
            self.fighter2.wins += 1
            self.next_round()
        if self.fighter2.health <= 0:
            self.fighter1.wins += 1
            self.next_round()
        

    def main_loop(self):
        while True:
            if self.menu.active:
                self.fighter1.reset()
                self.fighter2.reset()
                self.menu.loop()

            self.clock.tick(30)
            for e in pygame.event.get():
                if e.type == pygame.QUIT:
                    self.ev_quit(e)
                elif e.type == pygame.KEYDOWN:
                    self.ev_keydown(e)
                elif e.type == pygame.KEYUP:
                    self.ev_keyup(e)

            self.fighter1.update()
            self.fighter2.update()
            self.surface.fill((0, 0, 0))
            self.world.render(self.surface)
            self.fighter1.render(self.surface)
            self.fighter2.render(self.surface)
            self.pointsbar1.render(self.surface)
            self.pointsbar2.render(self.surface)
            self.injectionsbar1.render(self.surface)
            self.injectionsbar2.render(self.surface)
            self.roundcounter.render(self.surface)
            if not self.ignore_keys and not self.multiplayer:
                self.ai.update()

            for f in self.fireballs:
                f.update()
                f.render(self.surface)

            pygame.display.flip()