2016-10-22 2 views
-1

Ich habe eine Klasse und darin habe ich eine Methode, die eine Schleife enthält. Ich möchte eine Anweisung milliseconds = 0 nur einmal an der Spitze ausführen können.Wie Wert von einer Anweisung nur einmal in Python erhalten

Allerdings, wenn ich den beigefügten Code ausführen, wird es auf 0 zurückgesetzt. Dann was ich will ist, so dass die Millisekunden mit einer Rate von 200 jedes Mal erhöht werden können, wenn durchläuft. Ich habe versucht, die milliseconds = 0 unter der Klasse oder außerhalb der Klasse und es funktioniert nicht. Was kann ich tun?

EDIT: meine neue Frage, wie kann ich es so machen, dass Python bis 5000 Millisekunden vor dem Fortschreiten zum nächsten Stück Code zählen kann.

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 
+0

Sollte Ihr 'if' Aussagen innerhalb der Funktion sein? Innerhalb von 'flagrun' erzeugt' Millisekunden = 0' eine lokale Variable. – cdarke

+0

Was hast du getan, um es "unter die Klasse oder außerhalb der Klasse" zu bringen, das nicht funktioniert hat? – TWReever

+0

Wo ist die Schleife? Scheint der Code ist unvollständig. Und wie @cdarke sagt, setzen Sie Millisekunden in die Funktion, also ist es eine lokale Variable. – Flickerlight

Antwort

0

Ich denke, dass Sie eine gemeinsame Variable für mehrere Klassenobjekte benötigen, die Sie erstellen möchten.

Hinweis: Ich ändere nicht Ihre Code-Logik, ich aktualisiere nur den Code, um die Variable Millisekunden für jedes Objekt der Klasse Flag wiederzuverwenden.

Code:

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 
+0

ein "Tippfehler" - Sie brauchen 'self.milliseconds' statt' milliseconds' in allen 'Flagrun' – furas

+0

Klasse Flag(): _shared_state = {} Millisekunden = 0 def __init __ (self): Selbst. __dict__ = self._shared_state def Flagrun (Selbst-): flagactive = Millisekunden 'Nein' = 0 flaggen = str (randint (1,4)) Millisekunden + = 200 print (Millisekunden) wenn Millisekunden> 1000: wenn Flaggen == '1': Fenster.blit (flag, (58,89)) collisionsdet() flagactive = 'Ja' Millisekunden = 0 –

+0

das war ein Fehler. Hoppla. kranker Posten in der normalen antwortenden Sache. –

0

(Sie wirklich eine neue Frage auf einen neuen Beitrag fragen sollen)

Wenn Sie nicht über egal was das Programm macht, und Sie wollen es nur zu warten Sie 5 Sekunden, dann können Sie import time und dann time.sleep(5) verwenden. Dies wird das Programm für fünf Sekunden deaktivieren, was wahrscheinlich nicht das ist, was Sie wollen.

Wenn Sie nur einen wenig Zähler machen wollen, dass das Programm fortgesetzt, nachdem es 5000 trifft, haben Sie zwei Möglichkeiten:

while milliseconds < 5000: 
    milliseconds += 1 

Nach Millisekunden Hits 5000 oder mehr, es wird nur die Schleife verlassen und weiter auf .

Wenn Sie etwas haben wollen, da sonst die Millisekunden Variable erhöhen, dann haben nur jede Schleife, die was auch immer erhöht Millisekunden enthält, und dies tun:

while stuff_happens: 
    # somehow increase milliseconds 

    if milliseconds >= 5000: 
     break 


# then more code can run 
+0

Die while-Anweisung wartet jedoch nicht auf 5000 Millisekunden. Die while-Schleife wird je nach Computer mit unterschiedlichen Geschwindigkeiten ausgeführt. Mein Computer hat den Code in weniger als 1 Millisekunde abgeschlossen. Was Sie suchen ist etwas wie 'last = time.time(); während time.time() - last <5; weiter ". Obwohl dies wahrscheinlich nicht das Beste ist, da es während der While-Schleife viel Prozessorleistung verbraucht. Sie sollten wahrscheinlich ein 'time.sleep (x)' darin einfügen, aber das würde seine Genauigkeit verringern. –

+0

Ich habe schon versucht, time.sleep, aber es stoppt den gesamten Code, der nicht das ist, was ich will. Ich werde das While-Loop-Ding versuchen, wenn ich eine Chance bekomme, aber wie Nort gesagt, wird es in weniger als einer Millisekunde enden. Ich brauche einen aktuellen Millisekunden-Timer. –

+0

ok, also habe ich versucht, während miliseconds ist weniger als 5000, erhöhen sie um 1. so dass es technisch funktioniert und es dauert eine ziemlich lange Zeit für es zu 5000 zu bekommen, aber es ist aus irgendeinem Grund das gesamte Spiel einfrieren. Wenn ich das Spiel starte, wartet es darauf, dass es 5000 erreicht, bevor es zum nächsten Stück Code weitergeht, wo es wieder wartet. Gibt es eine Möglichkeit, dies zu beheben, so dass nur dieser Codeabschnitt auf den Fortschritt wartet. Danke noch einmal. –

Verwandte Themen