mmofacts.com

Kampfscript

gepostet vor 18 Jahre, 9 Monate von garyx7de
Hi,
habt ihr Erfahrung gemacht mit den herrunterrechnen der Einheiten Anzahl und dann wieder das hoch-rechnen. Also

x greift y mit 1.000.000 Einheiten an. y hat 1.200.000 Einheiten
gerechnet wird dann nachher mit
1.000 vs 1.200 Einheiten.

habt ihr Erfahrung mit so was?
gepostet vor 18 Jahre, 9 Monate von MannaZ
Also ich sehe keinen Grund wieso soetwas notwendig / sinnvoll seinen sollte.
Wenn man deine Einheiten nur in 1000er Schritten bauen kann (davon gehe ich aus, da sonnst die Rechnung benachteiligend sein kann), dann solltest du intern mit dem 1/1000stel arbeiten und nur die Ausgabe jeweils multiplizieren.
gepostet vor 18 Jahre, 9 Monate von Kampfhoernchen
Stimmt. Dem Rechner ist es egal, ob mit mit 1000 oder 1000000 rechnet. Nur wenns über die "magischen" 2,1 Mrd geht, also die Grenze zwischen Integer und Long bzw. BigInt, könnte man mit dem runterrechnen Zeit sparen.
*fällt mir ein, das müsste man mal auf nem 64-Bit System ausprobieren, ich mach mich mal dran und berichte dann*.

Dümmstenfalls rechnest du dann noch mit Gleitkommazahlen (wenn dus genau haben willst), was natürlich noch langsamer ist.
gepostet vor 18 Jahre, 9 Monate von Blabbo
Original von garyx7de
x greift y mit 1.000.000 Einheiten an. y hat 1.200.000 Einheiten

Warum muss man überhaupt soviele Einheiten haben?
Die ganzen nullen verderben nur die Übersicht und bringen nix.
Ich wünschte mir, Browsergames würden mal mehr nach dem Motto Qualität statt Quantität entworfen.
gepostet vor 18 Jahre, 9 Monate von Kallisti
Original von Blabbo
Original von garyx7de
x greift y mit 1.000.000 Einheiten an. y hat 1.200.000 Einheiten

Warum muss man überhaupt soviele Einheiten haben?
Die ganzen nullen verderben nur die Übersicht und bringen nix.
Ich wünschte mir, Browsergames würden mal mehr nach dem Motto Qualität statt Quantität entworfen.

Kommt halt auf das Konzept an.

Bei uns gibt es ein hartes Limit von 100 Einheiten pro Spieler. Mehr ist und wird nicht drin sein. Dafuer hat jede Einheit ein Schadensmodell, kann individuell bestueckt werden, etc.

Andere Spiele machen sich es insofern einfach, indem eine Armee eben nur eine Zahl in der Datenban ist.

Wenn man "epische Schlachten" darstellen moechte und keinen Wert auf Individualitaet legt, kann auch das Konzept funktionieren. Die Nullen am Ende dienen dann nur der Verdeutlichung, um was fuer Armeen es sich handelt..

