Mir ist für das Pet-Füttern eben gerade folgender Algorithmus eingefallen:
Folgende Routine wird für alle 5 Elemente durchgeführt:
Habitat-Gegner finden:
Für jedes Pet, das ein Spieler hat, wird zunächst die Siegchance per Arenasimulation für den aktuellen Gegner im Habitat berechnet. Ist die Siegchance für ein Pet über X %, dann wird diese Berechnung für den nächsten danach kommenden Habitatgegner durchgeführt und so weiter, bis man einen Gegner gefunden hat, den kein Pet ohne Levelup besiegen würde* (Welches Pet wäre für die zukünftigen Habitat-Gegner gut geeignet zum Füttern, da aktuelle Gegner zu besiegen* sind).
Findet man keinen Gegner, weil mindestens ein Pet alle noch anstehenden Habitat-Gegner besiegen würde oder das Habitat bezwungen wurde, dann tritt Kriterium Y ein. (Y wird in den Einstellungen festgelegt und kann letztes Pet füttern, Pet mit höchstem Level füttern, Futter wegwerfen, ... sein)
Ziellevel berechnen:
Hat man nun einen Habitat-Gegner gefunden, wird für jedes einzelne Pet, das der Spieler hat, folgendes gemacht: Für jedes weitere Level für dieses Pet (Ausgehend vom Level des Pets bis Siegchance >= X oder Level=100) wird die Siegchance am Habitat-Gegner berechnet.
Heißt man weiß dadurch bei welchem Level ein Pet den Habitat-Gegner schaffen würde*. (Dieses Level wird gespeichert)
EDIT:
Optimierung: Ziellevel berechnen
Um die Anzahl der Berechnungen pro Pet auf maximal 7 zu reduzieren (und nicht wie bei manchen Pets theoretisch 50 oder mehr), wird folgendes gemacht:
Untere Schranke = aktuelles Level des Pets
Obere Schranke = 100
Nun wird immer der Durchschnitt zw. der unteren und oberen Schranke gebildet. Der Durchschnitt wird in jedem Fall abgerundet.
Jetzt wird die Siegchancenberechnung für den Durchschnitt durchgeführt.
Liegt die Siegchance für den Durchschnitt >= X, ist Obere Schranke = Durchschnitt.
Liegt die Siegchance für den Durchschnitt < X, ist Untere Schranke = Durchschnitt.
Dies wird solange durchgeführt bis Untere Schranke und Obere Schranke nur 1 [Level] von einander entfernt sind; also wenn "Untere Schranke + 1 == Obere Schranke".
Dann ist Obere Schranke das Ziellevel.
Code:
http://pastebin.com/Yfv8eVYY
Zudem um die Berechnungen gering zu halten, kann man auch zu Beginn die Siegchancenberechnung für Level 100 für das Pet durchführen, um zu schauen, ob man überhaupt diese Technik anwenden muss, und ob man sich nicht die 6/7 Berechnungen sparen kann, da dieses eh nicht gefüttert wird, falls für Level 100 Siegchance < X liegt (s. Abschnitt "Kein Pet kann den Habitat-Gegner besiegen*?:").
Attribut-Berechnung für bestimmtes Pet mit bestimmten Level:
Faktor wird ausgewählt:
Pet-Nr. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Faktor 10 11 12 13 14 16 18 20 25 30 35 40 50 60 70 80 100 130 160 160
Vor-Basis = Faktor * (Level+1)
Rudel-Bonus = Vor-Basis * (0,05 * Rudel) Rudel: Anzahl der Pets im Rudel
Basis = Vor-Basis + Rudel-Bonus
Hauptattribut: Basis
Nebenattribut: Basis/2
Ausdauer: Basis
Glück: Basis * 0,75
Rüstung: Maximal-Wert der Klasse (10,25,50 %)
http://forum.sfgame.de/showthread.php?t=74248
Waffenschaden:
Damage-Multi:
Magier 4,5
Kundschafter 2,5
Krieger 2
Waffenschaden = Damage-Multi * (Level+1)
Quelle für Attributsberechnung:
https://docs.google.com/spreadsheets/d/ ... =500316837
http://forum.sfgame.de/showthread.php?t=73984&page=2 (Post #12)
Auswahl für das Füttern:
Für jedes Pet wird dann die Differenz zw. aktuellem Level des Pets und dem Ziellevel berechnet.
Das Pet, welches die kleinste Differenz hat, wird gefüttert, da dieses Pet am wenigsten Futter braucht, bis es den Habitat-Gegner besiegen* könnte. (Ausgewähltes Pet wird gespeichert)
Dies ist manchmal das letzte Pet oder das mit dem höchsten Level. Dadurch wird die meiner Meinung nach sinnvollste Entscheidung für das Füttern getroffen.
EDIT: Falls Differenz bei mehreren Pets gleich ist, wird immer das von der Position her am weitesten hinten liegende Pet gefüttert.
Dadurch werden auch die Vorschläge von TerryS abgedeckt:
TerryS hat geschrieben:I really see three different options in feeding pets.
1) Always feed the highest level creature.
2) Always feed the highest base position creature. (The further down you go, the more each food gives, so theoretically there's a time when it's cost effective to move.)
3) Feed highest level creature until there's a new creature X slots further down. (That's basically what I'm trying right now, with X being 5.) X being a selection of how many positions.
Kein Pet kann den Habitat-Gegner besiegen*?:
Wenn selbst bei Level 100 (zum Beispiel die Anfangspets) die Siegchance eines Pets gegen den Habitat-Gegner immer noch nicht X übersteigt, dann wird dieses Pet wahrscheinlich nie den aktuellen Habitat-Gegner besiegen* können.
-> Pet wird für die Auswahl ignoriert, da Füttern nichts bringt.
Wenn alle Pets selbst bei Level 100 den Habitat-Gegner nicht schaffen, dann tritt Kriterium Y ein, da dann ein passendes Pet wahrscheinlich noch nicht gefunden wurde. (Y: siehe Abschnitt "Habitat-Gegner finden:")
Optimierung:
Da dies manchmal 100 Arenasimulationen und Attributsberechnungen seien können (mir fallen immer so ressourcenfressende Algorithmen ein
), wird diese Routine nur bei einer Änderung aufgerufen:
Pet-Daten** werden gespeichert, um Änderungen beim Botstart feststellen zu können und um dann gegebenenfalls die Routine aufzurufen.
"Änderung" heißt:
-ausgewählter Habitat-Gegner (siehe Abschnitt "Habitat-Gegner finden:") wurde besiegt -> Neuer Habitat-Gegner muss gefunden werden
-ein Pet erreicht das berechnete Ziellevel (siehe Abschnitt "Ziellevel berechnen:") und kann dadurch den ausgewählten Habitat-Gegners theoretisch besiegen* (Siegchance >= X). -> Neuer Habitat-Gegner muss gefunden werden
-Neues Pet wurde gefunden/existiert. -> Routine wird nur für dieses Pet durchgeführt:
---> Kann dieses Pet den ausgewählten Habitat-Gegner besiegen*?
---> Ja: Neuer Habitat-Gegner muss gefunden werden
---> Nein: Nur die Ziellevel für alle Pets müssen neu berechnet werden, aufgrund des Rudelbonus auf die Attribute. Habitat-Gegner bleibt gleich
EDIT: Das funktioniert nicht, da durch den Rudelbonus möglicherweise Pets den gewählten Habitat-Gegner besiegen könnten, sodass ein neuer gefunden werden muss. Daher ignoriert den letzten Punkt. Müsste eigentlich heißen:
-Neues Pet wurde gefunden/existiert
"Neuer Habitat-Gegner muss gefunden werden" = komplette Routine aufrufen
* "Habitat-Gegner besiegen" heißt immer Siegchance >= X % (X wird in den Einstellungen festgelegt und kann z.B. 90 % sein)
** Pet-Daten pro Element:
-Ausgewählter Habitat-Gegner
-Ausgewähltes Pet + Ziellevel dieses Pets
-Pets, die der Spieler hat
Habitat-Gegner meint immer den durch die Routine ausgewählten Habitat-Gegner.
MfG
Wsx...