首页 > 解决方案 > 我试图制作一个允许我的精灵重新生成的函数,但它会创建无限量

问题描述

我做了一个类函数,一旦动物吃了足够的一组,就可以繁殖,从那里它会在那个位置创建一个新的精灵,然后它应该降低那个精灵的能量 Val,而不是这样做这反而会导致创建无限数量的精灵,从而导致程序变慢并崩溃。

这是我让它工作的功能

def checkEnergy(self):
        EnergyVal=self.energy
        return EnergyVal

    def reproduce(self,energy,Xpos,Ypos):
        if energy==10:
            prey = Prey(prey_image,Xpos,Ypos )
            all_sprites.add(prey)
            Rabbit_group.add(prey)
            self.energy-=4

这是我实现它的地方:

if len(carrots) > 0:
        for rabbit in Rabbit_group:
            movementx, movementy = Track(rabbit.x, carrots[0].x, rabbit.y, carrots[0].y)#how the prey move
            rabbit.move(movementx, movementy)
        energyval=prey.checkEnergy()
        rabbit.reproduce(energyval,600,700)

完整代码:

#simulates interactions of wild life
import math
import random
import pygame,sys 
import random
import pdb
from pygame.locals  import *


#classes--------------
class Animal(pygame.sprite.Sprite):#main class
    def __init__(self, image, x, y):
        super().__init__()
        self.x = x
        self.y = y
        self.image = image
        self.rect = self.image.get_rect(center = (x, y))
        self.Energy=10
        
    def move(self, mx, my):#moves the sprite
        self.x += mx
        self.y += my
        self.rect = self.image.get_rect(center = (self.x, self.y))#sets the image to the position

    def is_collided_with(self, sprite):#is the eat function
        return self.rect.colliderect(sprite.rect)
    
    def checkEnergy(self):
        EnergyVal=self.energy
        return EnergyVal

    def reproduce(self,energy,Xpos,Ypos):
        if energy==10:
            prey = Prey(prey_image,Xpos,Ypos )
            all_sprites.add(prey)
            Rabbit_group.add(prey)
            self.energy-=4
    
class Predator(Animal):#class for predators
    def __init__(self):
        image = pygame.image.load('Icon.png')
        self.energy=10
        super().__init__(image, 600, 700)

  
         
class Prey(Animal):
    """prey class"""
    def __init__(self, image, x, y):
        super().__init__(image, x, y)
        self.energy=10
        #self.rect = self.image.get_rect(center = (self.x, self.y))
        
   
        
   


class Carrot(pygame.sprite.Sprite):#food for prey class
    def __init__(self):
        super().__init__()
        self.x = 100
        self.y = 100
        self.image = pygame.image.load('carrot.png')
        self.rect = self.image.get_rect(center = (self.x, self.y))

# Functions-----------
def Track(AgressorX,DefenderX,AgressorY,DefenderY):#finds comapres X and Y, tells sprite how to move
    if AgressorX > DefenderX:
        XMovement=-1
    elif AgressorX< DefenderX:
        XMovement=1
    else:
        XMovement=0
        
    if AgressorY > DefenderY:
        YMovement=-1
    elif AgressorY < DefenderY: 
        YMovement=1
    else:
        YMovement=0
    return XMovement, YMovement

def leavingWindow(Xpos, Ypos):#boundry, keeps sprites in the window
    if Xpos<=0:
        return True
    elif Xpos>=950:
        return True   
    if Ypos<=0:
        return True
    elif Ypos>=750:
        return True

def Boundry(Xpos, Ypos):
    if Xpos<=0:
        Xmovement=0
    elif Xpos>=950:
        Xmovement=950
    else:
        Xmovement=+0
        
    if Ypos<=0:
        ymovement=0
    elif Ypos>=750:
        ymovement=60
    else:
        ymovement=+0
        
    return Xmovement, ymovement
    
  

pygame.init()#setsup pygame
screen = pygame.display.set_mode((1000,800))#setsup screen
clock = pygame.time.Clock()#tells program how fast to update

timmer = 1#how long program has gone on for
#setsup the classes
predator = Predator()
predator2=Predator()
#prey = Prey()
carrot = Carrot()
all_sprites = pygame.sprite.Group()
prey_image = pygame.image.load('Prey.png')


carrot_group = pygame.sprite.Group()
carrot_group.add(Carrot())

Wolf_group= pygame.sprite.Group()
Wolf_group.add(Predator())

Rabbit_group= pygame.sprite.Group()


for i in range(0, 2):
    prey = Prey(prey_image, 100 * i, 700)
    all_sprites.add(prey)
    Rabbit_group.add(prey)

#setsup the classes as sprites



all_sprites.add(carrot_group)
all_sprites.add(Wolf_group)
all_sprites.add(Rabbit_group)

