Пример #1
0
def run_game():
    #Initialization of game and creation of object = screen
    pygame.init()

    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    screen_rect = screen.get_rect()
    pygame.display.set_caption("DraGame")

    #Creating button Game
    play_button = Button(ai_settings, screen, "Play Game")

    #Creating an object to capture statistical data
    stats = GameStats(ai_settings)
    #Creating a scoreboard
    points_txt = str(ai_settings.points)
    dragons_left_txt = str(stats.dragons_left)
    score_board = Score(ai_settings, screen, "lifes: " + dragons_left_txt,
                        "Score:    " + points_txt)

    #Creating the dragon.
    dragon = Dragon(ai_settings, screen)
    #Creating a group dedicated to store fireballs
    fireballs = Group()
    #creating a freezers group
    freezers = Group()

    #Starting the main loop of the game.
    while True:
        gf.check_events(ai_settings, screen, stats, play_button, dragon,
                        fireballs)
        points_txt = str(ai_settings.points)
        dragons_left_txt = str(stats.dragons_left)
        if stats.game_active:
            dragon.update()
            time_1 = pygame.time.get_ticks()
            time_2 = int(time_1 / 10)
            if time_2 % 100 in range(0, 3):
                new_freezer = Freezer(ai_settings, screen)
                freezers.add(new_freezer)
            gf.update_freezers(ai_settings, stats, screen, dragon, freezers,
                               fireballs, score_board)

            gf.update_fireballs(ai_settings, screen, dragon, freezers,
                                fireballs)
        gf.update_screen(ai_settings, screen, stats, dragon, freezers,
                         fireballs, play_button, score_board)