Ist halt Geschmackssache. :-)
gepostet vor 18 Jahre, 9 Monate von schokofreak
Kalisti: Mach doch einfach im GUI hinter jeder deiner Einheiten noch 000 nullen?
Dann hast auch du ein gewaltiges Game
Wenn deine einzelne Einheit beschädigt ist; so nimmst du statt 1000 halt 1000 * Schadenswert (als 100 für 10 %.

Wär das n Kompromiss?
gepostet vor 18 Jahre, 9 Monate von TheUndeadable
> Dem Rechner ist es egal, ob mit mit 1000 oder 1000000 rechnet

Nicht bei einer numerischen Simulation des Schlachtfeldes, wie es manche Browsergames nutzen, um höhere 'Realität' zu simulieren.

Mit PHP konnte ich da auf etwa 1.000.000 Einheiten pro Partei sinnvoll simulieren, unter C++/C# etwa 500.000.000 Einheiten. Danach war allein schon wegen des Hauptspeichers Schluss (1 Byte pro Einheit / 256 Schadenspunkte maximal, nur Entwicklungsrechner)

Ich persönlich hatte ein Verfahren eingebaut, dass die Summe aller Einheiten auf maximal 100.000.000 normalisiert, also gleichmäßig herunterrechnet, bis 100.000.000 Einheiten im Spiel ist. Dieses kam allerdings bei mir nie zum Einsatz, da der größte Kampf bei etwa 3.000.000 Einheiten mit etwa 2 Sekunden Berechnungszeit durchgeführt wurde.
gepostet vor 18 Jahre, 9 Monate von Blabbo
Sorry, aber das bringt ja wohl mal garnix ausser Performancekill.
13573 Millionen gegen 156279 Oktillionen ... bla, echt bescheuert.
gepostet vor 18 Jahre, 9 Monate von TheUndeadable
Das Problem war, dass ich keine algebraische Formel gefunden hatte, die schnell die Einheiten berechnet hatte. Daher blieb mir nur übrig die Einheiten numerisch zu berechnen. Ich persönlich hatte das Spiel so konzipiert, dass maximal 10.000 Einheiten kämpfen sollten, leider konnte man mehr Städte gründen als erwartet und damit viel mehr Einheiten produzieren. Dadurch haben sich meine Kalkulationen zu Beginn etwas als fehlerhaft herausgestellt.
gepostet vor 18 Jahre, 9 Monate von mifritscher
Ach so, du musst jede einzelne Einheit einzeln berechnen?! Autsch *g*
Schau dir mal Integrale an, nur mal so als Tipp
gepostet vor 18 Jahre, 9 Monate von Kampfhoernchen
Bekommt da net eh irgendwann schwierigkeiten, wenn man mit Millionen von Einheiten als Einzelwerte rechnet? Die Array-Zugriffszeiten werden ewig lang. Das is in Java und PHP so.


Hm. Ich bin etwas eingerostet in Numerik. Aber war da net mal was mit Integralen?

EDIT: mifritscher war schneller.
gepostet vor 18 Jahre, 9 Monate von TheUndeadable
> Bekommt da net eh irgendwann schwierigkeiten, wenn man mit Millionen von Einheiten als Einzelwerte rechnet? Die Array-Zugriffszeiten werden ewig lang. Das is in Java und PHP so.

Unter PHP hatte ich bis den von mir genannten 1 Mio Einheiten keine Probleme bekommen. Unter C#/C++ sowieso nicht. Java sollte sich da eigentlich wie C# verhalten und bei nativen Arrays in sehr guter Geschwindigkeit funktionieren.

Zu den Integralen:
Dies nutzte bei meinem Fall auch nichts, da die Schüsse statistisch auf die gegnerischen Armeen verteilt wurden und ich dann mit Erwartungswerten und Varianzen rechnen müsste.
Numerisch bedeutet für mich, dass ich jeden Schuss einzeln durchsimuliere und wenn die gegnerische Einheit getroffen wurde, ist sie tot und kann nicht mehr zurückschießen. Da hatte ich keinerlei Lust mir das ganze durchzurechnen, um die oben genannten Erwartungenswerte zu ermitteln (DSP lässt grüßen ;-) )
gepostet vor 18 Jahre, 9 Monate von garyx7de
Numerik?
meine Anzahl von Einheiten sind in einem Array, und die werden nach und nach ausgelesen und per Zufall treten die gegen eine andere Einheit an. bei 200k Einheiten dauert der Kampf min 900 sec und das ist zu lang.
(erst in ein array einlesen und dann nach und nach wenn die units tot sind wieder löschen und jedes mal zählen ob alle tot sind und wenn ja ist der Kampf zu ende)
Deswegen frag ich mit dem runter rechnen.

bzw ich komm mir dummvor weil hier einige so schreiben das ihr KS besser ist ^^ und ich würde da doch gern mehr erfahren.
gepostet vor 18 Jahre, 9 Monate von Kampfhoernchen
Genau das meine ich. Das Durcharbeiten großer Array braucht nunmal seine Zeit, egal welche Sprache.

