首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我在使用游戏的时候有NameError?

为什么我在使用游戏的时候有NameError?
EN

Stack Overflow用户
提问于 2021-05-20 03:57:47
回答 3查看 39关注 0票数 1

为什么我会在这个程序中得到一个NameError异常?

我正在用pygame编写一个Python飞机战斗游戏。我刚把PNG飞机添加到背景中。然而,当我想要测试飞机的运动时,会产生错误,我找不到它发生的原因。

错误跟踪

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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()
EN

回答 3

Stack Overflow用户

发布于 2021-05-20 04:03:44

您访问了left中的局部变量(rightmain() )。

编辑以下代码。

代码语言:javascript
运行
复制
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()
票数 2
EN

Stack Overflow用户

发布于 2021-05-20 04:02:07

pygame.Rect对象leftrightmain()的局部变量。换句话说,它们是属于main()局部范围的变量。由于是这样的,所以leftright只能在main()函数中引用。因此,leftrightdraw_window()中没有定义。

在这种情况下,最简单的解决方案是将参数leftright添加到函数draw_window()中。然后,在main()中调用main()时,传递变量leftright

代码语言:javascript
运行
复制
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编程常见问题

注意:或者,您可以在全局范围内定义leftright,并使用global关键字(必要时)访问draw_window()main()中的变量。虽然它是一种解决方案,但不推荐它,因为它侵犯了可读性,并且在某种程度上违背了函数的目的:创建一个“自包含的”代码块。

票数 0
EN

Stack Overflow用户

发布于 2021-05-20 04:06:58

看看下面我提供的例子。

代码语言:javascript
运行
复制
def respond():
    left += 90
    right += 50
def call():
    left = 0 
    right = 0 
    respond()
call()

这基本上是代码的结构。问题是,变量leftright属于函数call(),它们不能在函数之外使用。因此,在响应中,我们打破了规则,得到的错误左是没有定义的。因此,为了解决这个问题,我们将leftright作为参数传递给respond,从而使它们可以被respond访问。

代码语言:javascript
运行
复制
def respond(left,right):
    left += 90
    right += 50
def call():
    left = 0 
    right = 0 
    respond(left,right)
call()

没有发生错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67613771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档