Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

06.11.2016, 21:34

Life Link Algorithmus

Guten Abend,

ich bin gerade an einer Stelle angekommen, an der ich keine simple Lösung finde, um das Problem anzupacken.

In meinem Spiel sollen mehrere Units praktisch einen geteilten HP Pool besitzen. Prinzipiell recht einfach, allerdings soll das Sterben der einzelnen Units weitestgehend vermieden werden.

Beispiele:
Unit A hat 100 HP, Unit B 10 HP. Unit A erleidet nun 100 Schaden und würde ohne den Life Link sterben. Da es aber den LifeLink besitzt, teilt es den Schaden mit Unit B. Grundlegend würde hier eine Damage / N (Anzahl der Member) ausreichen, aber da Unit B schon weniger HP besitzt als Damage/2, soll das besonders behandelt werden. Hier würde sich eine Verteilung von 91 (A 9 HP Rest) und 9 (B 1 HP Rest) anbieten.

Würde jetzt 109 Schaden zugefügt werden, müsste einer der Beiden sterben. Welcher davon ist mir prinzipiell egal, darf sich der Algorithmus gerne selbst aussuchen.

Abschließend hätten wir dann noch den Sonderfall, dass Damage >= 110. Da würden einfach beide sterben.


Hat hier jemand eine Idee, wie ich das am Geschicktesten umsetzen kann?

Mfg

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

06.11.2016, 22:11

Warum in deinem Beispiel ausgerechnet 91:9 aufteilen? Was zeichnet diese Lösung aus, dass sie besser ist als 92:8, 93:7, 94:6, ... 99:1? Ohne ein sinnvolles (berechenbares) Kriterium kannst du auch keinen passenden Algorithmus finden.

Nachtrag: Ein offensichtlicher Algorithmus für eine beliebige Lösung wäre, dass du jede der N Einheiten erst einmal höchstens Damage/N Schaden nehmen lässt - wenn eine Einheit sterben würde, dann übernimmt sie nur so viel Schaden, dass sie gerade noch am leben bleibt. Den übrig gebliebenen Schaden teilst du dann rekursiv weiter auf die übrigen Einheiten auf. Aber ich weiß nicht, ob das deine (nicht genannten) Optimalitätskriterien erfüllt.

3

06.11.2016, 22:15

Im Prinzip ist mein Ansatz, Damage / N soweit möglich auch umzusetzen. Da B nunmal nur 10 hat, aber 50 zugefügt werden sollen, bleiben die 41 als Rest und dieser Rest wird auf die restlichen Units aufgeteilt. In diesem Fall eben auf A, welches dann eben 50 + 41 Schaden erleidet.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

06.11.2016, 22:16

Ja, siehe mein Edit.
Und was ist jetzt das Problem?

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

5

06.11.2016, 22:17

Das ist imho primär eine Designfrage.

Hiermal wie ich das angehen würde, relativ naiv aufgeschrieben:
1) Teile den erlittenen Schaden durch die Anzahl an Einheiten im "Pool"
2) Überprüfe für jede Einheit, ob sie sterben würde, wenn man ihr den Schaden zufügen würde
2.1) Falls ja und der Gesamtschaden ist kleiner als die Gesamt-HP im Pool:
2.1.1) Nimm dieser Einheit so viel Schaden weg, damit sie noch überlebt(zurück auf 1)
2.1.2) Ziehe der Einheit den Schaden ab
2.1.3) Gehe mit dem Restschaden zurück zu Schritt 1
2.1.4) Entferne die Unit aus dem Pool(nur temporär für weitere Berechnungen)
2.2) Falls ja und der Gesamtschaden ist größer oder gleich der Gesamt-HP im Pool:
2.2.1) Ziehe den Schaden ab und lass die Einheit serben
2.2.2) Der "Overkill"-Schaden wird erhalten
2.2.3) Mit dem Restschaden(+ Overkillschaden) zurück zu Schritt 1
2.2.4) Entferne die Unit aus dem Pool(nur temporär für weitere Berechnungen)
2.3) Falls nein, ziehe einfach den Schaden ab, entferne sie aber nicht aus dem Pool

Sähe dann bspw so aus:
https://i.gyazo.com/efba67adec8760343536d8fa839562be.png

Man könnte hier dann einfach bei der ursprünglichen Berechnung, wie viel DMG auf eine einzelne Einheit abgelegt wird, auf verschiedene Kriterien abändern. Bspw die Unit mit dem höchsten Anteil an HP im Pool bekommt von vornherein mehr Schaden, und nicht erst wenn die anderen auf 1 gehen. Aber wie am oben genannten Beispiel läuft das wahrscheinlich eh aufs gleiche hinaus, vorausgesetzt die Einheiten bekommen wirklich immer zusammen Schaden, und niemals einzeln.
WIP Website: kevinheese.de

6

06.11.2016, 22:18

Wie gesagt, es ist kein unlösbares Problem für mich, ich suche nur eben den besten Ansatz um das mit so wenig wie möglich Durchläufen zu erreichen.

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

7

06.11.2016, 22:19

Wie gesagt, es ist kein unlösbares Problem für mich, ich suche nur eben den besten Ansatz um das mit so wenig wie möglich Durchläufen zu erreichen.


Denke mal wenn du bei der Erstberechnung direkt schaust, wer am meisten HP hat, kannst du damit am effektivsten die Anzahl an Durchläufen reduzieren. Müsstest du aber einfach mal testen(die gute alte Konsole :P)
WIP Website: kevinheese.de

8

06.11.2016, 22:21

Wie gesagt, es ist kein unlösbares Problem für mich, ich suche nur eben den besten Ansatz um das mit so wenig wie möglich Durchläufen zu erreichen.


Denke mal wenn du bei der Erstberechnung direkt schaust, wer am meisten HP hat, kannst du damit am effektivsten die Anzahl an Durchläufen reduzieren. Müsstest du aber einfach mal testen(die gute alte Konsole :P)

Ist gar kein schlechter Einfall, das direkt nach HP zu sortieren. Nur würde ich das dann eben aufsteigend statt absteigend. Damit hätte man die Sonderfälle direkt vorne angereiht. Danke dafür ;)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

06.11.2016, 22:25

Warum muss das denn super effizient laufen? Das ist doch nichts, was Millionen mal pro Sekunde passiert.

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

10

06.11.2016, 22:27

Vielleicht macht er ja auch ein Dronen-RTS. :D
WIP Website: kevinheese.de

Werbeanzeige