Die "Schuss für Schuss"-Lösung ist glaube ich mit aktueller Rechenleistung noch nicht umsetzbar für größere Flotten. Denn später werden ja auch mehrere Kämpfe innerhalb weniger Sekunden laufen. Und die User müssen in der Zeit auch noch bedient werden.
gepostet vor 18 Jahre, 9 Monate von garyx7de
ja hab ich gemerkt. bei 20k Usern klappt das ohne Probleme.
lößung? mir fällt da keine ein die fair ist.
gepostet vor 18 Jahre, 9 Monate von mifritscher
Hmm, fasse sie halt zu größere Gruppen zusammen, beim Militär sagst du ja auch nicht jedem einzelnen, wen er zu töten hat, sondern Gruppen/Legion/etc. weise.
gepostet vor 18 Jahre, 9 Monate von schokofreak
Also mal 1 Vergleich:
Schiesst im Militär schön jeder Soldat nach dem nächsten? Danach wird das selbe nochmals wiederholt?
Nein, es schiessen alle gleichzeitig. Was heisst?

=> Zuerst schiessen alle; werden alle getroffen. Anschliessend erst fallen diese tot um. Konsequenz; es kann auch in einem KS zu Double-Kills kommen.

Wie berechnet man das ganze nun? Summe aller Angriffswerte der Spieler. Diesen Wert verteilt man über die Opfer. Die Verteilung erfolgt aufgrund eines Gauss Algorythmus.
Schon lässt sich mit einer Berechnung eine komplette Kampfrunde abschliessen. anschliessend wird das komplette Array der Einheiten durchgefahren; manche werden auf beschädigt gesetzt - andere werden als verstorben ausgegliedert.
Nun folgt Runde zwei.

Je nach Kampfkonzept erfolgt das "Sterben und verwundet werden" nachdem eine Einheit geschossen hat, oder nachdem zwei einheiten geschossen haben. Wieso? Na ganz einfach; lässt du den Gegner zuerst schiessen, wartest schön und schiesst dann zurück während er wartet?

Mathematische Berechnungen zu den Kampfstärken der zwei Parteien beeinflussen den gemachten schaden (100000 die auf einen Zielen machen nicht 100000 mal so viel Schaden wie ein einzelner; Wenn 50 % meiner einheiten nach dem Schusswechsel Tot sind werden maximal 75 % meiner Schüsse auch tatsächlich ausgelöst). Lässt sich beliebig erweitern.

Gruss
gepostet vor 18 Jahre, 9 Monate von garyx7de
@schokofreak: ist mir zu ungenau, bzw zu unrealistisch und zu einfach,
@mifritscher: zu ungenau wenn ich alles nur summieren würde

aber ich werde es nun herunter rechnen (%werte) und nacher hoch rechnen. (verhältnismäßig)
gepostet vor 18 Jahre, 9 Monate von Kampfhoernchen
Also bei unserm KS kommen selbst nach 100fachen Tests immer realistische Ergebnisse raus, immer andere, und die Berechnung für eine Runde dauert weniger als 0,5 Sekunden, nach spätestens 6 Runden ist einer der Kontrahenten k.o.
Die Anzahl der Schiffe ist für die Berechnungszeit irrelevant.
Probleme haben wir nur, wenn es in den Bereich von Milliarden Schiffen geht, dann kann es zu Verfälschungen und etwas unrealistischen Ergebnissen kommen (was wohl mit der Begrenzung der Gleitkommazahlen auf 12 Stellen hinterm Komma zurückzuführen ist).

Genaueres kann ich logischerweise nicht verraten nur soviel: Es wurde vom Umlageverfahren des Betriebsabrechnungsbogens (hat mit Buchhaltung zu tun) inspiriert.
gepostet vor 18 Jahre, 9 Monate von Mudder
Will ich auch mal was dazu sagen - auch wenn ich aktuell keine Zeitergebnisse oder so, bei meinem KS, habe.

Generell: Ich bin sehr für detailierte/realistische Kampfscripts und das ewige Stein-Papier-Schere-Prinzip kann ich langsam nicht mehr sehen. Nur mich würde auch mal dein Kampfprinzip interssieren.

Du lässt jetzt (per Array) eine Einheit auf die andere los bis irgendwann eine Seite erledigt ist, richtig? Wenn du aber schon ein realistisches KS haben willst, so solltest du evtl. auch Dinge wie Taktik und vor allem "Rückzug" mit einbauen. Wenn du 2 Armeen gegenüberstellst dann wird im Normallfall zwar eine gewinnen aber Vernichtungsschlachten bis zum letzten Mann gabs meistens nur bei Glaubenskriegen.

