为什么我的类更新函数不更新我的变量

时间:2021-02-01 15:03:02

标签: python pygame

import random, pygame


#window setup aswell as global variable
pygame.init()
screen_size = 400
global window
window = pygame.display.set_mode((screen_size,screen_size))
pygame.display.set_caption("evolution simulator")

pygame.display.update()
def draw_Grid():
    global Grid
    Grid = [[]]
    blockSize = 20
    for x in range(0,20):
        for y in range(0,20):
            Grid.append(1)
            rect = pygame.Rect(x*blockSize, y*blockSize,blockSize, blockSize)
            pygame.draw.rect(window,(0,0,0), rect, 1)
##draw_Grid()
##pygame.display.update()
class spurgs:
    def __init__(self,age,hunger,speed,gender):
        # 1 for male, 2 for female
        self.hunger = hunger
        self.speed = speed
        self.gender = gender
        self.age = age
    def update(self):
        #growing up
<块引用>

这里我正在设置它应该工作的变量,但它不是 ??!?

self.age = self.age + 1
        self.hunger -= 1
        if self.age > 10:
            self.speed += 1
        elif self.age >50:
            self.speed -= 1
    def eat(self):
        self.hunger +=1
        #remove some food  to affect global food resource
    def breed(self,mate):
        if mate.gender != self.gender:
            baby_gender = random.randint(1,2)
            baby = spugs(1,100,20,baby_gender)
    def draw(self,color,grid_coord_X,grid_coord_Y,size):
        pygame.draw.circle(window,color,(grid_coord_X,grid_coord_Y),size)
run = True  
while run:
    window.fill((0,200,255))
    draw_Grid()
    #QUIT CONDITION
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            print("closing the loop")
            run = False
    test_spurg = spurgs(10,100,1,2)
    test_spurg.draw((0,255,20),20,20,5)
    test_spurg.update()
    print(test_spurg.age)
<块引用>

这里我在 while 循环中使用更新函数,它应该在每次迭代时改变年龄,即无限

pygame.display.update()
pygame.quit()
<块引用>

如果有任何其他语法错误,或者我只是不遵守某些通用规则,请随时指出!

2 个答案:

答案 0 :(得分:1)

这是因为您在每次迭代中都在创建一个新对象。

我认为您只需要创建一个新对象并在 while 循环中使用它:

window.fill((0,200,255))
draw_Grid()
test_spurg = spurgs(10,100,1,2)
test_spurg.draw((0,255,20),20,20,5)
while run:
    #QUIT CONDITION
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            print("closing the loop")
            run = False
    test_spurg.update()
    print(test_spurg.age)

答案 1 :(得分:1)

实际上,属性的值是改变的,但由于你每帧创建一个新对象,它会不断地从初始值开始。

需要在应用循环之前创建对象的实例,但是需要在应用循环中绘制场景:

# create objects
test_spurg = spurgs(10,100,1,2)

run = True  
while run:
    # handle events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            print("closing the loop")
            run = False
    
    # update objects
    test_spurg.update()
    print(test_spurg.age)

    # draw scene
    window.fill((0,200,255))
    draw_Grid()
    test_spurg.draw((0,255,20),20,20,5)
    pygame.display.update()

对象是在应用程序循环之前创建的。在应用程序循环中,对象的属性,例如B. 它的位置不断变化,场景被重绘以反映变化。典型的 PyGame 应用程序循环必须:

相关问题