Eine Kurve anhand von 6 Werten berechnen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Eine Kurve anhand von 6 Werten berechnen

    Hallo Mathe-pros,

    Hab ne Textaufgabe für euch:^^

    Es soll eine Kurve anhand von 6 Werten berechnet werden. Ich gebe mal ein Beispiel: In einem RPG kann der Spieler ein Level zwischen 1 und 99 haben. Dabei entsprechen dem ersten Level 50 Erfahrungspunkte und Level 99 3000 Erfahrungspunkte.
    Der Startwert ist also 50, der Endwert ist 3000 und dazwischen liegen vier weitere Werte, nehmen wir mal 80, 150, 300 und 1000.

    Jetzt will ich wissen welches Level der Spieler erreicht hat wenn er 1377 Erfahrungspunkte hat. Wer es löst bekommt ein lachendes Gesicht in sein Aufgabenheft :D


    Und wie setze ich am besten das in Code um?
  • Es gibt zahlreiche Funktionen. Das ist so ziemlich die selbe Frage die schonmal gestellt wurde. Die Antwort heißt modellierung.
    Wenn ihr eine Ganzrationale Funktion haben wollt, dann müsst ihr für diese Funktion die Punkte einsetzen:
    f(x) = ax^5+bx^4+cx^3+dx^2+ex+f
    Dann am besten als Matrix aufschreiben und dann auflösen. Sollte jeder in der Oberstufe gehabt haben.
    Ich glaube aber dass sich hierfür eine Exponentialfunktion besser eignet, also:
    f(x) = a*exp(x*b)
    Diese ist schöner und leichter zu lösen.
    f(0) = 50
    a*exp(0*b) = 50
    a = 50
    f(99) = 3000
    50*exp(99*b) = 3000
    exp(99*b) = 60
    99*b = ln(60)
    b = ln(60)/99
    b = 0.041357
    Also
    f(x) = 50*exp(x*0.041357)

  • War nei auf der Oberstufe :)
    Darum kapier ich es immer noch nicht, versuche es seit na stunde zu verstehen.

    Was muss ich für f, a und b einsetzen? Wenn du f(0) schreibst, was für ein Zeichen steht dann zwischen f und der Klammer? (Hatte in Mathe damals vor ca. 10 Jahren nie was Besseres wie ne 4 in der Realschule)
    Oder soll das dann ein Array sein? Kann ich das irgendwie in der Art machen?

    GML-Quellcode

    1. for(i=50; i<=3000; i+=1)
    2. {
    3. level = i * exp(x * 0.041357); //was ist x?
    4. }


    Sorry mir ist das zu hoch! -.-

    edit: Mir ist klar das mein Code falsch ist, soll nur vermitteln wieviel ich von Exponentialfunktionen und der Matrix verstehe. Man oh man, gerade ich versteh nix von der Matrix^^

    edit2: Ich hätte das halt so gerechnet: (endwert-startwert) / maximal level = der Steilgrad der Kurve - geht aber nicht da ja noch 4 weitere Werte angegeben wurden. Also Steilgrad1 = (wert2 - startwert) / (99 / Anzahl der Werte * 2), Steilgrad2 = (wert3 - wert2) / (99 / Anzahl der Werte * 3) usw.
    Aber schon während dem schreiben verteh ich meine eigene Logik schon nicht mehr. Bin echt grad verwirrt.

    edit3: Steilgrad? Nennt man eigentlich anders was ich mein.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Morpheus ()

  • Die Funktion exp beschreibt die Exponentialfunktion e^x. Diese ist im GM schon eingebaut. Das x steht für eine Variable, welche besagt, wie oft die Zahl mit sich selbst multipliziert. e ist dabei die Basis mit dem Wert 2.7182818...
    Das heißt für x setzt du die Variable mit dem Level ein und du bekommst als Rückgabewert der Funktion die Erfahrungspunkte. Ich schreibe es mal GML komform um:

    GML-Quellcode

    1. var startwert = 50;
    2. var endwert = 3000;
    3. var max_level = 99;
    4. erfahrungspunkte = startwert * exp(level * ln(endwert / startwert ) / max_level);

    ln ist dabei die natürliche Logarithmusfunktion, welche einfach die Umkehrfunktion der Exponentialfunktion mit der Basis e ist. Der Einfachheit halber würde ich die mittleren Werte einfach weglassen. Du kannst dir auch das Thema Interpolation durchlesen. Dort gibt es verschiedene Methoden um eine weiche Kurve zu erstellen.

  • Steilheitsgrad entspricht dem Anstieg m in der mathematischen Sprache. Wie stark eine Rampe angestellt ist, für die Vorstellung (als Beispiel).
    Meine Frage, warum geht da keine lineare Funktion(allgemein so: f(x) = m*x +n, wobei n der y-Achsenabschnitt ist)?? Ist nämlich deutlich simpler als ne e-Funktion.
    Der Anstieg ist dann die Differenz aus den y-Werten geteilt durch die Differenz der x-Werte
    Das würde dann folgendermaßen aussehen:
    f(x)= (99-1) / (3000-50) *x + 0,033
    (die 0,33 ergibt sich aus den Start/Endpunkten, die man in die allgemeine Gleichung einsetzen kann und ist gerundet)
    Und für x kannst du dann deine Erfahrungspunkte einsetzen, f(x) gibt dann dein Level zurück, leider musst du an der Stelle runden, weil 0,033 nicht der ganz exakte Wert ist, wenn du anstatt 0,033 den exakten Wert von 50 - 98/2950 einsetzt, musst du nicht runden)

    Oder GML:

    GML-Quellcode

    1. var erfahrenspunkte
    2. var Level
    3. level = (98/2950)* erfahrenspunkte + 0,033 //hier halt für die 0,033 exakten Wert nehmen oder noch runden..


    Editiert, weil ich einen totalen Denkfehler drin hatte, inhaltlich jetzt richtig, wenn auch für ein Spiel vllt. langweilig
    GML lernen geht leicht :)
    1. http://www.gm-d.de/help/ (deutsch)
    2. gm-d.de/wbb/index.php/Thread/2270/ (Einsteiger-Referenz)
    3. docs.yoyogames.com/ (Hilfe auf Englisch von GM:S)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Sk.Info.k.P. ()

  • @Sk.Info.k.P.
    Hast du das schon mal mit 1377 Erfahrungspunkten ausgerechnet??
    41470,510204081632653061224489796
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Sk.Info.k.P. schrieb:

    Steilheitsgrad entspricht dem Anstieg m in der mathematischen Sprache. Wie stark eine Rampe angestellt ist, für die Vorstellung (als Beispiel).
    Meine Frage, warum geht da keine lineare Funktion(allgemein so: f(x) = m*x +n, wobei n der y-Achsenabschnitt ist)?? Ist nämlich deutlich simpler als ne e-Funktion.
    Der Anstieg ist dann die Differenz aus den y-Werten geteilt durch die Differenz der x-Werte
    Das würde dann folgendermaßen aussehen:
    f(x)= (3000-50) / (99-1) *x +20
    (die 20 ergibt sich aus den Start/Endpunkten, die man in die allgemeine Gleichung einsetzen kann und ist gerundet)
    Und für x kannst du dann deine Erfahrungspunkte einsetzen, f(x) gibt dann dein Level zurück, leider musst du an der Stelle runden, weil 20 nicht der ganz exakte Wert ist, wenn du anstatt 20 den exakten Wert von 50 -2950/98 einsetzt, musst du nicht runden)

    Oder GML:

    GML-Quellcode

    1. var erfahrenspunkte
    2. var Level
    3. level = (2950/98)* erfahrenspunkte + 20 //hier halt für die 20 exakten Wert nehmen oder noch runden...

    Linear geht natürlich auch, da nur 2 Punkte fix gegeben sind, aber dadurch ist der Anstieg überall gleich, d.h. man bräuchte für jeden Levelaufstieg gleichviel Punkte/Erfahrung was ziemlich langweilig wäre, deswegen bietet sich eine Expotentialfunktion mehr an, da der Anstieg mit fortlaufenden Level steigt und somit auch die zu erreichende Erfahrung, was das Spiel spannender macht.
    Die Formel für eine Lineare Funktion wäre so ungefähr: 29.797x + 50
    Qadratische: 0.3009x+50

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Pixelwar ()

  • Ich glaube wir kommen hier alle etwas durcheinander. Gesucht ist ja das Level und nicht die Erfahrungspunkte. Mein Vorschlag dafür ist die natürliche Logarithmusfunktion.
    Linear: Level = round(Erfahrungspunkte * 0.03288 + 1);
    Logarithmisch: Level = round(ln(Erfahrungspunkte + 500) * 51.9 - 322);
    Der Vorteil der Logarithmusfunktion ist, dass man zwar theoretisch noch immer bis ins unendliche Level bekommen kann. Es gleicht sich aber damit aus, dass man im Laufe des Spiels immer mehr Erfahrungspunkte für einen Gegner bekommt. Es wird also immer mehr Erfahrungspunkte benötigt um das nächste Level zu erreichen. Bei einer Linearen funktion wäre dies Katastrophal. Es wird nicht lange dauern und man bekommt mehrere Level Ups pro Gegner, was wiederum Exponentielles Wachstum für das Level bedeutet.
    Hier noch ein Graph der das verdeutlicht: