Spieleprogrammierung / Schlacht / Schere Stein Papier /

HC_Krieg

Grünschnabel
Hallo

Mir ging grade eine Idee durch den Kopf wo mir aber die Nötige Kreativität fehlt die auch umzusetzten.
Gut, zu meiner Idee ich hatte vor eine Kleine Mischung aus Schach und Schere Stein Papier in einem Mittelalterlichen Setting zu Programmiere ich habe mir das Vorgestellt das, das ganze erstmal Komplett ohne GUI auskommt.

Das Spielfeld würde ich mit einem Zweidimensionalem Array gestalten. Ich habe mir das etwa wie das hier Vorgestellt.

XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX


Das X bedeutet das es sich um ein leeres Feld handelt was dann später von einem Spieler durch einer der Drei Charaktere ersetzt wird.

Die Charaktere.

Bei den Charakteren habe ich mich erstmal auf Drei beschränkt.

Schwertkämpfer:
Der Schwertkämpfer kann in einem Zug sich in alle Richtungen bewegen, aber nur ein Feld.
Angreifen kann der Schwertkämpfer auch ein Feld in alle Richtungen um sich rum.

Rüstung: 100
Schaden: 50
Punkte: 1

Der Bogenschütze:
Der Bogenschütze kann sich durch die leichtere Rüstung pro zu zwei Felder bewegen.
Durch den Bogen hat er eine erhöhte Reichweite von drei feldern.

Rüstung: 50
Schaden: 65
Punkte: 2

Der Reiter
Der Reiter kann sich auf Grund des Pferdes vier Felder pro zu bewegen.
Der Reiter hat aber auch nur eine Reichweite von einem Feld um sich herum.
Durch die Stärke von dem Reiter wurde die Anzahl wird die Anzahl der Reiter auf zwei limitiert.

Rüstung: 100
Schaden: 50
Punkte: 3

Gut das Waren die erstmal drei Einheiten die ich mir Vorgestellt habe, aber ob das wirklich nur die Drei bleiben steht noch nicht genau fest, wenn ihr Änderungen an den Einheiten habt die das Balancing verbessern, immer raus damit.

Dann einmal zu dem Spiel.
Beide Spieler haben zu beginn Zehn Punkte in die Einheiten zu Verteilen, Welche der Spieler gerne einsetzten würde.
Die Einheiten lassen sich dann in einem Bereich von zwei Feldern vom Bildschirmrand aufstellen.

Dann beginnt das Spiel, der Erste Spieler beginnt und zieht eine Einheit die mögliche Feld Anzahl, danach wäre der andere Spieler an der Reihe und immer weiter.
Am Ende hätte dann der Spieler Verloren der keine Einheiten mehr hat.


Das Währe das Ganze aber leider habe ich kein Plan wie ich das Programmieren könnte, wie gesagt den Spielplan hätte ich schon mal. Dann müsste man halt die Koordinaten besetzten wo die Spieler die einheiten hintun.
Ich Glaube das Schwierigste wird werden, wie man das in kriegt das die Spieler Abwechselnd ziehen und dabei nur ihre eigenen Einheiten bewegen können.

Dann muss noch die Reichweite der Einheiten bestimmt werden und halt wie viel Schaden die einstecken und Austeilen können.
 
Hallo HC_Krieg

Das ist jetzt bisschen schwer einfach so pauschal ohne Ansatz zu sagen, aber grundsätzlich ist der Einstieg nicht so schwer. Am besten beginnst du einfach mal deine Situation zu modellieren.

Da die Einheiten relativ übersichtlich sind und auch relativ wenige Komponenten haben würde ich nicht mit dem ECS-Pattern arbeiten. Hier kommt es halt draufan wie weit du das ganze treiben willst. Bisher scheint relativ viel noch im "vorerst"-Bereich zu sein und du kannst dir offenbar vorstellen das noch wesentlich zu verändern. Nicht empfehlenswert. Während in vielen anderen Bereichen des Lebens es vorteilhaft ist sich einfach Stück für Stück immer weiter zu angeln bis man zufrieden ist habe ich damit in der Programmierung schlechte Erfahrungen gemacht. Definier dein Endziel mit allem was drin sein soll und nicht verschiedene Plateaus an denen du vorerst mal aufhörst. Die neuen Sachen die du dann einfügen willst lassen sich unter Umständen wenn du sie von Anfang an geplant hättest mit einem anderen Pattern viel einfacher implementieren.

