Lieber Besucher, herzlich willkommen bei: RPG Studio - Make your World real. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

256

Spieltheorie 1.1 oder Was sollte ich am besten tun? (Teil 1)

Bewertung:

Von Warkurus, Samstag, 26. Oktober 2013, 02:39

Wahrscheinlich haben sich die meisten schon mal gefragt, wie manche K.I.s oder Spieler entscheiden, welchen “Zug” sie als nächstes machen sei es in Schach, LoL oder Pokemon. Meistens geht man nach Gefühl oder Erfahrung basierend darauf, was sich früher bewährt hat, aber wenn man ein Spiel plant, dann kann man kaum auf Erfahrung zurückgreifen und wenn man nach Gefühl ginge, sich aber später herrausstellt, dass das Gefühl falsch war, muss man wieder von vorne anfangen und der ganze Programmieraufwand und evt auch die Story sind für die Katz'.

Hier werde ich erstmal anhand eines Beispiels zeigen, wie man schnell die nächsten Züge bzw. den ganzen Kampfverlauf berechnen kann, sodass ihr direkt anfangen könnt damit zu experimentieren. Normalerweise würde man vorher erklären wann man welches Modell benutzt und was genau man macht, aber ich denke, dass ich dann die meisten verliere und nur noch die übrig bleiben, welche es eh schon kennen (desshalb schreibe ich später auch u.a. Klammernotation statt Vektornotation).

Also folgendes Beispiel: Ihr habt gerade mit einem Freund Pokemon Online angefangen. Ihr habt noch nicht so viel Ahnung welche Moves, Evs und so weiter man nimmt, also schaut ihr euch auf pokefans.net um und kopiert erstmal die builds von euren Lieblingspokemon. Sagen wir, dass ihr u.a. Brutalanda cool findet und ihr nimmt ein Mix-Mence mit Draco-Meteor, Erdbeben, Feuersturm und Ruheort. Euer Freund ist so richtig von Aquana begeistert und nimmt ein Standart-Aquana mit Surfer, Wunschtraum,Schutzschild und Kraftreserve{ Elektro}. Sobald ihr fertig seid kämpft ihr direkt gegeneinander und irgendwann während des Kampfes kommt ihr in eine heikle Situation. Ihr habt ein Brutalanda und euer Freund hat ein Aquana, beide Pokemon haben volles Leben. Könnt ihr Aquana besiegen, bevor es euch besiegt oder solltet ihr lieber wechseln?
Was wissen wir zu diesem Zeitpunkt? erstens wissen wir, dass unser Brutalanda schneller ist als Aquana, zweitens kennen wir unser Item, unsere EV-Verteilung und haben eine richtig gute Ahnung, was unser Gegner für Evs hat und welches Item er benutzt.
Stellt euch jetzt die Frage, was ihr tun würdet und hebt euch die Antwort gut auf, denn nun wird es Zeit für serious math. Bild

Da wir ja als erstes ziehen, können wir ja erstmal schauen, welcher Angriff wie viel Schaden machen würde. Dazu benutzen wir folgende Formel für DDP von smogon.com:

Damage Formula = (((((((Level × 2 ÷ 5) + 2) × BasePower × [Sp]Atk ÷ 50) ÷ [Sp]Def) × Mod1) + 2) ×
CH × Mod2 × R ÷ 100) × STAB × Type1 × Type2 × Mod3)

Es kann sein, dass sich diese Formel von Generation zu Generation unterscheidet, aber das vernachlässigen wir hier.
Sieht sehr unübersichtlich aus und desshalb setzen wir jetzt mal konkrete Zahlen ein.
Da wir ja Pokemon Online spielen, sind unsere Pokemon einfach Level 100, sodass (Level × 2 ÷ 5) + 2=42, na wenn das nicht ein Zeichen ist :)
Mit BasePower ist der Basisschaden des Angriffes gemeint, den wir wählen. Wenn ihr um Pokemonmenü nachseht, werdet ihr bei den Moves sowas wie Stärke oder SP 140 (Draco Meteor) finden. Das ist es. Unser Brutalanda hat 3 Angriffsmoves mit folgenden Werten für BasePower:
Draco Meteor: 140SP
Erdbeben: 100SP
Feuersturm: 120SP

