rundenbasiertes Multiplayerspiel

Du hast eine Idee für ein Projekt?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Hyperion hat geschrieben:Wenn ich diagonal ziehen kann, dann habe ich bei quadratischen Feldern 8 Möglichkeiten ;-)
Diagonal kostet es aber 1,5 (bzw. math.sqrt(2)) Bewegungspunkte.
Hyperion hat geschrieben:Wo ist dabei das "Problem" bzw. der Unterschied, ob ich per Kante an etwas grenze oder nur per Ecke?
Das ist eben genau dieser Unterschied in der Wertigkeit bei einer Bewegung.

Mir persönlich ist es auch egal ob das jetzt Dreiecke, Quadrate, Sechsecke oder frei gemalte Gebiete sind. Hauptsache das Spiel funktioniert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

/me hat geschrieben:
Hyperion hat geschrieben:Wenn ich diagonal ziehen kann, dann habe ich bei quadratischen Feldern 8 Möglichkeiten ;-)
Diagonal kostet es aber 1,5 (bzw. math.sqrt(2)) Bewegungspunkte.
Sagt der Papst? :D
Mal im Ernst: Bei einem "Raster"-System empfinde ich so eine Berechnung von Distanzen im R² als unintuitiv. Ich kann sehr einfach definieren, dass ein diagonaler Zug auch genau 1 kostet ;-)

Letztlich kann ich die Struktur der Felder unterschiedlich interpretieren; ich sehe da irgend wie eine Graphstruktur vor mir, in der Knoten über Kanten mit anderen Knoten verbunden sind. Ein Feld stellt dabei einen Knoten dar. Wenn ich diagonal ziehen kann, dann gibt es eben (max) 8 Kanten zu den Nachbarknoten:

Code: Alles auswählen

o o o
|\|/|
o-o-o
|/|\|
o o o
Mir ist jetzt kein Spiel bekannt, wo diese Art der Distanz für die Zugberechnung offensichtlich so verwendet wird, wie Du es hier vorschlägst. Kennst Du eines?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich habe vorhin noch mal ein paar eigene Regeln aufgeschrieben: Taugt das was?


Ziel: Die meisten Heimatwelten nach X Runden.

Setup: Auf einer schachbrettartigen Karte mit WxH Sektoren gibt es pro Sektor MAX(0, W6-2) Welten, d.h. die Karte hat durchschnittlich WxHx1,5 Welten, für W=H=10 also 150. Je Welt hat eine Größe von W6-1, d.h. im vorherigen Beispiel jede Größe 25x. Eine Welt kann unbesiedelt sein (der Startzustand), einen Außenposten haben, eine Koloniewelt oder eine Heimatwelt sein. Es gibt N Spieler (für W=H=10 vielleicht N=12). Jeder Spieler startet auf einer zufällig ausgewählten Welt, deren Status auf Heimatwelt und deren Größe auf 5 gesetzt wird. Er startet mit 25 - (Summe der Größen aller Welten im selben Sektor) Ressourcen.

Einheiten: Es gibt Raumschiffe und Bodentruppen, die jeweils einem Spieler gehören. Raumschiffe befinden sich immer in einem Sektor, wo jeweils alle Raumschiffe eines Spieler eine Flotte bilden. Flotten können sich in einen Nachbarsektor (nicht über Eck) bewegen. Bodentruppen befinden sich auf einer Welt oder sind Teil einer Flotte. Jedes Raumschiff kann maximal eine Bodentruppe transportieren.

Ressourcen: Welten mit Außenposten, Koloniewelt oder Heimatwelt erzeugen am Ende jeder Runde entsprechend ihrer Größe Ressourcen, die entweder verbaut oder mit einer Flotte abtransportiert werden können, wobei ein Raumschiff maximal 3 Ressourcen transportieren kann. Ein Außenposten kann, statt Ressourcen zu produzieren, zu einer Koloniewelt ausgebaut werden und eine Koloniewelt entsprechen zu einer Heimatwelt.

Kampf: Raumschiffe, die nichts transportieren, können gegen andere Raumschiffe im selben Sektor kämpfen und Welten bombardieren. Raumschiffe, die Bodentruppen transportieren, können diese auf einer Welt landen. Bodentruppen können gegeneinander auf der selben Welt kämpfen. Der Kampf findet in 3 Phasen statt. Pro Phase zerstört jedes Raumschiff ein gegnerisches Raumschiff mit W6>=5. Bei 6 wird noch einmal gewürfelt. Hat eine Seite mindestens 3x so viele Raumschiffe wie die andere, gilt W6>=4. Wurde eine Seite vernichtet, endet der Kampf vorzeitig. Bodentruppen und Ressourcen, die nicht mehr transportiert werden können, werden vernichtet. Ein bombardierendes Raumschiff wird von jeder Bodentruppe bei W6=6 vernichtet und greift 3x mit den üblichen Regeln an, d.h. bei W6>=5 (6 nachwürfeln) und +1 bei 3:1 oder besser. Gehören die Bodentruppen dem selben Spieler wie die Welt, gilt W6=6. Wird eine Heimatwelt beim Bombardieren 5x getroffen nachdem alle Bodentruppen vernichtet wurden, wird sie zu einer Koloniewelt heruntergestuft. Eine Koloniewelt wird zum Außenposten heruntergestuft und ein Außenposten vernichtet (man kann eigene Welten bombardieren).

