在赋值错误之前引用

时间:2015-01-09 07:23:58

标签: python pygame

我有以下代码来创建一个pygame of snake(非常基本),为了增加我的蛇长度我添加了一个声明snakeLength += 1 in line 142它出现了错误说

Traceback (most recent call last):
      File "C:/Python27/sjewgou.py", line 142, in <module>
       gameLoop()
      File "C:/Python27/sjewgou.py", line 118, in gameLoop
       if len(snakeList) > snakeLength:
     UnboundLocalError: local variable 'snakeLength' referenced before assignment

我该怎么办?

我的代码如下

import pygame
pygame.init()
import time
import random

white = (255,255,255)
black = (0,0,0)
red = (255,0,0)
green = (0,155,0)

display_width = 800
display_height = 600

block_size = 10
FPS = 30

gameDisplay = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption("Ssssrikar")

gameExit = False
lead_x = display_width/2
lead_y = display_height/2

lead_x_change = 0
lead_y_change = 0

snakeList = []
snakeLength = 1


font = pygame.font.SysFont(None,25)

clock = pygame.time.Clock()

font = pygame.font.SysFont(None,25)

def snake(block_size,snakelist):
    for elements in snakelist:
        pygame.draw.rect(gameDisplay, green, [elements[0], elements[1],block_size,block_size])



def message_to_screen(msg,color):
    screen_text = font.render(msg, True, color)
    gameDisplay.blit(screen_text, [display_width/2, display_height/2])



def gameLoop():
    gameExit = False
    gameOver = False

    lead_x = display_width/2
    lead_y = display_height/2
    lead_x_change = 0
    lead_y_change = 0        


    randAppleX = round(random.randrange(0,display_width-block_size)/10.0)*10.0
    randAppleY = round(random.randrange(0,display_height-block_size)/10.0)*10.0



    while not gameExit:

        while gameOver == True:
            gameDisplay.fill(white)
            message_to_screen("Gamer over, press C to play again or Q to quit",red)
            pygame.display.update()

            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        gameExit = True
                        gameOver = False
                    if event.key == pygame.K_c:
                        gameLoop()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                gameExit = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    lead_x_change = -block_size
                    lead_y_change = 0
                elif event.key == pygame.K_RIGHT:
                    lead_x_change = block_size
                    lead_y_change = 0
                elif event.key == pygame.K_UP:
                    lead_y_change = -block_size
                    lead_x_change = 0
                elif event.key == pygame.K_DOWN:
                    lead_y_change = block_size
                    lead_x_change = 0

        if lead_x >= display_width:
            gameOver = True
        elif lead_x < 0:
            gameOver = True
        elif lead_y >= display_height:
            gameOver = True
        elif lead_y < 0:
            gameOver = True

        lead_x += lead_x_change

        lead_y += lead_y_change
        gameDisplay.fill(white)
        pygame.draw.rect(gameDisplay, red, [randAppleX,randAppleY,block_size,block_size])



        snakeHead = []
        snakeHead.append(lead_x)
        snakeHead.append(lead_y)
        snakeList.append(snakeHead)

        if len(snakeList) > snakeLength:
            del snakeList[0]

        snake(block_size, snakeList)



        pygame.display.update()

        if lead_x == randAppleX and lead_y == randAppleY:
            randAppleX = round(random.randrange(0,display_width-block_size)/10.0)*10
            randAppleY = round(random.randrange(0,display_height-block_size)/10.0)*10
            snakeLength += 1


        clock.tick(FPS)





    pygame.quit()
    quit()

gameLoop()

4 个答案:

答案 0 :(得分:2)

UnboundLocalError,表示您的变量未在函数范围内定义。

在游戏循环中添加

global snakeLength

示例:

>>> x = 10
>>> def foo():
...     x += 1        #here x is local to foo
... 
>>> foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in foo
 UnboundLocalError: local variable 'x' referenced before assignment

>>> def foo():
...     global x    # now x is global variable
...     x += 1
... 
>>> foo()
>>> x
11

答案 1 :(得分:1)

global snakeLength放在您引用snakeLength的函数中。

答案 2 :(得分:0)

您使用 snakeLength + = 1 将任何值分配给 snakeLengh

例如:

a + = 1

可以在 a 具有某些值时使用,例如a = 0或a = 10 ......等等

correct way

a = 0
a +=1

答案 3 :(得分:0)

你可以让它在游戏循环开始时起作用

global snakeLength

这表示变量在全局namescape中的python。在这里,您可以找到有关它的更多信息,并解释这可能无法作为脏补丁

的情况

http://eli.thegreenplace.net/2011/05/15/understanding-unboundlocalerror-in-python