Пример #2
0
class StateFight(State, ButtonListener):
    
    ATTACK_BUTTON = 1
    DEFENSE_BUTTON = 2
    SPELL_BUTTON = 3
    CHARGE_BUTTON = 4
    CONTINUE_BUTTON = 5
    
    
    RUN_BUTTON = 10

    def __init__(self, screen, inputManager, character):
        State.__init__(self, screen, inputManager)
        self.character = character;
        self.character.reset()
        
        pygame.display.set_caption("StepFight - Dragon Fight")
        
        self.background = pygame.image.load(Consts.FIGHT_BACKGROUND)
        
        #Create buttons
        self._createButtons()
        #Create characters
        #self.character = Character()
        self.dragon = Dragon(character.level)
        
        self.is_in_resolution = False
        self.text_character_attack = ""
        self.text_dragon_attack = ""
        self.font_object = pygame.font.Font('freesansbold.ttf', 20)
        
        self.fight_ended = False
        
        self.next_state = Consts.STATE_CONTINUE
    
    def destroy(self):
        self.inputManager.detach(self.attack_button)
        self.inputManager.detach(self.defense_button)
        self.inputManager.detach(self.spell_button)
        self.inputManager.detach(self.charge_button)
        self.inputManager.detach(self.run_button)
        self.inputManager.detach(self.continue_button)
    
    def _createButtons(self):
        #Attack button
        self.attack_button = self._createButton(self.ATTACK_BUTTON, "Attack", (80,510,150,50))
        #Defense button
        self.defense_button = self._createButton(self.DEFENSE_BUTTON, "Defense", (280,510,150,50))
        #Spell button
        self.spell_button = self._createButton(self.SPELL_BUTTON, "Spell", (480,510,150,50))
        if(self.character.magic == 0):
            self.spell_button.is_activated = False
        #Charge button
        self.charge_button = self._createButton(self.CHARGE_BUTTON, "Charge", (680,510,150,50))
        
        #Run button
        self.run_button = self._createButton(self.RUN_BUTTON, "Run!", (50,50,60,30))
        self.run_button._setPadding(7, 8)
        self.run_button._setColors(Consts.RED_COLOR, Consts.HOVER_RED_COLOR, Consts.PRESSED_RED_COLOR)
        self.run_button.text_color = Consts.WHITE_COLOR
        
        self.continue_button = self._createButton(self.CONTINUE_BUTTON, "Continue", (700,510,150,50))
        self.continue_button.is_activated = False
        
    def _createButton(self, button_id, message, rect):
        button = Button(button_id, self, message, Consts.GRAY_COLOR, rect)
        self.inputManager.attach(button)
        button.border_color = Consts.WHITE_COLOR
        button._setColors(Consts.GRAY_COLOR, Consts.HOVER_GRAY_COLOR, Consts.PRESSED_GRAY_COLOR)
        
        return button
    
    def receiveInput(self, event):
        State.receiveInput(self, event)
    
    
    def _update(self):
        State._update(self)
        
        if(not self.fight_ended and (self.character.isDead() or self.dragon.isDead()) ):
            self.fight_ended = True
            self.enterResolutionMode()
            if(not self.character.isDead()):
                self.character.level += 1
                Consts.MONEY += 150
        
        #buttons
        if(self.is_in_resolution):
            self.continue_button._update()
        else:
            self.attack_button._update()
            self.defense_button._update()
            self.spell_button._update()
            self.charge_button._update()
        
        self.run_button._update()
        #characters
        self.character.update()
        self.dragon.update()
        
        return self.next_state
        
        
    def _render(self):
        State._render(self) 
        #background
        self.screen.fill(Consts.BLACK_COLOR)
        self.screen.blit(self.background, self.background.get_rect())
        
        #buttons
        if(self.is_in_resolution):
            self.continue_button._render(self.screen)
            if(self.fight_ended):
                self.font_object = pygame.font.Font('freesansbold.ttf', 30)
                if(self.character.isDead()):
                    self.screen.blit(self.font_object.render("YOU LOST...", False, Consts.RED_COLOR), (270,520))
                else:
                    self.screen.blit(self.font_object.render("YOU WON!!!!!", False, Consts.GOLD_COLOR), (270,520))
            else:
                message = "You"+self.text_character_attack
                self.screen.blit(self.font_object.render(message, False, Consts.WHITE_COLOR), (50,510))
                message = "Dragon"+self.text_dragon_attack
                self.screen.blit(self.font_object.render(message, False, Consts.WHITE_COLOR), (50,550))
        else:
            self.attack_button._render(self.screen)
            self.defense_button._render(self.screen)
            self.spell_button._render(self.screen)
            self.charge_button._render(self.screen)
        
        self.run_button._render(self.screen)
        #characters
        self.dragon.render(self.screen)
        self.character.render(self.screen)
        
        self.print_level()
    
    def print_level(self):
        msg_surface_object = self.font_object.render("Lvl "+str(self.character.level), False, Consts.BLACK_COLOR)
        msg_rect_object = msg_surface_object.get_rect()
        msg_rect_object.topleft = (50, 20)
        self.screen.blit(msg_surface_object, msg_rect_object)    
        
    def clickPerformed(self, button_id):
        #character movement
        character_movement = 0
        if(button_id == self.ATTACK_BUTTON): 
            character_movement = Consts.ATTACK
        elif(button_id == self.DEFENSE_BUTTON):
            character_movement = Consts.DEFENSE
        elif(button_id == self.SPELL_BUTTON):
            character_movement = Consts.SPELL
        elif(button_id == self.CHARGE_BUTTON):
            character_movement = Consts.CHARGE
            
        elif(button_id == self.CONTINUE_BUTTON):
            if(self.fight_ended):
                self.next_state = Consts.STATE_ITEMS_BOARD
            self.enterBattleMode()
            character_movement = 0
        
        elif(button_id == self.RUN_BUTTON):
            self.next_state = Consts.STATE_ITEMS_BOARD        

        if(character_movement != 0):
            self.resolveFight(character_movement)
            
            
    def resolveFight(self, character_movement):
        #dragons movement
        dragon_movement = self.dragon.getMovement()

        character_def = dragon_def = 0
        character_atk = dragon_atk = 0
        #character
        if(character_movement == Consts.DEFENSE):
            self.character.defense()
            character_def = self.character.defence
        elif(character_movement == Consts.ATTACK):
            self.character.attack()
            character_atk = self.character.strength*self.character.unCharge()
        elif(character_movement == Consts.SPELL):
            self.character.spell()
            character_atk = self.character.magic*self.character.unCharge()
        elif(character_movement == Consts.CHARGE):
            self.character.charge()

        #dragon
        if(dragon_movement == Consts.DEFENSE):
            self.dragon.defense()
            dragon_def = self.dragon.defence
        elif(dragon_movement == Consts.ATTACK):
            self.dragon.attack()
            dragon_atk = self.dragon.strength*self.dragon.unCharge()
        elif(dragon_movement == Consts.SPELL):
            self.dragon.spell()
            self.character.receive_spell()
            dragon_atk = self.dragon.magic*self.dragon.unCharge()
        elif(dragon_movement == Consts.CHARGE):
            self.dragon.charge()
            
        #resolve the damage
        self.dragon.beHitted(character_atk - dragon_def)
        self.character.beHitted(dragon_atk - character_def)

        #set in resolution mode
        self.enterResolutionMode()
        self.text_character_attack = self.getAttackText(character_movement, character_atk - dragon_def)
        self.text_dragon_attack = self.getAttackText(dragon_movement, dragon_atk - character_def)

        #DEBUG
        #print("character move: "+str(character_movement)+" dragon move: "+str(dragon_movement))
        #print("character atk: "+str(character_atk)+" dragon atk: "+str(dragon_atk))
        #print("character def: "+str(character_def)+" dragon def: "+str(dragon_def))
        #print("character life: "+str(self.character.life)+" dragon life: "+str(self.dragon.life))


    def getAttackText(self, move, damage):
        text = ""
        if(move == Consts.ATTACK):
            text = " attacked -  Damage: "+str(damage)
        elif(move == Consts.DEFENSE):
            text = " defended"
        elif(move == Consts.SPELL):
            text = " used a spell -  Damage: "+str(damage)
        elif(move == Consts.CHARGE):
            text = " charged!! "
            
        return text


    def enterResolutionMode(self):
        self.is_in_resolution = True
        self.continue_button.is_activated = True
        self.attack_button.is_activated = False
        self.defense_button.is_activated = False
        self.spell_button.is_activated = False
        self.charge_button.is_activated = False
        
    def enterBattleMode(self):
        self.is_in_resolution = False
        self.continue_button.is_activated = False
        self.attack_button.is_activated = True
        self.defense_button.is_activated = True
        self.spell_button.is_activated = True
        if(self.character.magic == 0):
            self.spell_button.is_activated = False
        self.charge_button.is_activated = True