Bauen: Raumschiffe können für 1 Ressource auf Heimatwelten gebaut werden. Bodentruppen können für 1 Ressource auf Koloniewelten oder Heimatwelten gebaut werden. Es kostet 1 Raumschiff und 3 Ressourcen (die die Flotte des Raumschiffs mitführen muss), um auf einer leeren Welt einen Außenposten zu errichten.

Rundenabfolge: Bodentruppen und Ressourcen können in eine Flotte übernommen werden oder auf einer eigenen Welt abgesetzt werden, aber nicht beides. Raumschiffe und Bodentruppen können gebaut werden. Flotten können bewegt werden, wenn die Transportkapazität ausreicht. Bewegung findet gleichzeitig statt, Flotten können also Plätze tauschen. Treffen Flotten unterschiedlicher Spieler zusammen, kommt es zu einem Kampf. Nach dem Raumkampf kann jedes Raumschiff, das nichts transportiert, eine Welt bombardieren. Raumschiffe, die Bodentruppen transportieren, können diese absetzen. Sie werden bei W6=6 zerstört, wenn gegnerische Bodentruppen vorhanden sind. Danach findet der Bodenkampf statt. Gewinnt der Angreifer, wechselt die Welt den Besitzer. Gibt es keinen Besitzer, kann stattdessen ein Außenposten gegründet werden. Versuchen dies mehrere Spieler gleichzeitig, entscheidet der Zufall. Zum Schluss werden Ressourcen erhöht.


Erweiterung: Sternentore. Ein Sternentor kostet 5 Ressource auf einer Heimatwelt. Es ist eine Einheit, die wie Bodentruppen auf einer Welt oder in einer Flotte sein kann. Es braucht 10 Raumschiffe, um ein Sternentor zu transportieren. Eine Flotte kann, statt zu einem Nachbarsektor zu fliegen, auch durch einen Sternentor auf einer Welt im selben Sektor zu einem anderen eigenen Sternentor fliegen, welches sich auf einer Welt oder in einer Flotte befinden darf.

Erweiterung: Flotten können statt Bewegung den stehenden Befehl bekommen, im Falle eines Kampfes in einen Nachbarsektor zu fliegen, wenn sie nicht selbst in einem Kampf sind. Diese Raumschiffe kommen erst in Phase 2 des Kampfes an.

Erweiterung: Schnellere Raumschiffe: Für 2 oder 3 Ressourcen können Raumschiffe gebaut werden, die 2 oder 3 Sektoren weit fliegen können. Zusammen mit der Erweiterung Sternentore zählt ein Transfer durch ein Tor als ein Schritt.

Erweiterung: Allianzen. Spieler A kann Spieler B als Bündnispartner erklären und wenn B dies mit A auch tut, greifen sich Einheiten nicht gegenseitig an. Außerdem können die Sternentore des jeweils anderen Spielers mitbenutzt werden.

Erweiterung: Pro Welt können mehrere Außenposten und Kolonien unterschiedlicher Spieler errichtet werden, es kann jedoch nur die Heimatwelt eines Spielers sein. Bei Größe G bekommt jeder Spieler dann G - Anzahl(andere Spieler) Ressourcen und nochmals -1, wenn ein anderer Spieler eine Heimatwelt errichtet hat. Alle Angriffe anderer Flotten und Außenposten oder Kolonien müssen explizit angegeben werden.

Stefan
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Klingt schon ganz gut, wobei ich einige Dinge wohl puristischer gestalten würde.

- Worin unterscheiden sich "Außenposten", "Kolonialwelt" und "Heimatwelt"?
- Wie nehme ich Ressourcen ein? Werden diese auch von existierenden Einheiten verbraucht?
- Wonach genau richtet sich der Kampf bei mehreren (>2) Beteiligten? Also welcher Spieler hat die "Initiative"?

Ich sehe hier vor allem ein Problem: Bei so vielen Planeten dürfte das eine ziemlich zähe Angelegenheit werden ;-) Evtl. sollte man die Anzahl an Systemen reduzieren...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Da ich das ganze selbst nie ausprobiert habe, will ich nicht bestreiten, dass es zäh oder sonstwie langweilig sein könnte. Ich habe einige Parameter demonstrativ beliebig gehalten, weil ich denke, dass man hier Einstellungen vornehmen muss.

Außenposten sind einfach nur da. Man kann dort nichts bauen. Sie zählen nicht für den Sieg. Auf Koloniewelten kann man Bodentruppen bauen, auf Heimatwelten auch Raumschiffe. Heimatwelten zählen für den Sieg, d.h. wer die meisten Heimatwelten kontrolliert, hat gewonnen.

