2016-10-21 4 views
-4

Ich habe einige Probleme in meiner Pygame-Anwendung, die ich mache. Es gibt Schaltflächen im Menü, die ändern, wie schnell meine Simulation läuft (indem Sie speed in clock.tick(speed*10) ändern). Dies verlangsamt jedoch auch die Geschwindigkeit, mit der die Menütasten reagieren. Wenn ich den Wert speed irgendwo niedriger als 0,5 festlege, dauert die Geschwindigkeits- und Wiedergabe/Pause-Taste bis zu fünf Sekunden, um einen Klick zu registrieren. Also habe ich versucht, meinen eigenen Weg zu schaffen, dies zu umgehen:Wie man Kehrwert eines float in Python

speed = 1 # defined previously ingame 

timeSlow = 0 
timeSlowGoal = 0 

while True: # game loop 

    if speed < 1: 

     timeSlowGoal = reciprocal(speed) # well here's my problem 

    else: 
     timeSlowGoal = -1 

    if timeSlowGoal != -1: 

     if timeSlow >= timeSlowGoal: 
      timeSlow = 0 
      # more code that actually does stuff 

     else: 
      timeSlow += 1 
      # doesn't match, try again 

In Python gibt es Tricks wie int(), string() und float() eine Variable zu ändern. Natürlich funktioniert reciprocal() nicht. Gibt es irgendeine Art von Funktion wie diese, die das Reziproke einer Zahl bekommt (was in diesem Fall immer eine Dezimalzahl ist) oder muss ich nur ein paar schlaue Mathe machen, um es zu bekommen?

(natürlich, wenn all dies ist nicht erforderlich, und Sie haben eine bessere Lösung für mein erstes Problem lassen Sie mich wissen)


EDIT: Okay, gibt es eine sehr einfache Lösung für dieses, dass ich übersehen. 1/n ist immer der reziproke von n. Es gibt keine reziproke() Funktion, weil es so einfach ist. Das ist, was ich bekomme, wenn ich Mathe in der Grundschule vergesse.

+2

Durch gegenseitige, tun Sie 1/n bedeuten? – jatinderjit

+0

@jatinderjit Ja, das ist ein reziproker Wert von n wenn n eine ganze Zahl ist. Das ist einfach. Was ich brauche, ist ein Weg, um 2 von 1/2, 4 von 1/4 usw. zu bekommen. – NoRt9001

+0

Nein, 1/n ist immer der Kehrwert (unabhängig davon, ob n ganzzahlig oder sogar irrational ist). 1/(1/2) ist 2. – jatinderjit

Antwort

1

Sie verwenden Python Unter der Annahme, 3, ändern

timeSlowGoal = reciprocal(speed)

zu

timeSlowGoal = 1/speed

nur sicherstellen, dass Sie nicht versuchen, das zu tun, wenn die Geschwindigkeit Null ist.

1

Ich weiß nicht, warum du so ein großes Stück Code haben, weil Reciprocal of a number einfach wie erwähnt:

def reciprocal(n): 
    return 1.0/n 

: 1/n

So, Ihre reciprocal Funktion kann einfach geschrieben werden als Hier verwende ich 1.0/n statt 1/n wie in Python für die Resultierende Division zu Bruch sein, entweder Zähler oder Nenner sollte fracti haben auf Wert.

Probelauf:

>>> reciprocal(3) 
0.3333333333333333 
>>> reciprocal(0.3333333) 
3.00000030000003 # Not '3' because of the loss in the precision of value entered 
>>> reciprocal(reciprocal(3)) 
3.0 # Doing reciprocal twice returns "3" 
+0

Ich nehme an, dass die zweite Antwort nicht 3 zurückgibt, weil Ihre Eingabe nicht für immer 3 wiederholt (oder zumindest bis Python egal ist). Danke für deine Antwort. – NoRt9001

+0

@ NoRt9001: Wenn Sie Brüche wie '1/3',' 1/6' als Dezimalzahlen schreiben, gibt es immer etwas Genauigkeitsverlust. Wenn Sie sie erneut invertieren, ist der Unterschied im ursprünglichen Wert auf den Verlust der Genauigkeit im vorherigen Schritt zurückzuführen. –

+1

Ich würde das verwenden und auch die 'round()' Funktion einbauen, falls die Genauigkeit später ein Faktor für die Variable sein könnte. – maze88