コード例 #1
0
ファイル: game.py プロジェクト: Dansh/Snake-It
def start_play(user):
    """start_play starts the game screen
    """

    #print(mixer.music.get_busy())

    mixer.music.play(-1)
    mixer.music.set_volume(0.15)
    CLOCK = pygame.time.Clock()
    FPS = 60
    textinput = InputBox(20, 20, 200, 50, '', True)
    textinput2 = InputBox(500, 500, 200, 50, '', False)
    game_win = pygame.display.set_mode((1920, 1080))
    game_background = pygame.image.load("assets\\game\\game_background.jpg")
    player = Player("assets\\player\\snake.png", 700, 700)
    language1 = Language()
    language2 = Language()
    language3 = Language()
    language4 = Language()
    language5 = Language()
    current_lang_to_blit_index = 0
    time_counter = 3
    first_image = True
    time_to_blit = 80
    failed = False
    images_to_blit = [[game_background, (0, 0)]]
    languages = [language1, language2, language3, language4, language5]
    input_boxes = [textinput, textinput2]
    best_score_text = Text(800, 200, "freesans", 40)
    score_text = Text(30, 25, "freesans", 30)
    score_text.set_text("Score: ")
    try_again_button = Button((255, 255, 255), 1185, 155, 350, 127,
                              "Play Again!", 72)

    running = True
    while running:
        CLOCK.tick(FPS)
        current_fps = CLOCK.get_fps()
        events = pygame.event.get()
        for event in events:
            if event.type == pygame.QUIT:
                running = False
            for box in input_boxes:
                box.handle_event(event)
            if event.type == pygame.MOUSEMOTION:
                if try_again_button.isOver(pygame.mouse.get_pos()):
                    try_again_button.color = (12, 152, 245)
                else:
                    try_again_button.color = (255, 255, 255)

        for image in images_to_blit:
            game_win.blit(image[0], (image[1][0], image[1][1]))

        player.move(game_win)
        if time_counter % time_to_blit == 0:
            if first_image:
                first_image = False
                time_counter = 0
            if languages[current_lang_to_blit_index].isOnScreen == False:
                languages[current_lang_to_blit_index].isOnScreen = True
                if current_lang_to_blit_index == len(languages) - 1:
                    current_lang_to_blit_index = 0
                    # for lang in languages:
                    #     lang.set_on_screen()
                else:
                    current_lang_to_blit_index += 1

        time_counter += 1
        for lang in languages:
            if lang.isOnScreen:
                if is_collided(player.x + 100, player.y, lang.x, lang.y):
                    catch_sound.play()
                    lang.reset_place()
                    player.update_score()
                if not failed:
                    if lang.move(game_win, player, languages) == False:
                        failed = True
                        score_text.replace(345, 100, 190)
                        #! if db.update_bestscore(user, player.score):
                        #!     best_score_text.set_text("new record!")
                        for lang in languages:
                            lang.isOnScreen = False
                        mixer.music.stop()
                        failed_sound.play()

        for heart in player.hearts:
            heart.draw(game_win)

        best_score_text.draw(game_win)
        score_text.set_text(f"Score: {player.score}")
        score_text.draw(game_win)
        if failed:
            try_again_button.draw(game_win, True)

        pygame.display.update()
コード例 #2
0
class Game:
    """Класс, представляющий игру.

    Поля:

    - player - объект класса Player, представляющий игрока

    - blocks - список объектов класса Block, представляющий блоки

    - score - объект класса Score, представляющий игровой счёт

    - clock - объект pygame.time.Clock для задания количества
    выполнений основного игрового цикла в секунду
    """
    def __init__(self, conf: Config, screen: pg.Surface):
        self.conf = conf
        self.screen = screen

        self.player = Player(conf)
        self.blocks = list()
        self.score = Score(conf)
        self.clock = pg.time.Clock()

    def generate_block(self):
        """Создает и добавляет новый блок в список блоков."""
        self.blocks.append(Block(self.conf))

    def start(self):
        # Добавление первого блока в список
        self.generate_block()
        # Запуск ведения игрового счета
        self.score.start()
        while True:
            self.get_input()
            self.player.move()
            self.move_blocks()
            self.update_screen()

    def move_blocks(self):
        """Перемещение каждого блока из списка вниз. Проверяются условия
        для создания, удаления и столкновения блоков с игроком.
        """
        for block in self.blocks:
            block.drop()

            # Проверка необходимости создания нового блока
            if block.top >= self.conf.window_height // 2 and len(
                    self.blocks) < 2:
                self.generate_block()
            # Проверка необходимости удаления блока
            if block.top >= self.conf.window_height:
                self.blocks.remove(block)
            # Проверка столкновения блока с игроком
            if block.collide_player(self.player):
                self.update_screen()
                time.sleep(2)
                self.terminate()

    def get_input(self):
        """Обработка событий клавиатуры."""
        for event in pg.event.get():
            if event.type == pg.QUIT:
                self.terminate()
            elif event.type == pg.KEYDOWN:
                if event.key == pg.K_ESCAPE:
                    self.terminate()
                elif event.key == pg.K_LEFT:
                    self.player.left = True
                elif event.key == pg.K_RIGHT:
                    self.player.right = True
            elif event.type == pg.KEYUP:
                if event.key == pg.K_LEFT:
                    self.player.left = False
                elif event.key == pg.K_RIGHT:
                    self.player.right = False

    @staticmethod
    def terminate():
        """Осуществляет выход из игры."""
        pg.quit()
        sys.exit()

    def update_screen(self):
        """Обновление всех игровых объектов на экране."""
        self.screen.fill(self.conf.bg_color)
        for block in self.blocks:
            block.draw(self.screen)
        self.player.draw(self.screen)
        self.score.draw(self.screen)
        self.clock.tick(self.conf.FPS)
        pg.display.flip()