Wie oben gesagt habe ich keine wirklichen Zeitergebnisse, doch statt Truppe für Truppe einzelnd zu berechnen lasse ich die ganze Schlacht rundenweise durchlaufen. Soll heissen: Beide Seiten schiessen gleichzeitig aufeinander, beide Seiten verlieren gleichzeitig Einheiten durch gegnerische Kugeln und beide Generäle bestimmen gleichzeitig den nächsten Zug. Spich es fliegen gleichzeitig 400k Gewehrkugeln durch die Luft und je nach Taktik und Fähigkeit (zusammen mit entsprechenden Zufall) trifft es eine gegnerische Einheit welcher der Kugel nichts entgegensetzen kann (also nen Panzer wird sich von nem Schwert kaum beeindrucken lassen).

Zeitlich braucht die Berechnung einer Runde (jetzt testweise 200000 vs 200000) 1.0-1.5 Sekunden. Wobei die durchschnittliche Zahl der Treffer (Verletzte, Tote) je nach Bonus zwischen 30000 und 50000 liegt. Nichtsdestotrotz ist der Sinn des Scripts aber, dass "individuelle" Truppen aufeinander Treffen. z.B. ein Panzerzug auf 2 gegnerische Infantrietruppen treffen welche dann mit Ari-Unterstützung ein Angriff starten.
gepostet vor 18 Jahre, 9 Monate von TheUndeadable
Also mal 1 Vergleich:
Schiesst im Militär schön jeder Soldat nach dem nächsten? Danach wird das selbe nochmals wiederholt?
Nein, es schiessen alle gleichzeitig. Was heisst?

=> Zuerst schiessen alle; werden alle getroffen. Anschliessend erst fallen diese tot um. Konsequenz; es kann auch in einem KS zu Double-Kills kommen.


Exakt so habe ich mein KS aufgebaut. http://nopaste.php-q.net/185823 (Zeile ab 223). Ansonsten würde ich mich Mudders Ausführung anschließen. Ich finde ein schön numerisch simuliertes Kampfskript auf Grund der möglichen Vielfalt interessanter.
gepostet vor 18 Jahre, 9 Monate von garyx7de
@Kampfhoernchen: schade, würde mich echt interessieren, glaube aber das ich nun eine ähnliche Variante entdeckt habe wo die ausführungszeit fast immer gleich sein sollte.

@Mudder: öhm hast glaub viel falsch verstanden. das KS ist wie bei OGame kannst du dir vorstellen wie wenn jeder eine Kugel hat und dann schießen darf. ganz grob

und wenn du ca 400k units pro runde berechnest dann will ich mal dein KS sehen. weil dann läufst du nicht Einheit für Einheit durch sondern machst Gruppenanzahl*angrifstäke und dann rechnest du das aus oder wie machst du das?
gepostet vor 18 Jahre, 9 Monate von Mudder
Ich habe ein "detailiertes" KS was primär für Taktikspiele im Stiele von Panzergeneral gedacht war. Multi-Einheiten-Kämpfe laufen über ein "General", wo entschieden wird welche Einheit gegen welche kämpfen soll. Hierbei können die Gruppen dann auch gesplitet werden - also das eine Infantriekompanie sich aufteilt um gegen die feindliche Infantrie und Panzer anzutreten. Der General ist leider noch ein Schwachpunkt da ich eben versuche die Vor/Nachteile der Einheiten aufeinander anzupassen und eben alle feindliche Einheiten belegen muss.

Die Einheiten (als Gruppe) haben individuelle Kampfwerte (Angriffs/Verteidigungswerte in verschiedene Klassen (Luft, Weiche-, Harte Ziele, Ari). Wenn nun die Truppen (entweder durch Spieler oder "General") aufeinander treffen wird die Truppe Soldat für Soldat durchgearbeitet und jeder Schuss simuliert). Dann wird (in Einbeziehung der Angriffs- und Verteidigungswerte) der Schaden errechnet und bei den jeweiligen Truppen abgezogen. (Wo Verletzte dann beim nächsten Kampf natürlich ausfallen.)

Die Berechnung mit den 400k waren jetzt nur 2x 200k starke Infantrieeinheiten welche Soldat für Soldat berechnet wurden (und von der Rechenzeit ist es dabei dann auch egal das es nur eine Einheitenwert ist.. die Daten hol ich auch nur aus Arrays und das ist eine Variable zum wechseln der Infantrie zu den Panzerwerten.

Auf diese Diskussion antworten