Пример #3
0
            # elif x>= board.get_current_pos()+board.get_window_size()[1]-5:
            #     break


        for coin in coins:
            x,y = coin.get_pos()
            if x>=board.get_current_pos() and x< board.get_current_pos()+board.get_window_size()[1]-5:
                coin.display(board.get_current_pos())
            elif x<board.get_current_pos():
                coins.pop(coins.index(coin))
            elif x>= board.get_current_pos()+board.get_window_size()[1]-5:
                break

        if board.get_current_pos() >= board.get_bg_size()[1] - board.get_window_size()[1]-5:
            din.end()
            ret = dragon.update(board.get_current_pos())
            if ret is not None:
                bullets.append(ret)

        check_collisions(board,din,coins,bullets,beams,dragon)


        if magnet.get_pos()-magnet.get_affect() < din.get_pos()[0]+board.get_current_pos() and magnet.get_pos()>din.get_pos()[0]+board.get_current_pos():
            din.set_xacc(8)
            print(pos(0,120)+"Magnet Front")
        elif magnet.get_pos()+magnet.get_affect() > din.get_pos()[0]+board.get_current_pos() and magnet.get_pos()<din.get_pos()[0]+board.get_current_pos():
            din.set_xacc(-8)
            print(pos(0,120)+"Magnet Back ")
        else:
            din.set_xacc(0)
            print(pos(0,120)+'            ')
