Marvin Esse: Programmiertechnik bei Spiel als Projektarbeit

Hallo an alle,

im Rahmen einer Projektarbeit an meiner Schule möchte ich ein kleines Spiel für 2 Spieler programmieren. Em Ende soll das über das Internet gegeneinander spielbar sein. Dabei geht es um eine Spielfläche mit erstmal 6x6 Felden, auf denen bildlich auf jedem Feld ein leerer Eimer steht. Gespielt wird abwechselnd und jeder Spieler kann einmal einen seiner oder noch freien Eimer mit einer Portion gefärbtes Wasser auffüllen (Spieler 1 blaues Wasser, Spieler 2 rotes Wasser).

Das Fassungsvermögen des Eimers hängt von den benachbarten Feldern ab (nur waagerecht und senkrecht). Also ein Eimer in der Ecke kann 2 Portionen fassen, ein Eimer am Rand 3 und ein Eimer in der Mitte dann 4. Füllt ein Spieler einen Eimer bis zum Fassungsvermögen, leert er sich komplett und verteilt den Inhalt gleichmäßig auf die 4 benachbarten Eimer. Übervolle Eimer verteilen nur immer 1 Portion auf die benachbarten Felder, der Rest bleibt im Eimer.

An jetzt wird es interessant: Wenn der benachbarte Eimer damit auch voll ist, leert dieser sich auch usw. So können regelrechte Wellen hin und her entstehen. Nur so können auch die Felder des Gegenspielers übernommen werden.

Gewonnen hat der, der alle Eimer eingenommen hat.

Nun mein Problem: Ich könnte ganz einfach immer von ersten Feld bis zum letzten Feld durchgehen, ob ein Eimer überfüllt ist und das so oft machen, bis nichts mehr zu tun gibt. Aber das gibt dann nicht den optischen Effekt, dass es sich wie eine Art Welle ausbreitet.

Gibt es dafür vielleicht Beispiele? Ich hab richtige Idee, wonach ich suchen muss, um bei Google geeignete Ergebnisse zu erhalten.

Liebe Grüße,

