程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

在方法中初始化的对象不会与其他对象发生冲突

发布于2022-11-13 16:16     阅读(1077)     评论(0)     点赞(8)     收藏(1)


我正在创建一个代表变形虫进化的模拟。它们由在画布上移动的红色方块表示。如果它们发生碰撞,它们就会产生后代。进化带有一个称为成熟速度的数量。变形虫只有在达到一定年龄后才能繁殖,而它们年龄增长的速度取决于它们的成熟速度,这会遗传给后代(有一些随机突变的机会)。这是我的代码:

import pygame
import random
import time
import itertools

from pygame.locals import (
    QUIT
)

pygame.init()

SCREEN_WIDTH = 500
SCREEN_HEIGHT = 500

screen = pygame.display.set_mode([500, 500])

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

idList = []

mutationConstant = 100

class Amoeba(pygame.sprite.Sprite):
    
    id_iter = itertools.count()
    
    def __init__(self, maturingSpeed, x, y):
        super(Amoeba, self).__init__()
        self.id = 'amoeba' + str(next(Amoeba.id_iter))
        idList.append(self.id)
        self.surf = pygame.Surface((10,10))
        if maturingSpeed <= 0:
            maturingSpeed = 1
        elif maturingSpeed >= 255:
            maturingSpeed = 254
        self.surf.fill((maturingSpeed, 0, 0))
        self.rect = self.surf.get_rect(
            center=(
                x,
                y,
            )
        )
        self.speed = 2
        self.age = 1
        self.maturingSpeed = int(maturingSpeed)
        self.life = 20000

        
    def update(self):
        if self.rect.left <= 0:
            direction = 1
        elif self.rect.right >= SCREEN_WIDTH:
            direction = 2
        elif self.rect.top <= 0:
            direction = 3
        elif self.rect.bottom >= SCREEN_HEIGHT:
            direction = 4
        else:
            direction = random.randint(1, 4)
            
        if direction == 1:
            self.rect.move_ip(self.speed, 0)
        elif direction == 2:
            self.rect.move_ip(-self.speed, 0)
        elif direction == 3:
            self.rect.move_ip(0, self.speed)
        elif direction == 4:
            self.rect.move_ip(0, -self.speed)

        self.life = self.life - 1
        if self.life == 0:
            self.kill()

        modMaturingSpeed = self.maturingSpeed / 124
        self.age = self.age + 1 * modMaturingSpeed
            

    def collide(self):
        global posList
        posList = [[amoeba.rect.left, amoeba.rect.bottom] for amoeba in amoebas]
        length = len(posList)
        
        for i in range(length):
          for amoeba in amoebas:
              if amoeba.id == str(idList[i]):
                  ageOne = getattr(amoeba, 'age')
                  
                  for h in range(i+1, length):
                      for amoeba in amoebas:
                          if amoeba.id == str(idList[h]):
                              ageTwo = getattr(amoeba, 'age')

                              OneX = int(posList[i][0])
                              OneY = int(posList[i][1])
                              TwoX = int(posList[h][0])
                              TwoY = int(posList[h][1])

                              if ageOne >= 100 and ageTwo >= 100:
                                  if (OneX < TwoX + 10 and OneX + 10 > TwoX
                                      and OneY < TwoY + 10 and 10 + OneY > TwoY):
                                      
                                      for amoeba in amoebas:
                                          if amoeba.id == str(idList[i]):
                                              setattr(amoeba, 'age', 1)
                                              pOMSinitial = int(getattr(amoeba, 'maturingSpeed'))
                                                  
                                      for amoeba in amoebas:
                                            if amoeba.id == str(idList[h]):
                                                setattr(amoeba, 'age', 1)
                                                pTMSinitial = int(getattr(amoeba, 'maturingSpeed'))
                                        
                                      locationX = OneX + random.randint(-10, 10)
                                      locationY = OneY + random.randint(-10, 10)
                                      if pOMSinitial >= pTMSinitial:
                                            pOMSfinal = pOMSinitial + mutationConstant
                                            pTMSfinal = pTMSinitial - mutationConstant
                                            newMaturingSpeed = random.randint(pTMSfinal, pOMSfinal)
                                            print(newMaturingSpeed)
                                      else:
                                            pOMSfinal = pOMSinitial - mutationConstant
                                            pTMSfinal = pTMSinitial + mutationConstant
                                            newMaturingSpeed = random.randint(pOMSfinal, pTMSfinal)
                                            print(newMaturingSpeed)
                                          
                                      amoebaname = Amoeba(newMaturingSpeed, locationX, locationY)
                                      amoebas.add(amoebaname)
                                      all_sprites.add(amoebaname)

screen.fill((255, 255, 255))

for i in range(5):
        amoebaname = Amoeba(random.randint(100, 150), random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT))
        amoebas.add(amoebaname)
        all_sprites.add(amoebaname)

p = 0
while True:
    ageArray = [amoeba.age for amoeba in amoebas]
    
    if p == 1000:
        print(amoebas)
        p = 0
    else:
        p = p + 1

    time.sleep(0.00001)
    screen.fill((255, 255, 255))
    
    for event in pygame.event.get():
        if event.type == QUIT:
            break
        
    amoebas.update()
    a = Amoeba(1, 1, 1)
    a.collide()

        

    for entity in all_sprites:
        screen.blit(entity.surf, entity.rect)
        
    pygame.display.flip()
    

pygame.quit()

对不起,它比较长。程序中的一切工作正常,除了后代似乎由于某种原因没有繁殖,这意味着一旦原件死亡,什么都不会发生。

我的问题如此含糊的原因是我真的不明白问题可能是什么 - 原始变形虫的类与后代的类相同,并且程序没有抛出任何错误消息。


解决方案


暂无回答



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/1847018/2a57ba2e97895317818c/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

8 0
收藏该文
已收藏

评论内容:(最多支持255个字符)