Mit [SP]Atk ist der spezielle bzw. der normale Angriffswert unseres Pokemons gemeint. Unser Brutalanda hat 310 Angriff und 316 spezial Angriff. Nehmen wir doch einfach für die folgenden Rechnungen an, dass wir uns dafür entscheiden mit Erdbeben anzugreifen.
Wir kommen dann zu 42 × BasePower × [Sp]Atk ÷ 50=42 × 100 × 310 ÷ 50=26040.
[Sp]Def steht für den (spezial) Verteidigungswert Aquanas mit EV: 252 KP / 116 SVert. / 142 Vert., also 210 Verteidigung, daraus folgt 26040÷210=124.
Mod1 ist etwas komplizierter. Hier kommen nämlich die Schwächungen und Stärkungen von Regentanz, Sonnentag, Verbrennungen, Feuerfänger, Reflektor, Lichtschild und die besondere Regel beim Doppelkampf rein. Da nichts davon für uns zutrifft, ist Mod1=1, easy.
Wir haben also 124+2=126.
Als nächstes kommt CH, was sowas wie critical hit bedeutet und den Bonusschaden repräsentiert, wenn die Attacke ein krittischer Treffer ist. Da Krits langweilig sind, gehen wir davon aus, dass unsere 6,25%ige Chance auf einen Krit uns hängen gelassen hat, wodurch CH=1 wird, sonst CH=2.
Als nächstes kommt Mod2 oder unser Bonus durch Leben-Orb, also Mod2=1.3, woraus wir 126*1.3=163.8 erhalten.
R steht für eine zufällig generierte Zahl. Wenn ihr mal RPGs gespielt habt, wisst ihr bestimmt, dass euer Feuerball zwischen sowas wie 230 und 254 Schaden gemacht hat. Diese Spanne gibts auch in Pokemon, sodass R zwischen 85 und 100 liegt. Wir nehmen 85, weil unser Fall ziemlich heikel ist und wir uns keinen Optimismus leisten können, Brutalandas Leben hängt schließlich davon ab. Unser neuer Schadenswert ist 163.8*0.85=139.23
STAB steht für Same Type Attack Bonus und sagt, dass du 50% mehr Schaden machst, wenn du eine Attacke wählst, die den selben Typen wie dein Pokemon teilt. Draco Meteor würde also den STAB kriegen, weil Brutalanda Drache ist, aber Erdbeben nicht.
Type1 und Type2 stehen für die beiden Typen, die der Gegner hat. Aquana ist nur vom Typ Wasser und wird von Erdbeben Neutral getroffen, sodass Type1=1 und Type2=1.
Zum Schluss kommen wir zu Mod3, worin die Fähigkeiten Solid Rock, Filter, Aufwertung und die Items Expertengurt und diverse Beeren verrechnet werden. Da Aquana Überreste hat, können wir alles ignorieren und erhalten als finalen Schadenswert 139. Aquana hat aber 464 Lebenspunkte, sodass Erdbeben schon mal nicht in Frage kommt, weil 30% Schaden viel zu wenig ist. Als Übung sollte jeder interessierte den Schaden für Brutalandas Draco Meteor und Aquanas Kraftreserve und Surfer selbst ausrechnen. Um die Statuswerte von Brutalanda und Aquana zu kriegen braucht ihr nur Pokemon Online (ist kostenlos), weil die offiziellen Nintendo Spiele jedem Pokemon zufällige Werte geben. Für die genauen Faktoren könnt ihr auf The Complete Damage Formula for Diamond & Pearl
(D/P) - Smogon University
nachschauen.
Spoiler: Lösung

Draco Meteor =>245 Schaden; HP{Elektro}=> 74 Schaden, Surfer => 75 Schaden
zum Lesen den Text mit der Maus markieren

So weit so gut, aber mit Spieltheorie fangen wir jetzt erst an und zwar in dem wir in die Matrix eintauchen. Bild

Wir stellen jetzt eine Matrix auf, in der wir sehen, wer wie viel Schaden nach der ersten Runde gekriegt hat:
Attacken
Surfer
HP{Elektro}
Wunschtraum
Schutzschild
Draco-Meteor
(216;108)
(216;107)
(216;33)
(0;33)
Erdbeben
(110;108)
(110;107)
(110;33)
(0;33)
Feuersturm
(41;108)
(41;107)
(41;33)
(0;33)
Ruheort
(0;75)
(0;37)
(0;0)
(0;0)

Das ist serious shit. Die Einträge in Klammern stehen für den erlittenen Schaden, der erste Eintrag gehört Aquana und der zweite Brutalanda. Wenn ihr eure zuvor berechneten Zahlen nicht wiederfindet, habt ihr vergessen Leben-Orb und Überreste miteinzurechnen. Jetzt haben wir das Problem, dass Wunschtraum und Ruheort ziehmlich besondere Mechaniken haben, also können wir keine schöne Mathematik benutzen. Gehen wir also etwas pragmatischer herran. Ruheort stellt bis zu 50% der Lebenspunkte wieder her und entfernt den Typ Flug für diese Runde, womit HP{Elektro} nur noch 50% Schaden macht (nämlich 37). Wie bringen wir das in die Matrix ein? Ruheort ist ja das Minimum von der Differenz der Gesamtlebenspunkte 331 und der momentanen Lebenspunkte (hp_temp) und 50% der Gesamtlebenspunkte, also min{331 – hp_temp; 166} und dies nennen wir jetzt einfach D. Auf hp_temp kommen wir später nochmal zurück, also ergänzen wir erstmal unsere Matrix mit D.


