Как я могу увеличить сложность? (например, увеличить скорость врагов, увеличить количество врагов)

1

Я застрял на чем-то, что кажется довольно простым, но я не уверен, как это реализовать. У меня есть счетчик очков, и каждый раз, когда враг убит, счет увеличивается на 1. Но эта игра довольно линейна, и я хотел бы добавить ей немного сложности, увеличив скорость врагов и/или увеличив скорость, с которой появляются враги (следовательно, увеличивается количество врагов)

Пример, который я попробовал (я поместил это в основной цикл)

if score >= 10:
e = EnemyY()
e.velocity += Vector2(3, 0)

Это утверждение не вызывает ошибок, но не дает желаемого эффекта.

Мой код:


from random import randint
import pygame
from pygame.math import Vector2

pygame.init()
pygame.font.init()

screen = pygame.display.set_mode((600, 600))
screen_width = 600
screen_height = 600
black = (0, 0, 0)
white = (255, 255, 255)
pygame.display.set_caption("gang")
clock = pygame.time.Clock()


class Player(pygame.sprite.Sprite):

    def __init__(self, pos):
        super().__init__()
        self.image = pygame.Surface((50, 30), pygame.SRCALPHA)
        pygame.draw.polygon(self.image, pygame.Color('steelblue2'), [(0, 0), (50, 15), (0, 30)])
        self.original_image = self.image
        self.rect = self.image.get_rect(center=pos)
        self.pos = Vector2(pos)
        self.velocityx = Vector2(6, 0)
        self.velocityy = Vector2(0, 6)
        self.angle = 0

    def update(self):
        self.rect.center = (int(self.pos.x), int(self.pos.y))
        clamp_rect = self.rect.clamp(screen.get_rect())
        if clamp_rect != self.rect:
            self.rect = clamp_rect
            self.pos.x, self.pos.y = self.rect.center
        self.rotate()

    def rotate(self):
        direction = pygame.mouse.get_pos() - self.pos
        self.radius, self.angle = direction.as_polar()
        self.image = pygame.transform.rotate(self.original_image, -self.angle)
        self.rect = self.image.get_rect(center=self.rect.center)


