Как получить значение из инструкции только один раз в Python

#python #function #class #pygame

#python #функция #класс #pygame

Вопрос:

У меня есть класс, и внутри него у меня есть метод, в котором есть цикл. Что я хочу иметь возможность делать, так это запускать инструкцию 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
  

Комментарии:

1. Должны ли ваши if инструкции находиться внутри функции? Внутри flagrun , milliseconds=0 создает локальную переменную.

2. Что вы сделали, чтобы поместить это «под класс или вне класса», что не сработало?

3. Где находится цикл? Кажется, код неполный. И, как сказал @cdarke, вы вкладываете в функцию миллисекунды, поэтому это локальная переменная.

4. используйте self.miliseconds во всем коде и установите self.miliseconds = 0 в __init__

5. я попробовал self.milliseconds все еще не работает.

Ответ №1:

Я думаю, вам нужна общая переменная для нескольких объектов класса, которые вы хотите создать.

Примечание: Я не меняю логику вашего кода, я просто обновляю код, чтобы повторно использовать переменную milliseconds для каждого объекта класса 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
  

Комментарии:

1. одна «опечатка» — вам нужно self.milliseconds вместо milliseconds во всех Flagrun

2. 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 печать (миллисекунды), если миллисекунды > 1000: если flaggen == ‘1’ : window.blit(флаг, (58,89)) collisiondet() flagactive = ‘Да’ миллисекунды = 0

3. это была ошибка. упс. я отправлю сообщение в обычном ответе.

4. как я могу удалить комментарии

5. РЕДАКТИРОВАТЬ: мой новый вопрос, как я могу сделать так, чтобы python мог считать до 5000 миллисекунд, прежде чем перейти к следующему фрагменту кода.

Ответ №2:

(Вам действительно следует задать новый вопрос в новом сообщении)

Если вас не волнует, что делает программа, и вы просто хотите, чтобы она подождала 5 секунд, тогда вы можете import time использовать time.sleep(5) . Это деактивирует программу на пять секунд, что, вероятно, не то, что вы хотите.

Если вы просто хотите создать небольшой счетчик, который продолжит работу программы после достижения 5000, у вас есть два варианта:

 while milliseconds < 5000:
    milliseconds  = 1
  

После того, как миллисекунды достигнут 5000 или более, он просто завершит цикл и продолжит работу.

Если вы хотите, чтобы что-то еще увеличивало переменную milliseconds, тогда просто создайте любой цикл, который содержит все, что увеличивает миллисекунды, и сделайте это:

 while stuff_happens:
    # somehow increase milliseconds

    if milliseconds >= 5000:
        break


# then more code can run
  

Комментарии:

1. Однако эта while-инструкция не будет ждать 5000 миллисекунд. Цикл while выполняется с разной скоростью в зависимости от компьютера. Мой компьютер завершил код менее чем за 1 миллисекунду. То, что вы ищете, это что-то вроде last = time.time(); while time.time() - last < 5; continue . Хотя, это, пожалуй, не самая лучшая причина, поскольку это потребляет много мощности процессора во время цикла while. Вероятно, вам следует вставить в нее time.sleep(x) , но это снизило бы ее точность.

2. Я уже пробовал time.sleep, но это останавливает весь код, который не является тем, что я хочу. Я попробую использовать этот цикл while, когда у меня будет возможность, но, как сказал норт, он просто завершится менее чем за миллисекунду. Мне нужен реальный таймер в миллисекунду.

3. хорошо, итак, я попробовал, если значение в миллисекундах меньше 5000, увеличить его на 1. технически это работает, и для достижения 5000 требуется достаточное количество времени, но по какой-то причине вся игра зависает. когда я запускаю игру, она ожидает, пока оно достигнет 5000, прежде чем перейти к следующему фрагменту кода, где оно снова ожидает. есть ли способ исправить это, чтобы только этот блок кода ожидал выполнения. еще раз спасибо.

4. Не могли бы вы показать код, который, похоже, не работает? Кроме того, к сожалению, python будет запускать только один блок кода за раз. Есть способы обойти это, но важно знать. Если одна часть обрабатывается медленно, другие части также будут работать медленно, если они выполняются в том же цикле.

5. что бы вы хотели, чтобы я сделал? сообщение находится в вопросе, но я все еще застрял в том же месте. Спасибо