【问题标题】:How to get value from a statement only once in Python如何在 Python 中只从语句中获取一次值
【发布时间】:2016-10-22 05:22:55
【问题描述】:

我有一个类,其中我有一个方法,其中有一个循环。我想要做的是在顶部只运行一次声明milliseconds = 0

但是,当我运行附加的代码时,它会一直重置为 0。然后我想要的是,如果通过,毫秒可以以每次 200 的速度增加。我尝试将milliseconds = 0 放在课堂下或课堂外,但它不起作用。我能做些什么?

编辑:我的新问题,我怎样才能使 Python 可以计数到 5000 毫秒,然后再进行下一段代码。

class Flag():
    def Flagrun(self):
        flagactive = 'No'
        milliseconds = 0
        flaggen = str(randint(1,4))
        milliseconds += 200
        print(milliseconds)

    if milliseconds > 1000:
        if flaggen == '1':
            window.blit(flag, (58,89))
            collisiondet()
            flagactive = 'Yes'
            milliseconds = 0

        elif flaggen == '2':
            window.blit(flag, (464,82))
            collisiondet()
            flagactive = 'Yes'
            milliseconds = 0 

        elif flaggen == '3':
            window.blit(flag, (343,215))
            collisiondet()
            flagactive = 'Yes'
            milliseconds = 0 

        elif flaggen == '4':
            window.blit(flag, (66,535))
            collisiondet()
            flagactive = 'Yes'
            milliseconds = 0

【问题讨论】:

  • 您的if 语句应该在函数内部吗?在flagrun 内部,milliseconds=0 创建了一个局部变量。
  • 你做了什么把它放在“课下或课外”不起作用?
  • 循环在哪里?似乎代码不完整。正如@cdarke 所说,您将毫秒放入函数中,因此它是一个局部变量。
  • 在所有代码中使用self.miliseconds并在__init__中设置self.miliseconds = 0
  • 我试过 self.milliseconds 还是不行。

标签: python function class pygame


【解决方案1】:

我认为您需要为要创建的多个类对象使用共享变量。

注意:我没有更改您的代码逻辑,我只是​​更新代码以重新利用 Flag 类的每个对象上的变量毫秒。

代码:

class Flag():

_shared_state = {}
milliseconds = 0

def __init__(self):
    self.__dict__ = self._shared_state


def Flagrun(self):
    flagactive = 'No'
    flaggen = str(randint(1,4))
    self.milliseconds += 200
    print(milliseconds)

    if milliseconds > 1000:
        if flaggen == '1':
            window.blit(flag, (58,89))
            collisiondet()
            flagactive = 'Yes'
            milliseconds = 0


        elif flaggen == '2':
            window.blit(flag, (464,82))
            collisiondet()
            flagactive = 'Yes'
            milliseconds = 0


        elif flaggen == '3':
            window.blit(flag, (343,215))
            collisiondet()
            flagactive = 'Yes'
            milliseconds = 0


        elif flaggen == '4':
            window.blit(flag, (66,535))
            collisiondet()
            flagactive = 'Yes'
            milliseconds = 0

【讨论】:

  • 一个“错字” - 你需要self.milliseconds 而不是milliseconds 在所有Flagrun
  • class Flag(): _shared_state = {} 毫秒 = 0 def init__(self): self.__dict = self._shared_state def Flagrun(self): flagactive = 'No ' 毫秒 = 0 flaggen = str(randint(1,4)) 毫秒 += 200 print(milliseconds) 如果毫秒 > 1000: 如果 flaggen == '1': window.blit(flag, (58,89)) collisiondet( ) flagactive = 'Yes' 毫秒 = 0
  • 那是个错误。哎呀。不适张贴在正常的回答中。
  • 如何删除 cmets
  • 编辑:我的新问题,我怎样才能让它在进入下一段代码之前让 python 可以计数到 5000 毫秒。
【解决方案2】:

(你真的应该在新帖子上问一个新问题)

如果您不关心程序的作用,只想让它等待 5 秒,那么您可以 import time 然后使用 time.sleep(5)。这将使程序停用五秒钟,这可能不是您想要的。

如果您只想制作一个小计数器,让程序在达到 5000 后继续执行,您有两种选择:

while milliseconds < 5000:
    milliseconds += 1

毫秒数达到 5000 或更多后,它将退出循环并继续。

如果你想让其他东西增加毫秒变量,那么只要有任何包含增加毫秒的循环,然后执行以下操作:

while stuff_happens:
    # somehow increase milliseconds

    if milliseconds >= 5000:
        break


# then more code can run

【讨论】:

  • 虽然该 while 语句不会等待 5000 毫秒。 while 循环以不同的速度执行,具体取决于计算机。我的电脑在不到 1 毫秒的时间内完成了代码。您要查找的内容类似于 last = time.time(); while time.time() - last &lt; 5; continue。虽然,这可能不是最好的原因,因为它会在 while 循环期间消耗大量处理器能力。您可能应该在其中输入time.sleep(x),但这会降低其准确性。
  • 我已经尝试过 time.sleep 但它会停止整个代码,这不是我想要的。当我有机会时,我会尝试使用 while 循环,但就像 nort 说的那样,它会在不到一毫秒的时间内完成。我需要一个实际的毫秒计时器。
  • 好的,所以我尝试了当毫秒小于 5000 时,将其增加 1。所以它在技术上有效,它确实需要相当长的时间才能达到 5000,但它正在冻结整个游戏出于某种原因。当我启动游戏时,它正在等待它达到 5000,然后再继续等待下一段代码。有没有办法解决这个问题,所以只有那个代码块正在等待进展。再次感谢。
  • 你能显示似乎不起作用的代码吗?此外,不幸的是,python 一次只能运行一个代码块。有很多方法可以解决它,但知道这一点很重要。如果一个部分的处理速度很慢,那么如果它们在同一个循环中运行,其他部分也会变慢。
  • 你想让我做什么?帖子有问题,但我仍然卡在同一个地方。谢谢
猜你喜欢
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多