为什么我会在这个程序中得到一个NameError异常?
我正在用pygame编写一个Python飞机战斗游戏。我刚把PNG飞机添加到背景中。然而,当我想要测试飞机的运动时,会产生错误,我找不到它发生的原因。
错误跟踪
Traceback (most recent call last):
File "C:\Users\Desktop\Plane Fight\Plane Fight.py", line 34, in <module>
main()
File "C:\Users\Desktop\Plane Fight\Plane Fight.py", line 29, in main
draw_window()
File "C:\Users\Desktop\Plane Fight\Plane Fight.py", line 12, in draw_window
win.blit(leftjet, (left.x, left.y))
NameError: name 'left' is not defined码
import pygame
import os
win = pygame.display.set_mode((900, 500)) #生成一个900*500分辨率的游戏界面
pygame.display.set_caption("Plane Fight Game")
leftjet = pygame.transform.rotate(pygame.transform.scale(pygame.image.load(os.path.join('fighterjet.jpg')), (55 ,40)), 270)
rightjet = pygame.transform.rotate(pygame.transform.scale(pygame.image.load(os.path.join('fighterjet.jpg')), (55 ,40)), 90)
def draw_window():
win.fill((0, 0, 0)) #设置背景为黑色
win.blit(leftjet, (left.x, left.y))
win.blit(rightjet, (right.x, right.y))
pygame.display.update()
def main():
left = pygame.Rect(100, 100, 55, 40)
right = pygame.Rect(800, 100, 55, 40)
run = True
while run:
pygame.time.Clock().tick(60) #设置游戏帧率为60帧
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
right.x += 1
draw_window()
pygame.quit()
if __name__ == "__main__":
main()发布于 2021-05-20 04:03:44
您访问了left中的局部变量(right,main() )。
编辑以下代码。
import pygame
import os
win = pygame.display.set_mode((900, 500)) #生成一个900*500分辨率的游戏界面
pygame.display.set_caption("Plane Fight Game")
leftjet = pygame.transform.rotate(pygame.transform.scale(pygame.image.load(os.path.join('fighterjet.jpg')), (55 ,40)), 270)
rightjet = pygame.transform.rotate(pygame.transform.scale(pygame.image.load(os.path.join('fighterjet.jpg')), (55 ,40)), 90)
def draw_window(left, right):
win.fill((0, 0, 0)) #设置背景为黑色
win.blit(leftjet, (left.x, left.y))
win.blit(rightjet, (right.x, right.y))
pygame.display.update()
def main():
left = pygame.Rect(100, 100, 55, 40)
right = pygame.Rect(800, 100, 55, 40)
run = True
while run:
pygame.time.Clock().tick(60) #设置游戏帧率为60帧
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
right.x += 1
draw_window(left, right)
pygame.quit()
if __name__ == "__main__":
main()发布于 2021-05-20 04:02:07
pygame.Rect对象left和right是main()的局部变量。换句话说,它们是属于main()局部范围的变量。由于是这样的,所以left和right只能在main()函数中引用。因此,left和right在draw_window()中没有定义。
在这种情况下,最简单的解决方案是将参数left和right添加到函数draw_window()中。然后,在main()中调用main()时,传递变量left和right。
def draw_window(left, right): # Require 'left' and 'right' as parameters
win.fill((0, 0, 0))
win.blit(leftjet, (left.x, left.y))
win.blit(rightjet, (right.x, right.y))
pygame.display.update()
def main():
left = pygame.Rect(100, 100, 55, 40)
right = pygame.Rect(800, 100, 55, 40)
run = True
while run:
pygame.time.Clock().tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
right.x += 1
draw_window(left, right) # Pass 'left' and 'right'
pygame.quit()有关局部变量和全局变量的摘要,请参见Python编程常见问题。
注意:或者,您可以在全局范围内定义left和right,并使用global关键字(必要时)访问draw_window()和main()中的变量。虽然它是一种解决方案,但不推荐它,因为它侵犯了可读性,并且在某种程度上违背了函数的目的:创建一个“自包含的”代码块。
发布于 2021-05-20 04:06:58
看看下面我提供的例子。
def respond():
left += 90
right += 50
def call():
left = 0
right = 0
respond()
call()这基本上是代码的结构。问题是,变量left和right属于函数call(),它们不能在函数之外使用。因此,在响应中,我们打破了规则,得到的错误左是没有定义的。因此,为了解决这个问题,我们将left和right作为参数传递给respond,从而使它们可以被respond访问。
def respond(left,right):
left += 90
right += 50
def call():
left = 0
right = 0
respond(left,right)
call()没有发生错误。
https://stackoverflow.com/questions/67613771
复制相似问题