Aber eben, wie gesagt, ECS in der Form wie du es hier beschreibst nicht empfehlenswert. Ich würde auf einen einfachen hierarchischen Ansatz zurückgreifen
Basisklasse: Unit
Reiter erbt von Unit
Bogenschütze erbt von Unit
Schwertkämpfer erbt von Unit

Unit implementiert die ganzen gemeinsamen Funktionalitäten wie Bewegung, Kampf, Teamzugehörigkeit, usw. Die abgeleiteten Klassen geben der Unit-Klasse die Parameter für die Bewegung, den Kampf und so weiter.

Als weiteres hast du deine Spielfeldklasse. Das Spielfeld wiederum sollte nicht einfach ein zweidimensionales Array mit X, 1 oder 2 sein, sondern du solltest eine Klasse für Felder haben und das Spielfeld ist ein entsprechender Container dieser Felder. Die Felder speichern zum Beispiel welche Unit gerade drauf ist usw.

Die rundenbasierten Züge dürften keine allzu schwere Aufgabe sein, du liest vom User einfach das Feld ein auf dem die Figur steht, die bewegt werden soll. Anschliessend hast du ja die Feld-Klasse bei der du abfragen kannst, ob darauf eine Unit steht und wenn ja welche Teamzugehörigkeit (ein Property von Unit) die Unit hat. Damit hast du das eigentlich schon abgedeckt.

Viele Grüsse
Cromon
 
Hi HC_Krieg,
ich muss sagen dass ich die Idee die du hier vorstellst ganz interessant finde. Ich verstehe zwar noch nicht was das mit Schere, Stein, Papier zu tun hat :D,
aber die Grundidee gefällt mir (so etwas ähnliches kam doch glaube ich im ersten Harry Potter Film vor?).
Eine gute Implementierung dieses Spiels würde mich sogar reizen es mal auszuprobieren ;-)

Ich denke Cromon hat schon ein paar gute Ansätze gezeigt, du solltest dir eine Klasse "Spielfeld" schreiben, und eine Elternklasse "Einheit" von der du dann für die unterschiedlichen Typen jeweils eine Tochterklasse ableitest (da ich nicht weiß wie gut du in C++ schon bewandert bist gebe ich dir hier mal das Stichwort Vererbung). Wenn du die Klassen hast, musst du in sie einige Hilfsfunktionen integrieren. Du brauchst z.B. eine Funktion die Gegner in Reichweite erkennt und "angreift". Die Programmlogik bleibt dann relativ übersichtlich, wie der folgende Pseudocode hoffentlich veranschaulicht:
C++:
include-Gedöns
.
.
.
Klassen-Gedöns
.
Hilfsfunktionen-Gedöns (gerne auch prototypes verwenden)
.
.
int main(Parameter falls nötig)
{
    while (Feldklasse.SpielBeendet == false){
        Feldklasse.GetInput(SpielerNummer = 1) //empfange Eingaben von Spieler 1
        Feldklasse.update() //update Feldklasse ---> Funktion "angriff" wird für jede Einheit aufgerufen
        if (Feldklasse.SpielBeendet == true) //falls jetzt Spieler 1 gewonnen hat...
            break //... beende Spiel
        Feldklasse.GetInput(SpielerNummer = 2) //empfange Eingaben von Spieler 2
        Feldklasse.update() //update Feldklasse ---> Funktion "angriff" wird wieder für jede Einheit aufgerufen
    }
    //fasse hier nochmal Punktestand, Statistiken, etc zusammen
}
Das ist natürlich kein fertiger Code, aber ich hoffe ich konnte zeigen, dass die wahre Arbeit in den Klassen und Hilfsfunktionen steckt :)

Bezüglich der Funktion "angriff" hätte ich auch noch zwei logische Fragen:
1) Wenn in der Reichweite einer Einheit mehrere feindliche Einheiten stehen, werden dann alle gleichzeitig angegriffen? Und mit welchem Schaden?
2) Wenn eine Einheit eine feindliche Einheit angreift, aber nicht tötet, schlägt dann die feindliche Einheit beim nächsten Zug automatisch zurück?

Wenn du Gefallen daran findest so ein Spiel zu Programmieren, dann kann ich dir raten bleib am Ball!

Ich bin gespannt was aus der Idee wird.
Gruß Technipion

PS: Über die Grafik würde ich mir jetzt nicht den Kopf zerbrechen, soll ja kein 3D-Monster werden, sondern da dürfte was Einfaches reichen.
 
Zurück