我有一个类,以不同的变体初始化相同单词的填充,然后随着时间的推移将字母重新排列为所需单词。在pygame中,我试图将当前单词显示在屏幕上,然后根据班级的实时变化进行更改。我面临的问题是能够同时调用课程并更新屏幕。
有人告诉我,我应该使用生成器并产生变化,然后返回主循环,但是由于我的Population
类在它的while循环内完成了所有工作,因此这不起作用__init__
。
我该如何产生当前的变化,我想在主循环中将变白的文本更改到屏幕上?
代码:
class Population:
def __init__(self, size):
...
while variation.fitness < len(target): # unknown amount of variations
self.selection() # restarts selection process
...
pg.init()
top = ''
...
while not done:
...
if event.key == pg.K_RETURN:
Population(1000)
top = # I want to make this variable be the current variation within Popualtion
...
top_sentence = font.render((top), 1, pg.Color('blue'))
screen.blit(top_sentence, (400,400))
答案 0 :(得分:1)
为什么您要在循环中连续创建一个新的Population
对象?这是一个类,因此您可以添加接口(方法)以与对象进行通信以及提交和检索数据。语句self.selection()
不必在类的方法中,而不必在构造函数中。请参阅Classes的概念。
创建一个方法(例如NextVariation
),该方法只对self.selection()
进行一次调用,而不是在循环中进行多个“选择”。该方法返回当前变化。该方法不需要内部循环,因为它在主应用程序循环中被连续调用:
class Population:
def __init__(self, size):
self.size = size
# [...]
def SetTarget(self, target):
self.target = target
def NextVariation(self):
if variation.fitness < len(self.target): # unknown amount of variations
self.selection() # restarts selection process
return variation # return current variation
population = Population(1000)
top = ''
while not done:
# [...]
if event.key == pg.K_RETURN:
population.SetTarget(...)
top = population.NextVariation()
# [...]
top_sentence = font.render((top), 1, pg.Color('blue'))
screen.blit(top_sentence, (400,400))
这也可以与yield
进行迭代的迭代器一起使用,如上一个问题的答案Update text in real time by calling two functions Pygame
注意,或者,当按下 return 时,甚至可以创建该类的新实例。但是,这取决于您的需要,是需要创建一个新的对象并重新启动该过程,还是只想更改该过程的参数:
population = Population(1000)
top = ''
while not done:
# [...]
if event.key == pg.K_RETURN:
population = Population(...)
top = population.NextVariation()
# [...]
top_sentence = font.render((top), 1, pg.Color('blue'))
screen.blit(top_sentence, (400,400))