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()
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()