Attacken
Surfer
HP{Elektro}
Wunschtraum
Schutzschild
Draco-Meteor
(216;108)
(216;107)
(216;33)
(0;33)
Erdbeben
(110;108)
(110;107)
(110;33)
(0;33)
Feuersturm
(41;108)
(41;107)
(41;33)
(0;33)
Ruheort
(0;-D+75)
(0;-D+37)
(0;-D)
(0;-D)

Falls ihr euch fragt, warum wir jetzt -D eingebaut haben: Das ist der erste Schritt diese Matrix für die nächsten Züge anzupassen und es muss -D sein, weil die Klammern den Schaden darstellen, also ist die Heilung negativ. Letzteres ist Definitionssache, ihr könnt auch hingehen und überall die Vorzeichen ändern. Was man aber nicht machen darf, ist das Kommutativgesetz anzuwenden, weil wir in einem rundenbasiertem Spiel sind. Wenn ihr nämlich statt '-D+75' '75-D' schreibt, dann führt es dazu, dass Ruheort den Schaden von Surfer heilt, obwohl Surver nach Ruheort eingesetzt wurde.

Nächstes Problem: Wunschtraum. Wunschtraum hat ja die eigenart, dass es erst in der darauffolgenden Runde das “schnellste” Pokemon heilt, wenn es bis zum Ende des Zuges überleben konnte. Zum einen können wir D wieder benutzen, nur mit anderen Werten, nämlich D'=min{464-hp_temp';232}, den Strich ' habe ich hinzugefügt, um es besser von Brutalandas D und hp_temp zu unterscheiden. Jetzt können wir getrost davon ausgehen, dass auf Wunschtraum nur Schutzschild (oder das Auswechseln) folgt, aber dass Schutzschild auch aktiviert werden könnte, ohne dass Wunschtraum vorher gespielt wurde. Die Heilung durch (Wunschtraum*Schutzschild)+Überreste ist entweder 0, bis 29 oder bis 261 (+ ist hier als nicht-ausschließendes oder, das * als und gemeint). Wenn wir sofort versuchen würden alle Fälle gleichzeitig zu betrachten und möglichst komprimieren, dann würde es schnell unübersichtlich werden und wir kämen nicht um Schranken herrum, also legen wir eine Reihenfolge fest, in der die Heilung wirkt: 1. Wunschtraum 2.Überreste.
Machen wir für die Heilung von Überresten das selbe wie für Wunschtraum, dann haben wir D_{Lefties}=min{464-hp_temp'';29}. hp_temp'' dient als Abgrenzung zu hp_temp' und sagt, dass auf hp_temp' schon Wunschtraum gewirkt hat. Wenn wir alles zusammen nehmen, haben wir für Aquana D'_{ges}=D'+D_{Lefties}=min{464-hp_temp';232}+min{464-hp_temp'';29}=min{464-hp_temp';232}+min{464-hp_temp'-D';29} oder D'_ {ges}=min{464-hp_temp';29}. Fassen wir diese beiden Fälle unter D_{A} zusammen und füttern die Matrix damit:


Attacken
Surfer
HP{Elektro}
Wunschtraum
Schutzschild
Draco-Meteor
(216;108)
(216;107)
(216;33)
(-D_{A};33)
Erdbeben
(110;108)
(110;107)
(110;33)
(-D_{A};33)
Feuersturm
(41;108)
(41;107)
(41;33)
(-D_{A};33)
Ruheort
(-D_{Lefties};-D+75)
(-D_{Lefties};-D+37)
(-D_{Lefties};-D)
(-D_{A};-D)

So, nächstes Problem: Draco Meteor. Ich hab mir das bis zum Schluss aufgespart, weil dies besonders hässlich ist. Nach einem Draco-Meteor hat Brutalanda nur noch 50%, nach 2 nur noch 33,3% und nach 3 nur noch 25% der ursprünglichen Angriffswerte. Das heißt, dass wir wieder unsere Schadensformel rausholen müssen und dann irgendwie die Anzahl der Draco-Meteors einbauen müssen. Da ich gerade zu faul bin eine schöne Funktion zu finden (vielleicht hole ich das irgendwann noch nach), benutze ich zwei Mengen. Die erste ist n={0;1;2;3} und die zweite ist m={1;0.5; 1/3;0.25}, wobei m(n) der n-te Eintrag in der Menge m ist. Klar kann man Draco-Meteor 5 mal einsetzen, aber weil nach 3 Treffern (!) der Angriff nicht mehr weiter sinken kann, reicht es auch so.
Unsere neue Schadensformel ergänzt also [Sp]Atk um den Faktor m(n):

