Проблема при добавлении новых элементов в список - PullRequest
2 голосов
/ 13 февраля 2020

Я пытаюсь создать случайного врага для своей игры. Для этого я видел этот метод в переполнении стека, но он, похоже, не работает для меня, и я не уверен, почему. При добавлении кода в мой список, он почему-то не go правильно. Ниже приведен мой соответствующий код для уточнения того, что я имею в виду. Код между хэштегами должен выделяться

moveFunctions:

def moveFunctions(bullets, E_bullets, score, font, window,
                  protagR, protagL, protagU, protagD, enemyR, enemyL, enemyU, enemyD, bg):
    clock = pygame.time.Clock()

    bulletSFX = pygame.mixer.Sound("ASG2_Music/shoot_Bullet_SFX.wav")
    getHitSFX = pygame.mixer.Sound("ASG2_Music/Hit_SFX.wav")
    enemy_getHitSFX = pygame.mixer.Sound("ASG2_Music/Monster_Hit_SFX.wav")
    music = pygame.mixer.music.load("ASG2_Music/stand_Proud.mp3")
    pygame.mixer.music.play(-1)

    bulletDelay = 0
    game_Over = True
    run = True
    ##########################################################################################
    DiArrow = enemy(random.randint(1, 500), random.randint(1, 500), 48, 48, 410)
    board = player(225, 225, 64, 64, 0)

    while run:
        enemies = []
        maxEnemies = 5
        for i in range(maxEnemies):
            enemies.append(enemy(random.randint(1, 500), random.randint(1, 500), 48,48, 410))
            print(enemies)
    ##########################################################################################
        if game_Over:
            # show_game_Over_Screen()
            game_Over = False
        clock.tick(15) # Frame rate per second (FPS)

        if bulletDelay > 0:
            bulletDelay += 1
        if bulletDelay > 3:
                bulletDelay = 0

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

        fireBullet(board, bullets, DiArrow, score, enemy_getHitSFX)
        E_fireBullet(board, E_bullets, DiArrow, getHitSFX)

        arrowKeys = pygame.key.get_pressed()

        score = fireBullet(board, bullets, DiArrow, score, enemy_getHitSFX)

        bulletDirection(arrowKeys, board, bullets, bulletDelay, bulletSFX)
        bulletDelay = bulletDirection(arrowKeys, board, bullets, bulletDelay, bulletSFX)
        E_bulletDirection(DiArrow, E_bullets, board)
        playerControls(arrowKeys, board)
        enemyControls(DiArrow, board)
        redrawGameWindow(board, DiArrow, bullets, E_bullets, font, score, window, protagR, protagL, protagU, protagD,
                         enemyR, enemyL, enemyU, enemyD, enemies, bg)

redrawGameWindow:

def redrawGameWindow(board, DiArrow, bullets, E_bullets, font, score, window, protagR, protagL, protagU, protagD, enemyR,
                     enemyL, enemyU, enemyD, enemies, bg):
    window.blit(bg, (0,0))
    text = font.render("Score: " + str(score), 1, (255, 255, 255))
    window.blit(text, (340, 513))
    board.drawCharacter(window,  protagR, protagL, protagU, protagD)
    ##########################################################################################
    for i in enemies:
        DiArrow.drawEnemy(window, enemyR, enemyL, enemyU, enemyD)
    ##########################################################################################
    for bullet in bullets:
        bullet.draw(window)
    for bullet in E_bullets:
        bullet.draw(window)
    pygame.display.update()

class врага ():

class enemy():
    def __init__(self, x, y, width, height, walkCount):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.vel = 3
        self.lastDirection = "right" or "left" or "up" or "down"
        self.walkCount = walkCount
        self.hitbox = (self.x, self.y, 48, 50)
        self.health = 4
        self.visible = True

    def drawEnemy(self, window, enemyR, enemyL, enemyU, enemyD):
        dest = (self.x, self.y)

        if self.visible:
            if self.walkCount + 1 >= 15:
                self.walkCount = 0

            if self.lastDirection == "left":
                window.blit(enemyL[self.walkCount//3], dest)
                self.walkCount += 1
            elif self.lastDirection == "right":
                window.blit(enemyR[self.walkCount//3], dest)
                self.walkCount += 1
            elif self.lastDirection == "up":
                window.blit(enemyU[self.walkCount//3], dest)
                self.walkCount += 1
            elif self.lastDirection == "down":
                window.blit(enemyD[self.walkCount//3], dest)
                self.walkCount += 1
            self.hitbox = (self.x, self.y, 48, 50)

            pygame.draw.rect(window, (255, 0, 0), (self.hitbox[0], self.hitbox[1] - 15, 50, 10))
            pygame.draw.rect(window, (177, 0, 175), (self.hitbox[0], self.hitbox[1] - 15, 50 - ((50/5)*(4 - self.health)), 10))

    def getHit(self):
        if self.health > 0:
            print("Enemy Got Hit!")
            self.health -= 1
        else:
            print("Enemy Killed!")
            self.visible = False

    def gameOver(self):
        if self.visible == False:
            pass

Я обнаружил, что при попытке проверить на наличие ошибок печать врагов в moveFunctions фактически не распечатывает список должным образом, а выдает его.

[<__main__.enemy object at 0x00000251C53A3828>]
[<__main__.enemy object at 0x00000251C53A3828>, <__main__.enemy object at 0x00000251C53A3470>]
[<__main__.enemy object at 0x00000251C53A3828>, <__main__.enemy object at 0x00000251C53A3470>, <__main__.enemy object at 0x00000251C53A3EB8>]
[<__main__.enemy object at 0x00000251C53A3828>, <__main__.enemy object at 0x00000251C53A3470>, <__main__.enemy object at 0x00000251C53A3EB8>, <__main__.enemy object at 0x00000251C53A39E8>]
[<__main__.enemy object at 0x00000251C53A3828>, <__main__.enemy object at 0x00000251C53A3470>, <__main__.enemy object at 0x00000251C53A3EB8>, <__main__.enemy object at 0x00000251C53A39E8>, <__main__.enemy object at 0x00000251C53A3048>]

Как видите, список обновляется , но вместо этого с этой странной строкой текста я понимаю.

Для полного раскрытия, я использую модуль pygame в Python, но я сомневаюсь, что именно это создает мне эту проблему здесь.

Я предполагаю, что моя проблема для maxEnemies нерест не напрямую связан с этим. Любая помощь будет высоко ценится, спасибо

1 Ответ

2 голосов
/ 13 февраля 2020

Вы фактически создаете новый список врагов (enemies = []) в каждом кадре и добавляете 5 новых enemy экземпляров в список. Кроме того, список печатается в l oop.

Создайте список врагов перед основным приложением l oop и напечатайте атрибуты каждого отдельного врага, а не список врагов:

def moveFunctions(.....):
    # [...]

    enemies = []
    maxEnemies = 5
    for i in range(maxEnemies):
        newEnemy = enemy(random.randint(1, 500), random.randint(1, 500), 48,48, 410)
        enemies.append(newEnemy)
        print(newEnemy.x, newEnemy.y)

    while run:
        # [...]

Примечание. Имена классов обычно должны использовать соглашение CapWords. Назовите класс Enemy вместо enemy:

class enemy():

class Enemy():
...