Nachbau eines Pokemon-Kampfsystems -- dynamische neue Fragen

Wir sammeln alle Infos der Bonusepisode von Pokémon Karmesin und Purpur für euch!

Zu der Infoseite von „Die Mo-Mo-Manie“
  • Hallo liebe Pokemonfreunde,


    ich bin Informatik-Student und habe in den letzten zwei Semestern die Grundzüge des Programmieren in Java gelernt.


    Da ich in letzter Zeit wieder rückfällig geworden und mir Pokemon Schwarz inkl. Nintendo 3DS gekauft habe, bin ich zur Zeit voller Elan im Pokemon-Spiel drin. Aus diesen zwei genannten Dingen ist folgerichtig die Idee entstanden, einen eigenen Kampfsimulator zu schreiben, mit dem ich meine Team-Zusammenstellungen automatisch bewerten lassen kann.


    Ich habe nun die wichtigsten Grundklassen (Pokemon, Move, Pokedex, Movedex) programmiert, kann also Pokemon und Attacken erstellen und sie einander zuordnen. Ich würde diesen Thread gerne immer dann nutzen, wenn ich irgendwo stecken bleibe. Jetzt stehe ich gerade am Anfang des Simulators, der zwei Pokemon gegeneinander kämpfen lassen können soll. Jedoch fehlen mir reichlich Informationen, die ich benötige, um die Kämpfe korrekt zu implementieren:


    1. Wie berechne ich aus Base, EV, DV und Level einen aktuellen Statuswert? Den Zusammenhang zwischen EV und Level kenne ich jetzt schon, aber was genau sagt die Base aus? Ist es der Wert eines Pokemon auf einem bestimmten Level mit 0 EVs und 0 DVs? Und welcher Level soll das sein?


    2. Wie ist der Zusammenhang zwischen den Schadenspunkten einer Attacke, dem aktuellen Statuswert eines Pokemon (je nach physischer/spezieller Attacke "Angriff" oder "Spezial-Angriff" beim Angreifer bzw. "Verteidigung" oder "Spezial-Verteidigung" beim Angegriffenen) und der Anzahl an KP, die am Ende abgezogen wird? Werden da einfach alle Werte des Angreifers (sprich Schadenspunkte der Attacke plus entsprechender Statuswert) addiert und davon der Defensiv-Wert des Angegriffenen subtrahiert?


    3. Und auf welchen Wert genau wirken sich Typvor- und -nachteile aus? Muss ich dann nur den Wert der Schadenspunkte der Attacke entsprechend verändern, oder den Gesamtwert, der sich aus Kombination von Schadenspunkten und Statuswerten ergibt?


    Ein Beispiel, an dessen ausführlicher Berechnung alle meine Fragen beantwortet wären:
    Pokemon1 (130 Base in Sp.Angriff & Level 40) greife Pokemon2 (90 Base in Sp.Verteidigung & 110 Base in KP & Level 50) mit einer speziellen Attacke an, die 50 Schadenspunkte hat und vom Typ her genau der Schwäche des Typs von Pokemon2 entspricht (Faktor 2). Beide Pokemon sollen zur Vereinfachung 0 EVs und 0 DVs für alle Werte haben. (Deren Einfluss kenne ich schon.)


    Wie viele KP hat Pokemon2 nach einem erfolgreichen Standard-Treffer (also nicht Volltreffer) von Pokemon1 mit dem besagten Angriff? Und vor allem: wie wird dieser Wert im Detail aus NUR den gegebenen Werten berechnet???


    Liebe Grüße,
    euer Dschee

  • Ich kann dir auf jedenfall shcon mal sagen, dass dein Vorhaben verdammt viel Arbeit bedeutet. Ich habe etwas ähnliches mal versucht, das ganze aber dann sein gelassen. Ich kann dir, wenn du möchtest heute Nachmittag mal meine (undokumentierten) Formeln raussuchen. Diese entsprechen den Original-Formeln und sind von verschiedenen Seiten zusammengesucht. Soweit ich weiß hat Hilikus in einer PDF für die BPE das ganze auch mal erklärt, den könntest du vielleicht auch mal Fragen.


    Oder einfach mal Google Bemühen, "Schadensformel Pokemon" sollte einige Ergebnisse finden.

  • Hallo Dschee,


    viel Glück und gutes Gelingen, das ist definitiv kein kleines Projekt!


    Auf serebii.net kannst du dir die allermeisten zu Gemüte führen, ich verlinke es dir im einzelnen,
    aber generell findest du unter Game Mechanics die allermeisten Formeln zu den spielinternen
    Berechnungen.


    zu 1) Hier findest du die Formeln zur Berechnung der aktuellen Stats eines Pokemon, auch auf die
    Skalierung der Stat-Boosts wird dort eingegangen.


    http://www.serebii.net/games/stats.shtml


    zu 2 und 3) Die Schadensberechnung


    http://www.serebii.net/games/damage.shtml


    wie du siehst es ist ein bisschen komplexer als man auf den ersten Blick denkt :-)

  • So, ich habe jetzt neben den Datenstrukturen für Attacken, Pokemon und deren Variationen auch eine einfache Simulation für 8 Pokemon mit jeweils einem Attackenpool von nur 5 Attacken programmiert und laufen lassen. Für jedes Pokemon werden dabei ca. 1500 verschiedene Varianten erstellt, die sich in EVs und Attacken unterscheiden. Anschließend muss jedes Pokemon der 12.000 Pokemon (8 * 1500) gegen jedes andere Pokemon kämpfen, sodass am Ende für jedes Pokemon eine Anzahl an gewonnen und verlorenen Kämpfen existiert.


    Diese Simulation ist sehr stark abgespeckt, es soll nur der Anfang sein von viel komplexeren Simulationen, allerdings stoße ich schon hier auf ein Skalierbarkeitsproblem: im Moment dauert die Simulation nur einige wenige Minuten. Erhöhe ich allerdings die Attacken der Pokemon (etwa von 5 auf 6), dann muss ich schon über eine Stunde warten, bis ich ein Ergebnis vorliegen habe. Da ich jedoch mindestens 8 (am liebsten natürlich noch mehr) Attacken in den Attackenpools der Pokemon speichern will zum Ausprobieren, habe ich ein ersthaftes Skalierbarkeitsproblem: schon bei dieser stark vereinfachten Simulation würde das Wochen, wenn nicht Monate dauern, bis ich ein Ergebnis vorliegen hätte.


    Habt ihr Ideen und Vorschläge, wie ich das ganze anders machen kann? Oder wo man Java-Programme auf Server-Farmen laufen lassen kann, ohne extrem viel Geld dafür hin zu blättern? (Ein wenig würde ich dafür schon ausgeben ...)


    Ich freue mich über jeden Tipp, der mir weiter hilft!

  • Naja, du kannst z.B. ein russisches Botnetz kaufen, und dort deine Berechnung durchführen lassen :D
    Ne im Ernst. Java Programma laufen theoretisch auf jedem Server, da ja nur Java installiert werden muss. Aber günstig ist das nicht.


    Java ist hier vl. auch nicht gerade die günstigste Sprache. Einfache Anwendungen brauchen da schon viele Ressourcen, und wenn du 12.000 Pokemon alle miteinander Vergleichst, hast du ca. 144 Millionen Vergleiche (12.000 zum Quadrat). Mal davon abgesehen das du wahrscheinlich die auch alle erstmal berechnen musst.
    Vl. ist dein Code auch nicht ressourcensparend. Verwendest du viele Objekt, Collections oder ähnliches?
    Beobachte auch mal im Taskmanager wie viel RAM das ganze braucht. Du kannst versuchen den GarbageCollector öfter aufzurufen, um neuen Speicherplatz freizugeben.
    Wie stark ist dein Rechnet eig.?
    Berechnest du alle Daten, oder arbeitest du mit Files oder einen Datenbank?

  • Man schreibt Simulationen deswegen auch nicht in Java sondern in Sprachen, welche in echten Maschinen-Code kompiliert werden, wie C++.


    @ phenoxmon: Der GC ist da irrelevant. Das relevant ist hier einfach der Prozessor. Die Speicherbereinigung erfolgt bei Java ja zum Glück automatisch, wenn auch möglicherweise in ungünstigen Momenten. Hier ist aber an sich jeder Moment zum Cleanup ungünstig ;)


    Noch ein Nachtrag: Serverfarmen: Da kann ich generell vom Hörensagen die Amazon Cloud empfehlen. Die sind aber afaik recht teuer.

  • Hallo Dschee,


    vlt. solltest du auch mal rein mathematisch überschlagen wieviele Arbeitschritte in deinem
    Programm während der Berechnung bei n*n Pokemon mit x Attacken durchlaufen werden müssen,
    so wie du es dir vorstellst
    Es gibt Problemstellungen, bzw. Umsetzungen die "sprengen" jede Rechnerkapazität egal welche Sprache
    und wie die Hardware aussieht, wenn die Variablen gegen N gehen.

  • So ist eben. Es ist eigentlich fast egal welche Sprache du für deinen Tester benutzt, aber bei zig tausend Kombinationsmöglichkeiten bei tausenden Pokemon usw. kommen eben schnell große Zahlen raus und da die Formeln auch nicht gerade sehr simpel sind, braucht der Prozessor nur noch mehr Arbeitsschritte. Vielleicht gibt es ja einen effizienteren Algorithmus, aber denn musste dann womöglich selbst suchen. Ich persönlich kenne so einen ausführlichen Simulator nicht. Vermutlich ist dein Problem NP... (falls du dich mit Berechenbarkeitstheorie auskennst, kannst du vllt. das TSP oder 3-SAT reduzieren xD )
    Natürlich kannst du die Anzahl der generierten Pokemon reduzieren, sodass eben mit 6,7 und 20 Attacken immer noch nur 1500 gemacht werden. Das Optimum könnte dabei vllt. auf der Strecke bleiben.
    Weiter hast du natürlich das Laufzeitproblem dann auch, wenn du die Anzahl der Pokemon erhöhst, die du vergleichst. Nja 12000 Pokemon gegeneinander kämpfen lassen ist eben einfach nicht ressourcenfreundlich. Ich vermute du hast extraattackeneffekte wie Werte senken und Statuswerte ändern etc. gar nicht eingebaut... (im Übrigen gibts bei jedem Kampf auch wieder 1000e Möglichkeiten, wie die Attacken benutzt werden etc.)
    Also ich persönlich würd mich dann doch etwas einfacher halten und immer nur 1 Pokemon gegen ein anderes Testen und das eben mit GENAU den EVs und Wesen etc. und GENAU den 4 Attacken. Dann kannste die beiden Objekte auch 1000 mal antreten lassen (immer die gleichen beiden) und rätst dir nichtdeterministisch (random) Attacken. Und wer die meisten Kämpfe gewinnt, ist im Schnitt das Bessere der beiden. xD