#start of program
running=True
while running:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            running=False

    carrots = carrot_group.sprites()
    preys = Rabbit_group.sprites()
    predators = Wolf_group.sprites()

    if len(preys) > 0:
        for wolf in Wolf_group:
            movementx, movementy = Track(wolf.x, preys[0].x, wolf.y, preys[0].y)#how the predators move
            wolf.move(0,1)#movementx, #movementy)

            Leaving=leavingWindow(wolf.x,wolf.y)#keeps sprites in window
            if Leaving == True:
                movementx,movementy=Boundry(wolf.x,wolf.y)
                wolf.x=movementx
                wolf.y=movementy
    
    if len(carrots) > 0:
        for rabbit in Rabbit_group:
            movementx, movementy = Track(rabbit.x, carrots[0].x, rabbit.y, carrots[0].y)#how the prey move
            rabbit.move(movementx, movementy)
        energyval=prey.checkEnergy()
        rabbit.reproduce(energyval,600,700)

    screen.fill((0,128,0))#background
    all_sprites.draw(screen)#makes the sprites
    pygame.display.update()#updates screen
    timmer=timmer+1

    for carrot in carrots:#removes the carrots if they contact a rabbit
        for rabbit in Rabbit_group:
            if rabbit.is_collided_with(carrot):
                print('works')
                carrot.kill()

    for wolf in Wolf_group:
        for rabbit in Rabbit_group:
            if rabbit.is_collided_with(wolf):
                print("works 2")
                rabbit.kill()
    
    
pygame.quit()
exit()

在这里:

import pygame,sys 
import random
import pdb
from pygame.locals  import *

class Animal(pygame.sprite.Sprite):#main class
    def __init__(self, image, x, y):
        super().__init__()
        self.x = x
        self.y = y
        self.image = image
        self.rect = self.image.get_rect(center = (x, y))
        self.Energy=10
        
    def move(self, mx, my):#moves the sprite
        self.x += mx
        self.y += my
        self.rect = self.image.get_rect(center = (self.x, self.y))#sets the image to the position

    
    def checkEnergy(self):
        EnergyVal=self.energy
        return EnergyVal

    def reproduce(self,energy,Xpos,Ypos):
        if energy==10:
            prey = Prey(prey_image,Xpos,Ypos )
            all_sprites.add(prey)
            Rabbit_group.add(prey)
            self.energy-=4
         
class Prey(Animal):
    """prey class"""
    def __init__(self, image, x, y):
        super().__init__(image, x, y)
        self.energy=10
        #self.rect = self.image.get_rect(center = (self.x, self.y))

pygame.init()#setsup pygame
screen = pygame.display.set_mode((1000,800))#setsup screen
clock = pygame.time.Clock()#tells program how fast to update

timmer = 1#how long program has gone on for

prey_image = pygame.image.load('Prey.png')

Rabbit_group= pygame.sprite.Group()
all_sprites=pygame.sprite.Group()

for i in range(0, 2):
    prey = Prey(prey_image, 100 * i, 700)
    all_sprites.add(prey)
    Rabbit_group.add(prey)

#setsup the classes as sprites

all_sprites.add(Rabbit_group)

#start of program
running=True
while running:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            running=False
            
    preys = Rabbit_group.sprites()
    
    for rabbit in Rabbit_group:     
        rabbit.move(0, -1)
    energyval=prey.checkEnergy()
    rabbit.reproduce(energyval,600,700)

    screen.fill((0,128,0))#background
    all_sprites.draw(screen)#makes the sprites
    pygame.display.update()#updates screen
    timmer=timmer+1

pygame.quit()
exit()

我很确定问题是self.energy-=4我认为它不能正常工作,但我不确定如何解决它。

标签: pythonpygame

解决方案


我创建了一个类函数,一旦动物吃饱了一组动物,它们就可以繁殖 [...]

您在错误的地方进行评估。

    if len(carrots) > 0:
        for rabbit in Rabbit_group:
            movementx, movementy = Track(rabbit.x, carrots[0].x, rabbit.y, carrots[0].y)#how the prey move
            rabbit.move(movementx, movementy)
        # energyval=prey.checkEnergy()        <--- DELETE
        # rabbit.reproduce(energyval,600,700) <--- DELETE

当兔子吃胡萝卜时增加能量。如果能量达到阈值,则再现兔子:

class Animal(pygame.sprite.Sprite):#main class
    # [...]

    def reproduce(self):
        if self.energy >= 10:
            prey = Prey(self.image, self.x, self.y)
            all_sprites.add(prey)
            Rabbit_group.add(prey)
            self.energy -= 4
while running:
    # [...]

    for carrot in carrots:#removes the carrots if they contact a rabbit
        for rabbit in Rabbit_group:
            if rabbit.is_collided_with(carrot):
                print('works')
                carrot.kill()

                rabbit.energy += 1
                rabbit.reproduce()

推荐阅读