示例#1
0
def play_function(difficulty, value):
    # Define globals
    global main_menu
    global clock

    pygame.mixer.music.pause()

    # Заглушка
    value = None

    # Путь до изображений к игре
    path_from_background = 'Data\\Image\\Map1.png'
    path_from_person = pygame.image.load('Data\\Image\\12345.png')
    path_from_person = pygame.transform.scale2x(path_from_person)
    path_from_zombie = [
        'Data\\Image\\Zombie.png', 'Data\\Image\\Zombie1.png',
        'Data\\Image\\Zombie2.png', 'Data\\Image\\Zombie3.png',
        'Data\\Image\\Zombie4.png'
    ]

    # Изменение игровых коэфицентов в зависимости от сложности
    if difficulty[0] == 'EASY':
        add_hp, add_speed, add_damage = 0.0625, 0.0625, 0.0625
    elif difficulty[0] == 'MEDIUM':
        add_hp, add_speed, add_damage = 0.125, 0.125, 0.125
    else:
        add_hp, add_speed, add_damage = 0.25, 0.25, 0.25

    counter_kill = 0  # Счётчик убийст зомби

    # Иницилизация групп

    # Сюда входят все обьекты кроме игрока и камеры
    all_sprite = pygame.sprite.Group()

    # Сюда входят только видимые обьекты
    visible_objects = pygame.sprite.Group()

    # Сюда входят только выстрелы
    bullet = pygame.sprite.Group()

    # Сюда входят только враги
    enemy = pygame.sprite.Group()

    # Шрифты применяющиеся в игре
    counter = pygame.font.Font(None, 48)  # Для счётчика убийст зомби
    damage_indicator = pygame.font.Font(None, 16)  # Для отображения дамага
    hp_indicator = pygame.font.Font(None, 32)  # Для отоброжения хп персонажа

    # Добавления Фона
    background = GameObjects.GameObject((0, 0), path_from_background)
    background.set_mask()
    background.disabled_alpha()
    all_sprite.add(background)
    visible_objects.add(background)

    # Добавления игрока
    person = GameObjects.Person((900, 900),
                                path_from_person,
                                hp=10000,
                                speed_move=(600, 600))
    visible_objects.add(person)

    # Добавление границ
    wall_up = GameObjects.EmptyObject((0, 0), (WINDOW_SIZE[0] + 1, 1))
    wall_botton = GameObjects.EmptyObject((0, WINDOW_SIZE[1] - 1),
                                          (WINDOW_SIZE[0] + 1, 1))
    wall_left = GameObjects.EmptyObject((0, 0), (1, WINDOW_SIZE[1] + 1))
    wall_right = GameObjects.EmptyObject((WINDOW_SIZE[0] - 1, 0),
                                         (1, WINDOW_SIZE[1] + 1))

    # Создание камеры
    camera = GameObjects.TargetCamera(
        all_sprite,
        person,
        traffic_restriction=background.get_size(),
        flags=pygame.FULLSCREEN | pygame.HWSURFACE)
    screen = camera.get_screen()  # Поялучаем экран камеры

    clock = pygame.time.Clock()  # Регулятор FPS
    pause = False  # Переменная отвечающая за паузу

    counter_shot = 0
    # Основной цикл игры
    command_exit = False
    while not command_exit and person.get_hp() > 0:
        screen.fill((0, 0, 0))  # Избавление от шлейфов

        # Обрабатываем нажаните клавишь
        for event in pygame.event.get():
            if event.type == pygame.QUIT:  # По нажатию на кнопки выхода выход
                command_exit = True
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:  # Если нажата, остановка игры
                    pause = not pause
                if event.key == pygame.K_z:  # Если нажата +100 к счётчику
                    counter_kill += 100
                elif event.key == pygame.K_g:  # Если нажата, обнуляет счётчик
                    counter_kill = 0

        if not pause:
            # Получаем всё нажатые клавиши
            keys = pygame.key.get_pressed()
            buttons = pygame.mouse.get_pressed()

            # Обрабатываем все удержанные клавиши
            x, y = 0, 0
            if keys[pygame.K_d]:
                x += 1
            if keys[pygame.K_a]:
                x -= 1
            if keys[pygame.K_w]:
                y -= 1
            if keys[pygame.K_s]:
                y += 1
            if buttons[0]:
                if not counter_shot % 2:
                    person.shoot().add(all_sprite, visible_objects, bullet)

            if counter_shot == 999:
                counter_shot = 0

            counter_shot += 1

            # Определяем столкновение персонажа с границами
            top, botton, left, right = True, True, True, True
            if pygame.sprite.collide_rect(person, wall_up):
                top = False
            if pygame.sprite.collide_rect(person, wall_botton):
                botton = False
            if pygame.sprite.collide_rect(person, wall_left):
                left = False
            if pygame.sprite.collide_rect(person, wall_right):
                right = False

            # Устанавливаем куда персонаж не может ходить
            person.set_ability_move(top=top,
                                    botton=botton,
                                    left=left,
                                    right=right)

            # Двигаем камеру с персонажем
            camera.sled((x, y))

            # Обнавление всех обьектов
            person.update()
            all_sprite.update()

            # Добавляем зомби если их < 100
            if len(enemy) < 100:
                pos_spanw_x = randrange(-200, WINDOW_SIZE[0] * 1.5)
                if 0 < pos_spanw_x < WINDOW_SIZE[0]:
                    pos_spanw_y = -200 if randrange(
                        2) else WINDOW_SIZE[1] * 1.5
                else:
                    pos_spanw_y = randrange(-200, WINDOW_SIZE[1] * 1.5)

                GameObjects.Enemy(
                    (pos_spanw_x, pos_spanw_y),
                    choice(path_from_zombie),
                    speed_move=randrange(100,
                                         round(101 +
                                               counter_kill * add_speed)),
                    target=person,
                    damage=randrange(1, round(2 + counter_kill * add_damage)),
                    rotate=(1, lambda: person.get_rect().center),
                    hp=randrange(1, round(2 + counter_kill * add_hp))).add(
                        all_sprite, visible_objects, enemy)

            # Изменяем скорость персанажу в зависимости от убитых зомби
            person.edit_speed_move(round(600 + (counter_kill**0.5)))

            # Обработка столкновение зомби с персонажем
            for enem in pygame.sprite.spritecollide(
                    person, enemy, False, collided=pygame.sprite.collide_rect):
                if pygame.sprite.collide_mask(person, enem):
                    person.hit(enem.get_damage())
                    pos = person.get_rect().center
                    indicator = GameObjects.GameObject(
                        (pos[0] + randrange(25), pos[1] + randrange(25)),
                        path_image=damage_indicator.render(
                            str(-enem.get_damage()), True, (255, 255, 0)),
                        time_life=10)
                    indicator.add(all_sprite, visible_objects)

            # Обработка пуль с зомби
            for bull, enem in pygame.sprite.groupcollide(
                    bullet, enemy, False, False).items():
                for enemys in enem:
                    if pygame.sprite.collide_mask(bull, enemys):
                        enemys.hit(bull.get_damage())
                        pos = enemys.get_rect().center
                        indicator = GameObjects.GameObject(
                            (pos[0] + randrange(25), pos[1] + randrange(25)),
                            path_image=damage_indicator.render(
                                str(-enemys.get_damage()), True, (255, 0, 0)),
                            time_life=10)
                        indicator.add(all_sprite, visible_objects)
                        if randrange(4):
                            bull.kill()
                        if not enemys.get_hp():
                            counter_kill += 1

        # Отрисовка всех элементов на экране
        visible_objects.draw(screen)
        xol = counter.render(f"Всего убито: {counter_kill}", True, [0, 0, 0])
        screen.blit(xol, (0, 0))
        xol = hp_indicator.render(f"Hp: {person.get_hp()}", True,
                                  [255, 0, 255])
        screen.blit(xol, (WINDOW_SIZE[0] - xol.get_rect().size[0],
                          WINDOW_SIZE[1] - xol.get_rect().size[1]))
        clock.tick(FPS)
        pygame.display.flip()

    # Вывод конечного экрана и выход в меню
    screen.blit(
        pygame.transform.scale(pygame.image.load("Data\\Image\\End.jpg"),
                               WINDOW_SIZE), (0, 0))
    pygame.display.flip()
    pygame.time.wait(2500)

    main_menu.reset(True)
    pygame.mixer.music.play(True)
    return