Damage Formula = (((((((Level × 2 ÷ 5) + 2) × BasePower × [Sp]Atk *m(n)÷ 50) ÷ [Sp]Def) × Mod1) + 2) ×
CH × Mod2 × R ÷ 100) × STAB × Type1 × Type2 × Mod3)
Füttern wir unsere Matrix damit, erhalten wir


Attacken
Surfer
HP{Elektro}
Wunschtraum
Schutzschild
Draco-Meteor
((146*m(n)+2)*1.7-D_{Lefties};108)
((146*m(n)+2)*1.7-D_{Lefties};107)
((146*m(n)+2)*1.7-D_{Lefties};33)
(-D_{A};33)
Erdbeben
((124*m(n)+2)*1.1-D_{Lefties};108)
((124*m(n)+2)*1.1-D_{Lefties};107)
((124*m(n)+2)*1.1-D_{Lefties};33)
(-D_{A};33)
Feuersturm
((125*m(n)+2)*0.6-D_{Lefties};108)
((125*m(n)+2)*0.6-D_{Lefties};107)
((125*m(n)+2)*0.6-D_{Lefties};33)
(-D_{A};33)
Ruheort
(-D_{Lefties};-D+75)
(-D_{Lefties};-D+37)
(-D_{Lefties};-D)
(-D_{A};-D)

Das letzte Problem ist die Trefferchance von Draco-Meteor, Feuersturm und Schutzschild zu berücksichtigen, aber das mache ich im nächsten Teil, wenn Nachfrage besteht.

Jetzt will ich noch erklären, was wir jetzt mit dieser einen Matrix anfangen können. Wenn ihr glaubt, dass es erfolgreich sein könnte erst Feuersturm und dann Erdbeben zu benutzen, während Aquana nur Surfer benutzt, dann rechnet ihr:
(41;108)+(110;108)=(41+110;108*2)=(151;216)
Hier seht ihr, wer wie viel Schaden gemacht hat, aber manchmal ist es besser das verbleibende Leben zu sehen. Dazu nehmt ihr das maximale Leben der beiden Pokemon und schreibt dies ebenfalls in der Klammernotation: (464;331). Anschließen subtrahiert ihr den Schaden vom Leben:(464;331)-(151;216)=(313;115).

Tadaa! Jetzt könnt ihr blitzschnell ausrechnen wie euer Spiel ablaufen wird ohne langwierige Tests durchzuführen.
Bild

Dieser Artikel wurde bereits 1 964 mal gelesen.

Tags: 2000, 2000, 2003, 2003, 2k, 2k, 2k3, 2k3, charset, charset, Design, Theorie, Tileset, Tileset, vx, vx, VX Ace, VX Ace


Kommentare (2)

  • 2

    Von Warkurus (Montag, 23. September 2013, 23:48)

    Zumindest die Essentials-KI funktioniert nicht zufällig.

    Ich werde deine Kritik berücksichtigen, nur dieses mal musste ich einfach etwas spontanes machen.

  • 1

    Von Ankou (Montag, 23. September 2013, 17:44)

    ich glaube die Pokemon-AI im Spiel funktioniert ungefähr so: rand();
    Naja, im allgemeinen ist das ganz interessant mal die Formeln einzusetzen, aber echte Planung hast du da noch nicht mit berücksichtigt - sämtliche states auszuprobieren ist für die meisten Spiele nicht durchführbar. Wesentlich komplizierter wird das Pokemonspiel wenn du dir überlegst mit welcher Wahrscheinlichkeit der Gegner jetzt z.B. ein F.E.A.R. (http://bulbapedia.bulbagarden.net/wiki/Appendix:F.E.A.R.) in den Kampf schickt und ob es sinn macht sich dagegen vorzubereiten. Vl ist die starke Feuerattacke die den Gegner auf jeden Fall tötet die richtige Wahl, aber vielleicht ist auch die Grasattacke die den Gegner nicht tötet die richtige Wahl, weil er sowieso tauschen wird.
    Pokemon ist meiner Erfahrung nach ein ziemlich psychologisches Spiel und mit einer deterministischen Suche wird deine AI vermutlich nicht weit kommen, sondern leicht ausgetrickst werden.

Blog Navigation

Vorheriger Artikel

Spieltheorie 1.1 oder Was sollte ich am besten tun? (Teil 2)

Von Warkurus (Samstag, 26. Oktober 2013, 02:38)