Marvin

  1. Tach,

    im Rahmen einer Projektarbeit an meiner Schule möchte ich ein kleines Spiel für 2 Spieler programmieren. […] Gewonnen hat der, der alle Eimer eingenommen hat.

    das klingt nach KJumpingcube; da könntest du mal in den Quelltext schauen, wie es da gelöst ist.

    Nun mein Problem: Ich könnte ganz einfach immer von ersten Feld bis zum letzten Feld durchgehen, ob ein Eimer überfüllt ist und das so oft machen, bis nichts mehr zu tun gibt. Aber das gibt dann nicht den optischen Effekt, dass es sich wie eine Art Welle ausbreitet.

    Gibt es dafür vielleicht Beispiele? Ich hab richtige Idee, wonach ich suchen muss, um bei Google geeignete Ergebnisse zu erhalten.

    Du könntest z.B. immer zuerst die Nachbarn des aktuellen Feldes betrachten und dir gleichzeitig merken in welche Richtung das letzte Kippen standfand und dann diese Richtung bevorzugen.

    mfg
    Woodfighter

    1. Guten Morgen,

      das klingt nach KJumpingcube; da könntest du mal in den Quelltext schauen, wie es da gelöst ist.

      Ja, das sieht vom Spielprinzip identisch aus.

      Du könntest z.B. immer zuerst die Nachbarn des aktuellen Feldes betrachten und dir gleichzeitig merken in welche Richtung das letzte Kippen standfand und dann diese Richtung bevorzugen.

      Klar, dass ich mit de aktuellen Feld anfange, mit den anderen wird ja erstmal nichts passieren. Aber es fängt schon damit an, wie ich die Felder am Besten kennzeichne, damit ich am einfachsten an die Nachbarfelder rankomme. Wenn ich die Felder einfach durchnumeriere, also von 1 bis 36, kann ich dann berechnen, welche Nachbarfelder es sind und ob das Feld eine Ecke, Seite oder Mitte ist?

      Oder besser wie ein mehrdimensionales Array Spielfeld[Zeile][Spalte]?

      Liebe Grüße,

      Marvin

      1. Tach!

        Aber es fängt schon damit an, wie ich die Felder am Besten kennzeichne, damit ich am einfachsten an die Nachbarfelder rankomme. Wenn ich die Felder einfach durchnumeriere, also von 1 bis 36, kann ich dann berechnen, welche Nachbarfelder es sind und ob das Feld eine Ecke, Seite oder Mitte ist?

        Das kann man leicht rechnen. Je nachdem, ob du waagerecht oder senkrecht zählst, Feldnummer geteilt durch Anzahl der Spalten/Zeilen ergibt die Zeile/Spalte, der Rest ist Spalte/Zeile. Von X und Y zur Feldnummer wird multipliziert und addiert.

        Du kannst aber auch durch einfache Addition und Subtraktion das Feld links und rechts daneben ermitteln und die Felder oben und unten durch Addition/Subtraktion der Zeilen-/Spaltenanzahl. Du brauchst dann noch ein paar Bedingungen, um die Randfelder zu erkennen.

        Oder besser wie ein mehrdimensionales Array Spielfeld[Zeile][Spalte]?

        Damit hast du andere Rechen- und Vergleichsschritte und sparst gegenüber dem ersten Vorschlag die Umrechnerei, zum zweiten sollte der Aufwand ungefähr gleich sein.

        dedlfix.

  2. Tach!

    [Spielerklärung]

    Ich kenne das mit Atomen/Molekülen. Die Atome bilden Moleküle und wenn es bereits 4 sind, verbleibt eins im Spielfeld und die anderen verteilen sich in alle 4 Himmelsrichtungen (zuzüglich Sonderbedingungen am Rand). Überlaufende Eimer, die sich dann komplett entleeren, empfinde ich etwas unglaubwürdig.

    Ich könnte ganz einfach immer von ersten Feld bis zum letzten Feld durchgehen, ob ein Eimer überfüllt ist und das so oft machen, bis nichts mehr zu tun gibt. Aber das gibt dann nicht den optischen Effekt, dass es sich wie eine Art Welle ausbreitet.

    Dann musst du beim überlaufende Eimer beginnen und die vier Nachbarn in die Queue legen. Und dann die Queue abarbeiten, wobei die sich immer wieder füllt, wenn da was überläuft.

    dedlfix.

    1. Guten Morgen,

      Ich kenne das mit Atomen/Molekülen. Die Atome bilden Moleküle und wenn es bereits 4 sind, verbleibt eins im Spielfeld und die anderen verteilen sich in alle 4 Himmelsrichtungen (zuzüglich Sonderbedingungen am Rand). Überlaufende Eimer, die sich dann komplett entleeren, empfinde ich etwas unglaubwürdig.

      Kennst Du da vielleicht eine Seite, wo man sich das anschauen kann?

      Dann musst du beim überlaufende Eimer beginnen und die vier Nachbarn in die Queue legen. Und dann die Queue abarbeiten, wobei die sich immer wieder füllt, wenn da was überläuft.

      Das mit der Queue ist glaube ich ganz gut. Bin mir nur nicht sicher, ob und wie ich damit diese "Welle" hinbekomme. Wobei ich das eventuell doch vom Zufall abhängig mache, damit es nicht eventuell ein Vorteil ist, wenn man auf einer bestimmten Seite anfängt.

      Liebe Grüße Marvin

      1. Tach!

        Ich kenne das mit Atomen/Molekülen. Die Atome bilden Moleküle und wenn es bereits 4 sind, verbleibt eins im Spielfeld und die anderen verteilen sich in alle 4 Himmelsrichtungen (zuzüglich Sonderbedingungen am Rand). Überlaufende Eimer, die sich dann komplett entleeren, empfinde ich etwas unglaubwürdig.

        Kennst Du da vielleicht eine Seite, wo man sich das anschauen kann?

        Nein, weil ich das schon vor Jahzehnten (wie die Zeit vergeht...) auf heute kaum noch vorhandenen Rechnern spielte.

        In der Ecke explodierte es beim zweiten Atom, an der Kante beim dritten und in der Mitte beim vierten. Man kann das aber auch erst eins später machen, dann bleibt das draufgesetzte im Feld zurück und die bisherigen verteilen sich.

        Dann musst du beim überlaufende Eimer beginnen und die vier Nachbarn in die Queue legen. Und dann die Queue abarbeiten, wobei die sich immer wieder füllt, wenn da was überläuft.

        Das mit der Queue ist glaube ich ganz gut. Bin mir nur nicht sicher, ob und wie ich damit diese "Welle" hinbekomme. Wobei ich das eventuell doch vom Zufall abhängig mache, damit es nicht eventuell ein Vorteil ist, wenn man auf einer bestimmten Seite anfängt.

        Die Welle ergibt sich von selbst, weil sie sich von Nachbar zu Nachbar fortsetzt. Bei ausreichend kleinem Spielfeld sollte man nicht sehen, dass es sich mit der Zeit auf Gebiete konzentriert und die anderen Gebiete später drankommen, statt gleichzeitig stattzufinden.

        dedlfix.

  3. Hallo,

    dank Eurer Mithilfe (insbesondere dedlfix) funktioniert es (glaube ich) schon ganz gut. Bei den noch anstehenden optischen Verbesserungen ist mir aber noch eine Frage aufgekommen: Was für Voraussetzungen benötige ich, wenn das Spiel über 2 getrennte Rechner spielbar sein soll?

    Kann das mit einer einzigen Webseite (Datei) überhaupt funktionieren? Wenn alle eventuell notwendigen Konfigurationen vorhanden wären? Ich habe beim Googeln das Stichwort "Websockets" gefunden. Hilft mir das weiter?

    Liebe Grüße,

    Marvin

    1. Tach!

      Was für Voraussetzungen benötige ich, wenn das Spiel über 2 getrennte Rechner spielbar sein soll?

      Ein Webserver wird benötigt. Und eine Kommunikation vom Server zum Browser. Die Kommunikation in diese Richtung hat einige technische Schwierigkeiten. Deshalb geht ein Verbindungsaufbau immer vom Client aus. Wenn dann eine Verbindung steht oder quasi steht, kann auch der Server darüber Daten senden. Recht neu sind Websockets, andere Methoden sind Long Polling und Forever Frame. Die aktuellen Browser können Websockets, auf Serverseite musst du schauen, ob das vorhanden ist.

      Wenn Websockets technisch nicht infrage kommen, geht immer noch Ajax-Polling. Das sollte problemlos gehen, weil dazu nicht viel mehr als ein PHP-Script auf Serverseite benötigt wird.

      Der Server jedenfalls weiß den Spielstand und teilt ihn den Clients mit, entweder über eine bestehende Websocket-Verbindung oder per Nachfrage beim Polling.

      dedlfix.