示例#2
0
def play_function():
    # Define globals
    global clock
    global cursor_angle
    global difficulty
    global screen_size

    flag = True
    pause_time = timedelta()
    delta_quit = timedelta()
    time_now = datetime.now()
    con = sqlite3.connect('records.db')
    cur = con.cursor()
    pygame.mouse.set_visible(False)
    # Путь до изображений к игре
    path_from_background = 'Data\\Image\\Map1.png'
    path_from_person = pygame.image.load('Data\\Image\\persona.png')
    path_from_person = pygame.transform.scale2x(path_from_person)
    path_from_zombie = [
        'Data\\Image\\Zombie.png', 'Data\\Image\\Zombie1.png',
        'Data\\Image\\Zombie2.png', 'Data\\Image\\Zombie3.png',
        'Data\\Image\\Zombie4.png'
    ]

    # Изменение игровых коэфицентов в зависимости от сложности
    if difficulty == 'EASY':
        add_hp, add_speed, add_damage = 0.0625, 0.0625, 0.0625
    elif difficulty == 'MEDIUM':
        add_hp, add_speed, add_damage = 0.125, 0.125, 0.125
    else:
        add_hp, add_speed, add_damage = 0.25, 0.25, 0.25

    counter_kill = 0  # Счётчик убийст зомби

    # Иницилизация групп

    # Сюда входят все обьекты кроме игрока и камеры
    all_sprite = pygame.sprite.Group()

    # Сюда входят только видимые обьекты
    visible_objects = pygame.sprite.Group()

    # Сюда входят только выстрелы
    bullet = pygame.sprite.Group()

    # Сюда входят только враги
    enemy = pygame.sprite.Group()

    # Шрифты применяющиеся в игре
    counter = pygame.font.Font(None, 48)  # Для счётчика убийст зомби
    damage_indicator = pygame.font.Font(None, 16)  # Для отображения дамага
    bullet_reload_indicator = pygame.font.Font(
        None, 48)  # Для отображения перезарядки
    hp_indicator = pygame.font.Font(None, 48)  # Для отоброжения хп персонажа

    # Добавления Фона
    background = GameObjects.GameObject((0, 0), path_from_background)
    background.set_mask()
    background.disabled_alpha()
    all_sprite.add(background)
    visible_objects.add(background)

    # Добавления игрока
    person = GameObjects.Person((900, 900),
                                path_from_person,
                                hp=1000,
                                speed_move=(600, 600))
    visible_objects.add(person)

    # Добавление границ
    wall_up = GameObjects.EmptyObject((0, 0), (screen_size[0] + 1, 1))
    wall_botton = GameObjects.EmptyObject((0, screen_size[0] - 1),
                                          (screen_size[0] + 1, 1))
    wall_left = GameObjects.EmptyObject((0, 0), (1, screen_size[1] + 1))
    wall_right = GameObjects.EmptyObject((screen_size[1] - 1, 0),
                                         (1, screen_size[1] + 1))

    # Создание камеры
    camera = GameObjects.TargetCamera(
        all_sprite,
        person,
        traffic_restriction=background.get_size(),
        size=screen_size)
    # Поялучаем экран камеры
    screen = camera.get_screen()
    # Регулятор FPS
    clock = pygame.time.Clock()
    # Переменная отвечающая за паузу
    pause = False

    # Счетчик выстрелов
    counter_shot = 0
    # Основной цикл игры
    command_exit = False
    while not command_exit and person.get_hp() > 0:
        screen.fill((0, 0, 0))  # Избавление от шлейфов

        # Обрабатываем нажаните клавишь
        for event in pygame.event.get():
            if event.type == pygame.QUIT:  # По нажатию на кнопки выхода выход
                delta = datetime.now() - time_now - delta_quit
                result = cur.execute(
                    f"""INSERT INTO records(rec) VALUES('{delta.seconds}') """)
                con.commit()
                command_exit = True
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:  # Если нажата, остановка игры
                    if not pause:
                        pause_time = datetime.now()
                    else:
                        delta_pause = pause_time - datetime.now()
                    pause = not pause
                if event.key == pygame.K_z:  # Если нажата, выход в меню
                    delta = datetime.now() - time_now - delta_quit
                    result = cur.execute(
                        f"""INSERT INTO records(rec) VALUES('{delta.seconds}') """
                    )
                    con.commit()
                    command_exit = True

        if not pause:
            # Получаем всё нажатые клавиши
            keys = pygame.key.get_pressed()
            buttons = pygame.mouse.get_pressed()
            try:
                delta_quit += delta_pause
            except:
                pass
            # Обрабатываем все удержанные клавиши
            x, y = 0, 0
            if keys[pygame.K_d]:
                x += 1
            if keys[pygame.K_a]:
                x -= 1
            if keys[pygame.K_w]:
                y -= 1
            if keys[pygame.K_s]:
                y += 1
            if buttons[0]:
                try:
                    person.shoot().add(all_sprite, visible_objects, bullet)
                except:
                    pass

            if counter_shot == 999:
                counter_shot = 0

            counter_shot += 1

            # Определяем столкновение персонажа с границами
            top, botton, left, right = True, True, True, True
            if pygame.sprite.collide_rect(person, wall_up):
                top = False
            if pygame.sprite.collide_rect(person, wall_botton):
                botton = False
            if pygame.sprite.collide_rect(person, wall_left):
                left = False
            if pygame.sprite.collide_rect(person, wall_right):
                right = False

            # Устанавливаем куда персонаж не может ходить
            person.set_ability_move(top=top,
                                    botton=botton,
                                    left=left,
                                    right=right)

            # Двигаем камеру с персонажем
            camera.sled((x, y))

            # Обнавление всех обьектов
            person.update()
            all_sprite.update()

            # Добавляем зомби если их < 30
            if len(enemy) < 30:
                pos_spanw_x = randrange(-200, screen_size[0] * 1.5)
                if 0 < pos_spanw_x < screen_size[0]:
                    pos_spanw_y = -200 if randrange(
                        2) else screen_size[1] * 1.5
                else:
                    pos_spanw_y = randrange(-200, screen_size[1] * 1.5)

                GameObjects.Enemy(
                    (pos_spanw_x, pos_spanw_y),
                    choice(path_from_zombie),
                    speed_move=randrange(100,
                                         round(101 +
                                               counter_kill * add_speed)),
                    target=person,
                    damage=randrange(1, round(2 + counter_kill * add_damage)),
                    rotate=(1, lambda: person.get_rect().center),
                    hp=randrange(1, round(2 + counter_kill * add_hp))).add(
                        all_sprite, visible_objects, enemy)

            # Изменяем скорость персанажу в зависимости от убитых зомби
            person.edit_speed_move(round(600 + (counter_kill**0.5)))

            # Обработка столкновение зомби с персонажем
            for enem in pygame.sprite.spritecollide(
                    person, enemy, False, collided=pygame.sprite.collide_rect):
                if pygame.sprite.collide_mask(person, enem):
                    person.hit(enem.get_damage())
                    pos = person.get_rect().center
                    if person.get_hp() <= 0 and flag:
                        flag = False
                        delta = datetime.now() - time_now - delta_quit
                        result = cur.execute(
                            f"""INSERT INTO records(rec) VALUES('{delta.seconds}') """
                        )
                        con.commit()
                    indicator = GameObjects.GameObject(
                        (pos[0] + randrange(25), pos[1] + randrange(25)),
                        path_image=damage_indicator.render(
                            str(-enem.get_damage()), True, (255, 255, 0)),
                        time_life=10)
                    indicator.add(all_sprite, visible_objects)

            # Обработка пуль с зомби
            for bull, enem in pygame.sprite.groupcollide(
                    bullet, enemy, False, False).items():
                for enemys in enem:
                    if pygame.sprite.collide_mask(bull, enemys):
                        enemys.hit(bull.get_damage())
                        pos = enemys.get_rect().center
                        indicator = GameObjects.GameObject(
                            (pos[0] + randrange(25), pos[1] + randrange(25)),
                            path_image=damage_indicator.render(
                                str(-enemys.get_damage()), True, (255, 0, 0)),
                            time_life=10)
                        indicator.add(all_sprite, visible_objects)
                        if randrange(4):
                            bull.kill()
                        if enemys.get_hp() <= 0:
                            counter_kill += 1

        # Отрисовка всех элементов на экране
        visible_objects.draw(screen)
        xol = counter.render(f"Всего убито: {counter_kill}", True, [0, 0, 0])
        screen.blit(xol, (0, 0))
        hp_ind = hp_indicator.render(f"Hp: {person.get_hp()}", True,
                                     [255, 0, 255])
        screen.blit(hp_ind, (screen_size[0] - 200, screen_size[1] - 100))
        bul = bullet_reload_indicator.render(
            f"Bullet: {60 - person.get_count()}", True, [255, 0, 255])
        screen.blit(bul, (screen_size[0] - 200, 50))
        cursor_angle += 1
        screen.blit(pygame.transform.rotate(MANUAL_CURSOR, cursor_angle),
                    (pygame.mouse.get_pos()))
        clock.tick(FPS)
        pygame.display.flip()

    pygame.display.flip()
    main()
    return