Пример #4
0
class DungeonAndDragons:

    def __init__(self):
        pygame.init()
        pygame.display.set_caption('Dungeon and Dragons')
        self.settings = Settings()
        self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
        self.stats = GameStats(self)  # Создание экземпляра для хранения игровой статистики
        self.hero = Hero(self)
        self.dragon = Dragon(self)
        self.fireballs = pygame.sprite.Group()
        self.snowballs = pygame.sprite.Group()
        self.crystals = pygame.sprite.Group()
        self.dragons = pygame.sprite.Group()
        self._create_crystals()  # TODO Сделать так, чтобы повялялись новые кристаллы когда все пять фаерболов будет
        # выпущено в дракона
        # Создание кнопки Play
        self.play_button = Button(self, 'Play')
        self.scoreboard = Scoreboard(self)

    def run_game(self):
        """
        Запуск основного цикла игры
        """
        while True:
            self._check_events()
            # Отделим части игры, которые должны выподлняться только при активной игре (game_active = True)
            if self.stats.game_active:
                self.hero.update()
                self._update_snowballs()
                self._update_fireballs()
                self._update_dragon()
                self._update_crystals()
            self._update_screen()

    def _check_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self._check_play_button(mouse_pos)

    def _check_play_button(self, mouse_pos):
        """
        Запускает новую игру при нажатии кнопки Play
        """
        # Проверяет находится ли точка щелчка в пределах прямоугольника
        # и отмена реакции клика по квадрату, если игра активна
        mouse_on_play = self.play_button.rect.collidepoint(mouse_pos)
        if mouse_on_play and not self.stats.game_active:
            # Сброс игровой статистики
            self.stats.reset_stats()
            self.stats.game_active = True

            # Очистка всех списков спрайтов
            self.fireballs.empty()
            self.snowballs.empty()
            self.crystals.empty()

            # Создание и центрирование объектов заного
            self._create_crystals()
            self.dragon.center_dragon()
            self.hero.center_hero()
            self.scoreboard.prep_score()
            self.scoreboard.prep_lives()

    def _check_keydown_events(self, event):
        """
        Реагирует на нажатие клавиш.
        """
        if event.key == pygame.K_RIGHT:
            self.hero.moving_right = True
        elif event.key == pygame.K_LEFT:
            self.hero.moving_left = True
        elif event.key == pygame.K_UP:
            self.hero.moving_up = True
        elif event.key == pygame.K_DOWN:
            self.hero.moving_down = True
        elif event.key == pygame.K_q:
            sys.exit()
        elif event.key == pygame.K_SPACE:
            self.release_snowball()

    def _check_keyup_events(self, event):
        """
        Реагирует на отпускание клавиш.
        """
        if event.key == pygame.K_RIGHT:
            self.hero.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.hero.moving_left = False
        elif event.key == pygame.K_UP:
            self.hero.moving_up = False
        elif event.key == pygame.K_DOWN:
            self.hero.moving_down = False

    def release_snowball(self):
        if len(self.snowballs) < self.settings.snowball_allowed and self.settings.crystals_stack == 3:
            new_snowball = Snowball(self)
            self.snowballs.add(new_snowball)
            self.settings.crystals_stack = 0

    def _update_snowballs(self):
        self.snowballs.update()
        for snowball in self.snowballs.copy():
            if snowball.rect.right >= self.screen.get_rect().right:
                self.snowballs.remove(snowball)
        self._check_snowball_dragon_collision()

    def _check_snowball_dragon_collision(self):
        """
        Обработка коллизий снежных шаров и дракона
        """
        collision = pygame.sprite.spritecollideany(self.dragon, self.snowballs)
        if collision:
            self._dragon_hit()

    def release_fireball(self):
        if len(self.fireballs) < self.settings.fireballs_allowed:
            new_fireball = Fireball(self)
            self.fireballs.add(new_fireball)

    def _update_fireballs(self):
        self.fireballs.update()
        for fireball in self.fireballs.copy():
            if fireball.rect.right <= 0:
                self.fireballs.remove(fireball)
        self._check_fireball_snowball_collision()
        self._check_fireball_hero_collision()

    def _check_fireball_snowball_collision(self):
        """
        Обработка коллизий огненных и снежных шаров
        """
        # Проверка попадений в героя (коллизий) с помощью sprite.groupcollide()
        # True, True обозначает, что нужно удалять каждый объект после столкновения
        collision_fireball_hero = pygame.sprite.groupcollide(self.fireballs, self.snowballs, True, True)

    def _check_fireball_hero_collision(self):
        """
        Обработка коллизий огненных и героя
        """
        if pygame.sprite.spritecollideany(self.hero, self.fireballs):
            self._hero_hit()

    def _update_crystals(self):
        self.crystals.update()
        self._check_hero_crystal_collision()
        if not self.crystals and self.settings.crystals_stack == 0:
            self._create_crystals()

    def _create_crystals(self):
        for row_number in range(1):
            for crystal_number in range(self.settings.crystals_allowed):
                self._create_crystal()

    def _create_crystal(self):
        crystal = Crystal(self)
        crystal.rect.x = randint(50, 1200)
        crystal.rect.y = randint(50, 800)
        if pygame.sprite.collide_rect(self.hero, crystal):
            crystal.rect.x = randint(50, 1200)
            crystal.rect.y = randint(50, 800)
        self.crystals.add(crystal)

    def _check_hero_crystal_collision(self):
        """
        Обработка коллизий героя и кристаллов
        """
        for crystal in self.crystals:
            hero_got_crystal = pygame.sprite.collide_rect(self.hero, crystal)
            if hero_got_crystal:
                self.settings.crystals_stack += 1
                self.crystals.remove(crystal)

    def _check_dragon_edges(self):
        if self.dragon.check_edges():
            self.dragon.x -= self.settings.dragon_drop_speed
            self.settings.dragon_direction *= -1

    def _update_dragon(self):
        self._check_dragon_edges()
        self.dragon.update()
        self._check_dragon_left()  # Проверяет добрался ли дракон до левого края экрана
        self._check_dragon_hero_collision()
        for i in range(3):
            self.release_fireball()

    def _check_dragon_left(self):
        """
        Проверяет добрался ли дракон до левого края экрана
        """
        if self.stats.lives_left > 0:
            screen_rect = self.screen.get_rect()
            for dragon in self.dragons.sprites():
                if dragon.rect.left >= screen_rect.left:
                    # Происхоит тоже, что при столкновении с кораблем
                    self._hero_hit()
                    break
        else:
            self.stats.game_active = False

    def _check_dragon_hero_collision(self):
        if pygame.sprite.spritecollideany(self.hero, self.dragons):
            self._hero_hit()

    def _hero_hit(self):
        """
        Обрабатывает столкнокение дракона с героем
        """
        if self.stats.lives_left > 0:
            # Уменьшение количества жизней на 1
            self.stats.lives_left -= 1
            self.scoreboard.prep_lives()

            # Очистка окна от объектов
            self.fireballs.empty()
            self.snowballs.empty()
            self.dragons.empty()
            self.crystals.empty()
            self.settings.crystals_stack = 0

            # Обновление расположения персонажей учитывая -1 жизнь героя
            self.dragon.center_dragon()
            self.hero.center_hero()
            self._create_crystals()

            # Пауза
            sleep(1)
        else:
            self.stats.game_active = False

    def _dragon_hit(self):
        self.stats.score += 1
        pass

    def _update_screen(self):
        self.screen.fill(self.settings.background_color)

        self.hero.blit_hero()

        self.dragon.blit_dragon()

        for fireball in self.fireballs.sprites():
            fireball.blit_fireball()

        for snowball in self.snowballs.sprites():
            snowball.blit_snowball()

        self.crystals.draw(self.screen)

        # Вывод инфолрмации о счете
        self.scoreboard.show_score()

        # Кнопка Play отображается только когда игра не активна
        if not self.stats.game_active:
            self.play_button.draw_button()

        pygame.display.flip()