Wer einen Außenposten etc. auf einer Welt errichtet hat, kontrolliert diese Welt und bekommt am Ende jeder Runde entsprechend der Weltgröße Ressourcen auf dieser Welt gutgeschrieben. Das hatte ich nicht so explizit geschrieben. Existierende Einheiten mit Ressourcen zu unterhalten hielt ich für entbehrlich.

Zum Kampf mit mehr als zwei Beteiligten habe ich mir keine Gedanken gemacht. Die einfachste Lösung könnte sein, dass in einem Kampf für jedes Schiff ein zufälliges Ziel aus allen Schiffen aller anderen Spieler ausgesucht wird. Kompliziert ist da eher die Parteien zu bestimmen, wenn es Allianzen gibt, denn Spieler A könnte mit B und C verbündet sein, während sich B und C prügeln wollen. Was macht jetzt A?

Was die Menge der Welten angeht: Bei (im Schnitt) 150 gibt es 25 pro Größe. Da ich Spielern eine Heimatwelt der Größe 5 geben wollte, das aber nicht die einzigen sein sollten, kam ich so auf 12 Spieler. Das wiederum bedeutet, dass jeder Spieler 12,5 Welten (von denen 2 nix taugen, weil Größe 0) verwalten muss, bis er ohne Konflikt nicht weiter wachsen kann.

Hier ist eine Alternative: Die Größe beträgt W6/2 (aufrunden). Auf einer Welt Größe 1 kann ein Außenposten errichtet werden, der 1 Ressource pro Runde bringt. Auf einer Welt Größe 2 kann der Außenposten zu einer Koloniewelt ausgebaut werden, was dann 2 Ressourcen bringt. Welten der Größe 3 können Heimatwelten werden, was 3 Ressourcen bringt. Eine Heimatwelt kann zu einer Industriewelt ausgebaut werden, was 4 Ressourcen bringt. Auf einer Koloniewelt kann ich 1 Ressource in 3 Bodentruppen umwandeln. Auf einer Heimatwelt kann ich 1 Ressource in 2 Raumschiffe umwandeln. Auf einer Industriewelt kann ich 4 Ressourcen in ein Sternentor umwandeln.

Bei 10 Spielern könnte ich 90 Welten ansetzen, wodurch ist auf eine Kartengröße von 9x7 komme. Hier ist eine Beispielkarte (Zahlen geben die Anzahl der Welten pro Sektor an):

Code: Alles auswählen

0 3 1 3 1 4 1 0 2
1 4 1 0 0 3 0 3 2
1 0 0 0 0 2 0 4 4
2 0 0 0 1 4 4 2 0
1 3 3 1 0 3 4 0 3
3 0 1 0 4 2 0 0 1
2 0 2 1 1 0 1 1 3
Oder ich setze 60 Welten an, was bei einer Kartengröße von 7x6 zu so einer Sektorkarte führen kann:

Code: Alles auswählen

0 2 0 3 0 0 0
0 0 0 4 0 0 2
0 4 4 4 1 0 2
1 1 1 1 2 0 3
1 1 1 2 1 2 2
2 4 2 1 3 4 0
Stefan
Krabman318
User
Beiträge: 21
Registriert: Sonntag 14. August 2011, 14:36

Hyperion hat geschrieben:(...) Ansonsten ist mir noch Konquest eingefallen. Das wäre auch mit reiner Textausgabe leicht darstellbar und vom Spielprinzip passend.
Gibt es dazu auch die kompletten Spielregeln?
BlackJack

@Krabman318: Die stehen auf jeden Fall in den C++-Dateien. ;-)
Krabman318
User
Beiträge: 21
Registriert: Sonntag 14. August 2011, 14:36

BlackJack hat geschrieben:@Krabman318: Die stehen auf jeden Fall in den C++-Dateien. ;-)
Leider schlägt der Download bei mir immer fehl, wegen eines "checksum error". :K
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Lionhard hat geschrieben:Mach doch ein spiel sowas in die art Paintball wo man sich kaputt schiesen soll :) zb. es spielen 4 spieler einer auf w,a,s,d,f der zweite auf i,j,k,l,o der dritte auf Arrow Keys - links, rechts, oben, unten, Enter, und der vierte auf 1,2,3,6. O, Enter, F, 6 ist Schiesen das andere bewegen. Die runde wird zb. 5 minuten haben und wer am ende am meisten Kills hat, hat die Runde gevonnen, es werden 3 runden dan wird es alles zusammen gerechnet und wer am meisten hat, hat das Spiel gevonen.
Und nicht vergessen dabei zu hoffen, dass die Tastatur des Users n-key-Rollover unterstützt und an PS/2 angeschlossen ist, denn bei USB ist spätestens nach der vierten gleichzeitig gedrückten Taste Schicht im Schacht. Und deine Idee klingt auch eher nach Echtzeit als nach rundenbasierten Spiel.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten