Я хочу создать несколько врагов, но получаю один и тот же код ошибки - PullRequest
0 голосов
/ 25 апреля 2020

Цитата. Я только начал писать код в этом коронатиме и столкнулся с проблемой. Код ошибки - врагов_икон = [i] NameError: имя 'i' не определено

И я не уверен, почему. Я искал онлайн, но не смог найти ответы. Надеюсь, это дало достаточно ресурсов, чтобы быть достаточно хорошим вопросом.

   import pygame
   import random
   import math

   pygame.init()

   # game over logo
   game_over = pygame.image.load("game-over.png")

   # create screen
   screen = pygame.display.set_mode((1000, 600))
   background = pygame.image.load("8717.jpg")

   # Title + Logo
   pygame.display.set_caption("Space Invader")
   icon = pygame.image.load("chicken.png")
   pygame.display.set_icon(icon)

   # Player icon
   player_icon = pygame.image.load("spaceship.png")
   playerX = 400
   playerY = 500

   player_changeX = 0
   player_changeY = 0

   # multiple enemy players
   enemy_icon = [i]
   enemyX = [i]
   enemyY = [i]
   enemy_changeX = [i]
   enemy_changeY = [i]
   num_of_enemies = 2

   for i in range(num_of_enemies):
       enemy_icon.append(pygame.image.load("space-invaders.png"))
       enemyX.append(random.randint(0, 936))
       enemyY.append(random.randint(-100, -50))
       enemy_changeX.append(random.randint(-2, 2))
       enemy_changeY.append(random.randint(1, 2))

   # bullet #ready you can't see bullet. fire you can
   bullet = pygame.image.load("bullet.png")
   bulletX = 0
   bulletY = 0
   bulletY_change = 2
   bulletX_change = 0
   bullet_state = "ready"

   # score
   score = 0


   def player(x, y):
       screen.blit(player_icon, (x, y))


   def enemy(x, y, i):
       screen.blit(enemy_icon[i], (x, y))

   def fire_bullet(x, y):
       global bullet_state
       bullet_state = "fire"
       screen.blit(bullet, (x + 16, y + 10))


   def has_collided(enemyX, enemyY, bulletX, bulletY):
       distance = math.sqrt((math.pow(enemyX - bulletX, 2)) + (math.pow(enemyY - bulletY, 2)))
       if distance < 27:
           return True
       else:
           return False

   def collided(enemyX, enemyY, playerX, playerY):
       distance2 = math.sqrt((math.pow(enemyX - playerX, 2)) + (math.pow(enemyY - playerY, 2)))
       if distance2 < 27:
           return True
       else:
           return False


   # game loop
   running = True
   while running:

       # background round colour RGB
       screen.fill((0, 0, 0))
       # background image
       screen.blit(background, (0, 0))

       for event in pygame.event.get():
           if event.type == pygame.QUIT:
               running = False
       # If key pressed check whether its right or left
           if event.type == pygame.KEYDOWN:
               if event.key == pygame.K_LEFT:
                   player_changeX = -5
               if event.key == pygame.K_RIGHT:
                   player_changeX = 5
               if event.key == pygame.K_UP:
                   player_changeY = -5
               if event.key == pygame.K_DOWN:
                   player_changeY = 5
               # bullet shot
               if event.key == pygame.K_SPACE:
                   if bullet_state == "ready":
                       bulletX = playerX
                       bulletY = playerY
                       fire_bullet(bulletX, bulletY)
           if event.type == pygame.KEYUP:
               if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                   player_changeX = 0
               if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                   player_changeY = 0

       # If player reaches boarder
       if playerX >= 936:
       playerX = 20
       if playerX <= 0:
           playerX = 936
       if playerY <= 0:
           playerY = 0
       if playerY >= 550:
           playerY = 550
       # enemy control
       for i in range(num_of_enemies):
           if enemyX[i] >= 936:
               enemyX[i] = 20
           if enemyX[i] <= 0:
               enemyX[i] = 936
           if enemyY[i] <= 0:
               enemyY[i] = 0
           if enemyY[i] >= 550:
               enemyY[i] = random.randint(-100, -50)
           # collision bullet and enemy
           collision = has_collided(enemyX[i], enemyY[i], bulletX, bulletY)
           if collision:
               bulletY = playerY
               bulletX = playerX
               bullet_state = "ready"
               score += 1
               print(score)
               enemyX[i] = random.randint(0, 936)
               enemyY[i] = random.randint(-100, -50)
               enemy_changeX[i] = random.randint(-2, 2)
               enemy_changeY[i] = random.randint(1, 2)
           collision2 = collided(enemyX[i], enemyY[i], playerX, playerY)
           if collision2:
               screen.blit(game_over, (400, 100))
               score = 0
               playerY = 400
               playerX = 500
           enemy(enemyX[i], enemyY[i], i)

       # bullet movement
       if bullet_state == "fire":
           fire_bullet(bulletX, bulletY)
           bulletY -= bulletY_change

       if bulletY <= 0:
           bullet_state = "ready"

       # collision enemy and player


       # Player coordinates
       playerX += player_changeX
       playerY += player_changeY

       # enemy change in coordinates
       enemyX += enemy_changeX
       enemyY += enemy_changeY

       # bullet change in y
       bulletY -= bulletY_change

       # Results
       player(playerX, playerY)

       pygame.display.update()

1 Ответ

0 голосов
/ 25 апреля 2020

Ошибка кажется довольно понятной. У вас есть эта строка в вашем коде:

   # multiple enemy players
   enemy_icon = [i]

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

   # multiple enemy players
   enemy_icon = []

То же самое верно для 4 переменных сразу после этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...