Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

23.04.2014, 03:07

Banales Problem mit Variablen

Hey,

es geht um ein mathematisch-logisches Problem. Es geht um meinen Racing Manager. Ich versuch`s so unkompliziert wie möglich:

Reifenabrieb = x * y * Runden

x ist eine Konstante, y eine Variable, die sich während des Rennens verändert. Das Problem ist nun, dass sich der ganze "Reifenabrieb" verändert, auch der für die Vergangenheit, wenn ich an der Variable schraube. Das darf allerdings nicht sein, denn der Reifenabrieb, der bis dato geschehen ist, soll auch bleiben. Ändern soll die Variable nur den Reifenabrieb für die Zukunft bzw. bis die Variable wieder geändert wird.

Ich komme einfach nicht weiter. Ich habe überlegt, ob ich eine Art Durchschnitt von y errechnen soll und mit dem arbeiten soll, aber dazu brauche ich dann wohl dutzende wenn nicht hunderte von Termen. Eine andere Möglichkeit wäre bei jeder Änderung von y den Wert, den die Gleichung bis dahin angenommen hat zu speichern und am Ende alle miteinander zu addieren. Allerdings verzweifle ich auch an dieser Stelle, da ich dann (je nach dem wie oft ich y änder) bei einer Unzahl von Termen rauskomme.

Gibt es vielleicht noch einen einfacheren, eleganteren Weg, den ich nicht sehe?


Danke im Voraus!

2

23.04.2014, 03:48

Was ist y? Wie ändert es sich?
Dein Problem ist, dass du eine Funktion hast, die jedoch, bedingt durch y, einen oder mehrere Wendepunkte hat, richtig?

MfG
Check

3

23.04.2014, 03:55

So könnte man es sagen. Na ja die ganze Formel ist recht komplex, deshalb habe ich es heruntergebrochen. Sagen wir einfach: y kann die Werte 1-5 annehmen.

4

23.04.2014, 04:00

Wenns nur 1 bis 5 wäre, dann wärs doch immer steigend. ^^
Wie dem auch sei, an könnte das natürlich ein wenig oder sehr viel "smoothen", aber im Endeffekt könnte dies u.U. auch nicht funktionieren, kommt ganz drauf an wie die Werte fallen.
Ansonsten könntest du dir doch auch den momentan höchsten Abrieb merken und, statt den gesamten Abrieb immer neu zu berechnen, immer drauf addieren. Wenn es dann negativ wird ersetzt dus Ergebnis der Funktion einfach mit 0.
Ansonsten probier doch einfach mal deine Ideen, die Nacht ist noch jung und vielleicht funktioniert 's ja mindestens in den allermeisten Fällen.

MfG
Check

5

23.04.2014, 14:24

Na ja ich hänge schon seit 3 Tagen an dem Problem und ich bin mir sicher, dass es eine recht einfache Lösung gibt. Ich finde sie nur nicht (bin auch eigentlich kein gelernter Programmierer).

Ne weil wenn der Startwert von y 3 wäre, würde es auch nach unten rutschen. Aber das ist auch egal, denn selbst ein "verrutschen" nach oben wäre mathematisch gesehen falsch: Der Reifenabrieb von davor, als y noch 1 war, muss dennoch der gleiche bleiben und kann sich nicht für die ganze Zukunft nach oben verschieben.

Ja die Idee mit dem addieren hatte ich (wie geschrieben) ja auch, nur habe ich dann das Problem, dass ich zu viele Gleichungen brauche - für jedes Mal y Veränderung eine neue.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

23.04.2014, 14:29

Du brauchst nicht mehrere Gleichungen, Du brauchst nur eine zusätzliche Variable und musst bei jeder Änderung des Abriebfaktors den alten Wert in dieser Variable ablegen und auf Deine Funktion aufrechnen, die wieder bei 0 beginnt.
Zahlenbeispiel:

2 Runden mit Abrieb 4:
d = 0
R = 2*4*x;

Änderung auf Abrieb 5 für 3 Runden:
d += R
R = d + 3*5*x;

Änderung auf Abrieb 1 für 2 Runden:
d += R
R = d + 2*1*x;

Bei x = 1 kommt also nach diesen 7 Runden raus:
2*4*x + 3*5*x + 2*1*x

Du stückelst quasi Deine kontinuierliche Funktion in mehrere Teilfunktionen, deren Zeitstempel Du bei jeder Änderung mit 0 startest und den Wert der vorherigen Funktion als Konstante hinzu addierst.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

23.04.2014, 15:11

Das sieht sehr gut aus, ich fummel mal ein bisschen und sag bescheid, obs funktioniert hat. Danke schon mal für eure Mühen!

8

25.04.2014, 03:33

Ach man ich bin so nah dran. Ich habe versucht deine Idee mit der Konstanten umzusetzen, scheiter aber seit 2 weiteren Tagen an der Umsetzung:

TyreUse = ((object0.path_position-global.Path2)*TyreSave //Grundformel

if(position_meeting(mouse_x,mouse_y,object7)) || (position_meeting(mouse_x,mouse_y,object8)) { //wenn "TyreSave" geändert wird (Variable, die den Reifenabrieb beeinflusst)
if(mouse_check_button_pressed(mb_left)) || (mouse_check_button_pressed(mb_left)) {
TyreUse2 = TyreUse //aktueller TyreUse-Wert wird in einer neuen Variable "gesichert"
TyreUse3 += TyreUse2 //gesicherter TyreUse-Wert wird bei jeder Veränderung der Variable "TyreSave" addiert
Path2 = path_position //Aktuelle Position des Autos auf der Rennstrecke (0 = Anfang 1 = Ende) wird gesichert, um sie gleich danach von der Grundformel abzuziehen
timer7 = 2
if timer7 = 0 {
Path2 = 0 //Pfad-Variable wird zurückgesetzt, um bei der nächsten Veränderung wieder auf 0 zu sein
}
}
}


if(path_position = 1) { //wenn das Auto die Runde beendet, wird der Wert ebenfalls gesichert
TyreUse3 += TyreUse2
}


Es funktioniert auch bis zu einem Punkt perfekt: Wenn das Auto die aktuelle Runde beendet, wird der ganze Abrieb zurückgesetzt auf 0. Was mache ich falsch? Warum sichert er den aktuellen Wert nicht in der TyreUse3, die den endgültigen Abrieb anzeigen soll (und im Verlauf der Runde auch tut)?

9

25.04.2014, 11:27

1. Tu dir selbst einen gefallen und benutz sinnvolle Variablen-Namen.
2. Benutz code-Tags
3. Benutz einen Debugger, damit solltest du das Problem finden.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

10

25.04.2014, 13:35

Der Debugger hilft mir nicht, weil es ja nicht ein "Problem" an sich ist: Die Berechnung funktioniert ja (und bis auf den letzten Punkt sogar sehr gut), sie ist nur nicht korrekt.

Werbeanzeige