class EnemyX(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((50, 50))
        self.image.fill((randint(0, 255), randint(0, 255), randint(0, 255)))
        self.rect = self.image.get_rect()
        self.pos = Vector2(randint(-500, 0), randint(50, 550))
        self.velocity = Vector2(3, 0)

    def update(self):
        self.pos += self.velocity
        self.rect.center = self.pos
        if Vector2.length(self.pos) > Vector2.length(Vector2(800, 0)):
            self.pos = Vector2(randint(-500, 0), randint(50, 550))


class EnemyY(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((50, 50))
        self.image.fill((randint(0, 255), randint(0, 255), randint(0, 255)))
        self.rect = self.image.get_rect()
        self.pos = Vector2(randint(50, 550), randint(-500, 0))
        self.velocity = Vector2(0, 3)

    def update(self):
        self.pos += self.velocity
        self.rect.center = self.pos
        if Vector2.length(self.pos) > Vector2.length(Vector2(800, 0)):
            self.pos = Vector2(randint(50, 550), randint(-500, 0))


class Bullet(pygame.sprite.Sprite):
    def __init__(self, pos, angle):
        super().__init__()
        self.image = pygame.Surface((50, 30), pygame.SRCALPHA)
        pygame.draw.circle(self.image, (255, 255, 255), (25, 15), 4)
        self.original_image = self.image
        self.rect = self.image.get_rect(center=pos)
        self.pos = Vector2(pos)
        self.velocity = Vector2(9, 0).rotate(angle)
        self.angle = 0

    def update(self):
        self.pos += self.velocity
        self.rect.center = self.pos
        clamp_rect = self.rect.clamp(screen.get_rect())
        if clamp_rect != self.rect:
            self.rect.clamp_ip(screen.get_rect())
            if screen.get_rect().contains(self.rect):
                self.kill()

    def rotate(self):
        direction = pygame.mouse.get_pos() - self.pos
        self.radius, self.angle = direction.as_polar()
        self.image = pygame.transform.rotate(self.original_image, -self.angle)
        self.rect = self.image.get_rect(center=self.rect.center)


def xor(a, b):
    if bool(a) != bool(b):
        return True
    else:
        return False

def score_display(surface, text, size, x, y):
    font = pygame.font.Font('freesansbold.ttf', size)
    text_surface = font.render(text, True, white)
    text_rect = text_surface.get_rect()
    text_rect.topleft = (x, y)
    surface.blit(text_surface, text_rect)


player = Player((300, 300))
bullets = pygame.sprite.Group()
enemies_listX = pygame.sprite.Group()
enemies_listY = pygame.sprite.Group()
all_sprites = pygame.sprite.Group(player)

for i in range(5):  # number of enemies spawned (x)
    enemyX = EnemyX()
    enemies_listX.add(enemyX)
    all_sprites.add(enemyX)
for i in range(5):  # number of enemies spawned (y)
    enemyY = EnemyY()
    enemies_listY.add(enemyY)
    all_sprites.add(enemyY)


def drawing_text(surface, text, size, x, y):
    font = pygame.font.Font('freesansbold.ttf', size)
    text_surface = font.render(text, False, white)
    text_rect = text_surface.get_rect()
    text_rect.center = (x, y)
    surface.blit(text_surface, text_rect)


def main():
    screen_rect = screen.get_rect()
    score = 0

    drawing_text(screen, "Welcome to the game!", 32, 300, 150)
    drawing_text(screen, "Press any key to start", 32, 300, 300)
    pygame.display.flip()

    run = True
    waiting = True

    while waiting:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                waiting = False
                run = False
            if event.type == pygame.KEYUP:
                waiting = False

    while run:
        clock.tick(60)

        keys = pygame.key.get_pressed()

        for e in pygame.event.get():
            if e.type == pygame.QUIT:
                pygame.quit()
                quit()
                run = False

        if keys[pygame.K_SPACE]:
            if len(bullets) < 1:  # number of bullets on screen
                projectile = Bullet(player.pos, player.angle)
                bullets.add(projectile)
                all_sprites.add(projectile)
        if xor(keys[pygame.K_a], keys[pygame.K_k]):
            player.pos -= player.velocityx
        elif xor(keys[pygame.K_d], keys[pygame.K_SEMICOLON]):
            player.pos += player.velocityx
        elif xor(keys[pygame.K_w], keys[pygame.K_o]):
            player.pos -= player.velocityy
        elif xor(keys[pygame.K_s], keys[pygame.K_l]):
            player.pos += player.velocityy

        player.rect.clamp_ip(screen_rect)

        collide_list_x = pygame.sprite.spritecollide(player, enemies_listX, False)
        collide_list_y = pygame.sprite.spritecollide(player, enemies_listY, False)
        if collide_list_x or collide_list_y:
            all_sprites.remove(player)
            screen.fill((30, 30, 30))
            drawing_text(screen, "Game Over",32, 300, 150)
            drawing_text(screen, "Score: " + str(score), 32, 300, 300)
            drawing_text(screen, "Press any key to restart", 32, 300, 450)

        bullet_collide_x = pygame.sprite.groupcollide(bullets, enemies_listX, True, True)
        if bullet_collide_x:
            for collisions in bullet_collide_x:
                enemyX = EnemyX()
                enemies_listX.add(enemyX)
                all_sprites.add(enemyX)
                score += 1

        bullet_collide_y = pygame.sprite.groupcollide(bullets, enemies_listY, True, True)
        if bullet_collide_y:
            for collisions_y in bullet_collide_y:
                enemyY = EnemyY()
                enemies_listY.add(enemyY)
                all_sprites.add(enemyY)
                score += 1

        screen.fill((30, 30, 30))
        all_sprites.update()
        all_sprites.draw(screen)
        bullets.update()
        bullets.draw(screen)
        score_display(screen, "Score: " + str(score), 18, 0, 0)
        pygame.display.update()


main()

Таким образом, если вопрос не ясен, может ли кто-нибудь помочь мне увеличить скорость появления врагов и/или увеличить скорость при достижении определенных пределов очков?

Спасибо :)

  • 0
    Ваши методы работают для меня, если я for collisions in bullet_collide_y: и использую Vector2(0, 3) вместо Vector2(3, 0) . Но это увеличивает скорость только для появившихся врагов. Для увеличения скорости для всех он должен новый for цикла после проверки colision.
  • 0
    чтобы увеличить количество врагов, я бы создал переменную max_enemies при запуске и совместно, while len(enemies_listX) < max_enemies: add_next_enemie() . И что изменится max_enemies при изменении оценки. Но, возможно, вам потребуется previous_score оценка, чтобы увидеть, изменилась ли оценка в текущем цикле.
Показать ещё 2 комментария
Теги:
pygame

1 ответ

0

Этим способом я могу добавлять нового врага каждые 5 очков

Перед проверкой коллизий я сохраняю score как previous_score

После проверки столкновений я могу сравнить score с previous_score

Но я буду сравнивать score//5 с previous_score//5 чтобы они отличались, когда я получал счет 5, 10, 15 и т.д.

    previuos_score = score

    bullet_collide_x = pygame.sprite.groupcollide(bullets, enemies_listX, True, True)
    if bullet_collide_x:
        for collisions in bullet_collide_x:
            enemyX = EnemyX()
            enemies_listX.add(enemyX)
            all_sprites.add(enemyX)
            score += 1

    bullet_collide_y = pygame.sprite.groupcollide(bullets, enemies_listY, True, True)
    if bullet_collide_y:
        for collisions_y in bullet_collide_y:
            enemyY = EnemyY()
            enemies_listY.add(enemyY)
            all_sprites.add(enemyY)
            score += 1

    if (previuos_score//5) < (score//5):
        print('add more', previuos_score//5, score//5)
        enemyY = EnemyY()
        enemies_listY.add(enemyY)
        all_sprites.add(enemyY)
        enemyX = EnemyX()
        enemies_listX.add(enemyX)
        all_sprites.add(enemyX)

Я мог держать это как level

level = (score//5) + 1

и отобразить его на экране как уровень

или я мог бы использовать это, чтобы изменить скорость врага

enemyx.velocity = level * Vector(3,0)

Я также мог бы использовать level_speed чтобы изменять скорость каждые 10 очков и по-прежнему добавлять нового врага каждые 5 очков

level_speed = (score//10) + 1

enemyx.velocity = level_speed * Vector(3,0)
  • 0
    отлично, спасибо, все хорошо работает :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню