2016-04-11 3 views
0

sagen, dass ich eine einzigartige Kurve machen will, entweder eine Bezier-Kurve oder Exponentialkurve, aber ich mag diese Kurven durch einen bestimmten Satz von Parametern definiert werden.Experience Tabelle Algorithmus Curve

Nehmen wir zum Beispiel die folgenden unten. wenn ich [100, 500, 10000, ..., 30000000]

Jetzt:

Level: [1, 2, 3, ..., 100]

Erfahrung Accumulative spezifiziere Level 100 als 30,000,000 Millionen, wie mache ich es so, dass, egal welchen Kurvenalgorithmus ich ihm gebe, es folgen wird und die anderen Levels krümmt, so dass die Gesamtsumme all ihrer Erfahrungen 30,000,000 Millionen beträgt.

I.e. Level 1-100 = 30.000.000.000 Erfahrung insgesamt erforderlich. Die für jede Ebene benötigte Erfahrung basiert auf einer mathematischen Kurve, die entweder eine benutzerdefinierte Kurve/Bezier-Kurve/Exponentialkurve ist.

Wenn im obigen Beispiel keine ersten Ebenen angegeben wurden, welche Art von Algorithmus würde ich verwenden, um die verbleibenden Ebenen zu bestimmen, die pro Kurve benötigt werden?

30.000.000 (akkumulative xp von Stufe 1 bis 100) = Stufe 100

25.000.000 (akkumulative xp von Stufe 1 bis 100) = Stufe 99

Von oben nach unten: Learning Curve, exponentielle Kurve, Gewohnheit Kurve.

Curve Beispiel Bilder unten

Curve Examples

+0

Sketch die Kurve, die Sie wollen. –

+0

Fügen Sie sie hinzu, lassen Sie mich wissen, wenn Sie weitere Fragen haben. – BrettF

Antwort

0

Wenn Sie wollen 30 Millionen als Summe der Eingänge 1..100, erhalten nur das Ergebnis einer Funktion, die durch Konstanten multiplizieren.

double[] GetExperienceLimits(int experienceLevels, int maximumExperienceSum, Func<int, double> func) 
{    
    var arr = Enumerable.Range(1, experienceLevels) 
     .Select(i => func(i)) 
     .ToArray(); 
    double c = maximumExperienceSum/arr.Sum(); 
    return arr.Select(f => f * c).ToArray(); 
} 

Sie verwenden es, wie diese

var arr = GetExperienceLimits(4, 300, i => i * i); 

und

10, 40, 90, 160

+0

Vielen Dank für Ihren Kommentar, in der Tat wird mir die spezifische Menge auf den Ebenen der letzten 3.000.000 sein. Aber was ich brauche, ist die Fähigkeit, die Accumulative XP = 3.000.000 von Level 1 bis 100 zu haben. Ich habe meine Frage umformuliert, um dieses Problem anzugehen. Nochmals vielen Dank für Ihre Antwort, gibt mir definitiv etwas anderes zu spielen, um zu versuchen, dies herauszufinden. – BrettF

+0

@BrettF Ok, ich habe die Antwort aktualisiert. –

+0

Danke, ich kann das nutzen und die vorherigen Personen antworten zusammen, um zu bekommen, was ich brauche! – BrettF

0

Nachdem ich die Skizzen, ich denke, dass 1D natürliche kubische Splines sind die am besten geeignet, weil

  • Sie definieren eine Funktion (keine Kurve), sie interpolieren, d. h. gehen durch die von Ihnen spezifizierten Punkte.

Die lernenden und exponentiellen Kurven werden wahrscheinlich 3 Punkte und die benutzerdefinierte 4 Punkte.

Dieser Link zeigt, wie es funktioniert: http://www.codeproject.com/Articles/560163/Csharp-Cubic-Spline-Interpolation

+0

Ich denke, dass die Kombination von Ihnen und dem Typen, der vorher geantwortet hat, der richtige Weg ist. Einfach die Funktion zu haben, die mir die richtige Nutzlast geben würde und dann von dort aus die richtige Grafik zu manipulieren, scheint am besten zu funktionieren. Vielen Dank für die Antwort, wirklich hilfreich. – BrettF

Verwandte Themen