我想制造多个敌人,但不断收到相同的错误代码

问题描述 投票:0回答:1

Blockquote,我只是在这段电晕时期开始编码,所以遇到了一个问题。错误代码是evil_icon = [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()
pygame pycharm
1个回答
0
投票

错误似乎很明显。您的代码中包含以下行:

   # multiple enemy players
   enemy_icon = [i]

此行表示您正在尝试创建变量enemy_icon,并将其初始化为包含一个元素的列表。该元素是先前未定义的变量i。我怀疑i是一个错字,并且您实际上是在尝试使用一个空列表进行初始化,在这种情况下,只需像这样删除i

   # multiple enemy players
   enemy_icon = []

此后的4个变量同样如此。

© www.soinside.com 2019 - 2024. All rights reserved.