Seite 1 von 2

Algorithmus zur addierung von Punkten verrechnet sich ?

Verfasst: 04.10.2013 04:18
von True29
Hi ,
es geht um folgenden code unten.
er soll 100,00 punkte von Punkte_win zu punkte_show addieren und sie da dann subtrahieren. das ganze abhängig von ftime.
Das klappt auch so weit nur habe ich immer einen Rest ?

Grüße und danke für die Hilfe.

Code: Alles auswählen

Define Punkte_win.f = 10000 ;100 punkte
Define ftime.f,punkte_show.f,dwtime1,dwTime2


OpenWindow(0, 0, 0, 0, 0, "test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)

Debug Punkte_win

Repeat
    dwtime1 = ElapsedMilliseconds()   
    
   
    Punkte_win - Punkte_win * ftime      
    punkte_show + Punkte_win * fTime    
    
    Debug StrF(punkte_show/100,2)
    Debug StrF(punkte_win/100,2)
    
    If Punkte_win <= 0.0 ;//ende bei 0 dann sollten beide weete win und show auf 0 sein.
      Break 
    EndIf
    
    WindowEvent()
    Select WindowEvent()
      Case #PB_Event_CloseWindow
        End           
    EndSelect 
    
  dwTime2 = ElapsedMilliseconds() 
  ftime = (dwtime2 - dwtime1) / 1000.0     
 ForEver

Re: Algorithmus zur addierung von Punkten verrechnet sich ?

Verfasst: 04.10.2013 09:40
von CSHW89
Hab zwar nicht ganz verstanden, was du machen willst, aber die beiden Zeilen sollten vielleicht vertauscht werden:

Code: Alles auswählen

    Punkte_win - Punkte_win * ftime     
    punkte_show + Punkte_win * fTime   
Du benutzt in der zweiten Zeile den neuen Wert von 'Punkte_win' und nicht den alten.

lg Kevin

Edit: Ach und du verschlingst Events, da du (mindestens) zweimal WindowEvent() aufrufst. Bin mir nicht sicher, wie sich Select mit mehreren Cases verhalten würde, vielleicht dann sogar mehr als zweimal. Außerdem ist ein WindowEvent ohne Delay nicht gut für die CPU. Am besten so abändern:

Code: Alles auswählen

  ...
  event = WaitWindowEvent(10)
  Select event
  ...

Re: Algorithmus zur addierung von Punkten verrechnet sich ?

Verfasst: 04.10.2013 10:49
von STARGÅTE
Jup tauschen.

Denn in der erste Zeile änder sich ja Punkte_win und damit wird bei der zweiten Zeile weniger Addiert, als vorher subtrahiert.

Re: Algorithmus zur addierung von Punkten verrechnet sich ?

Verfasst: 04.10.2013 11:15
von Drago
Abgesehen von dem Vertauschen, bei mir wird Punkte_win zwar null, aber
die Prüfung auf Null wird nicht erkannt.
Und punkte_show wird dann auch nicht mehr hoch gezählt.

Re: Algorithmus zur addierung von Punkten verrechnet sich ?

Verfasst: 04.10.2013 12:10
von NicTheQuick
Das liegt dann an der Fließkommaungenauigkeit. Da kann man auch nichts dran ändern. Deswegen sollte man Fließkommazahlen nie auf einen bestimmten Wert prüfen, sondern immer auf einen Bereich.
Oder wenn man eh nur eine feste Anzahl Nachkommastellen nutzt wie z.B. bei Geld (Euro,Cent), dann sollte man Ganzzahlentypen holen und gleich in Cent rechnen statt in Euro.

Re: Algorithmus zur addierung von Punkten verrechnet sich ?

Verfasst: 04.10.2013 12:16
von True29
hm ok .

@NicTheQuick wie mache ich das dann , da ftime bei bei mir in float is wenn ich in ganzzahlentypen rechnen soll ?
Grüße.

Re: Algorithmus zur addierung von Punkten verrechnet sich ?

Verfasst: 04.10.2013 12:20
von NicTheQuick
Wenn es nicht anders geht, testest du am besten auf 'If Punkte_win <= 0.000001', damit es auch funktioniert, wenn die Punkte zwar aussehen wie 0, aber in Wirklichkeit noch ein klein bisschen höher sind.
Mit 'StrF(Punkte_win, 13)' siehst du vielleicht, woran es hakt.

Re: Algorithmus zur addierung von Punkten verrechnet sich ?

Verfasst: 04.10.2013 12:32
von True29
gibts eine möglichkeit mit runden zu Arbeiten oder ftime in int umzuwandel so das ich mit ganzezahlen arbeiten kann ?

Bis jetzt gibts leider noch keinen Lösungsvorschlag.
das vertauschen hilft leider nichts.

kann ja nich so schwer sein wenn punkte_win 100.00 hat diese zu punkte_show zu transferieren :(
Grüße.

Re: Algorithmus zur addierung von Punkten verrechnet sich ?

Verfasst: 04.10.2013 12:53
von CSHW89
Nun ja, selbst im mathematischen Sinn kann 'Punkte_win' nie 0 werden, da der Wert, den du subtrahierst immer kleiner ist als 'Punkte_win' selbst. 'ftime' ist ja im Normalfall immer kleiner 1. Also selbst, wenn Fließkommazahlen bis ins unendliche genau wäre, würde es so nicht funktionieren. Ist ein abnehmender Transfer überhaupt gewollt? Wenn nicht, warum nicht einfach so:

Code: Alles auswählen

    punkte_show + #TransferProSekunde * fTime   
    Punkte_win - #TransferProSekunde * ftime     
   
    Debug StrF(punkte_show/100,2)
    Debug StrF(punkte_win/100,2)
   
    If Punkte_win <= 0.0 ;//ende bei 0 dann sollten beide weete win und show auf 0 sein.
      Punkte_show = 10000
      Punkte_win = 0
      Break
    EndIf
... wobei die Konstante #TransferProSekunde noch gesetzt werden muss (z.B. 10000, dann würde der Transfer 1 Sekunde benötigen).

lg Kevin

Edit: Millisekunde -> Sekunde

Re: Algorithmus zur addierung von Punkten verrechnet sich ?

Verfasst: 04.10.2013 13:11
von NicTheQuick
Ich wollte gerade das selbe schreiben wie CSHW89. Hier ein vollständiger Code:

Code: Alles auswählen

EnableExplicit
Define Punkte_win.i = 10000 ;100 punkte
Define ftime.i,punkte_show.i,dwtime, diff.i

#TransfersProSekunde = 100


OpenWindow(0, 0, 0, 0, 0, "test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)

Debug Punkte_win

dwtime = ElapsedMilliseconds()
Repeat
	diff = #TransfersProSekunde * ftime / 1000
	Punkte_win - diff
	punkte_show + diff
	
	Debug StrF(punkte_show/100,2)
	Debug StrF(punkte_win/100,2)
	
	If Punkte_win <= 0 ;//ende bei 0 dann sollten beide weete win und show auf 0 sein.
		Break
	EndIf
	
	Select WaitWindowEvent(10)
		Case #PB_Event_CloseWindow
			End
		Case 0
			ftime = ElapsedMilliseconds() - dwtime
			dwtime + ftime
	EndSelect

ForEver