dave: Konzeptionelles Problem bei der Umsetzung eines Spiels

Hi,

ich versuche gerade ein Spiel zu programmieren. Alle Hintergrundinfos zu schreiben scheint mir im Moment nicht sinnvoll bzw. notwendig, daher folgend ein vereinfachtes Beispiel, welches mein Problem hoffentlich beschreibt.
Falls doch noch etwas unklar sein sollte bessere ich selbstverständlich nach.

Es sind mehrere Spieler. Jeder Spieler hat eine Hand mit Karten, diese sind grundlegend offen und für jeden einsehbar.

Außer in einer Spielphase. In dieser legt jeder Spieler jeweils eine Karte verdeckt auf ein Spielfeld welches er kontrolliert. Die übrigen Karten legt er verdeckt beiseite.

Wenn alle Spieler ihre Karten platziert haben werden alle umgedreht und sind wieder für alle sichtbar.

Derzeit hat jede Karte eine UID. Wenn eine Karte bewegt wird, getauscht wird oder sonst etwas mit ihr geschieht schicke ich an alle Clients die diese Aktion nicht ausgelöst hatten _was_ passiert, und welche UID betroffen ist.

Ursprünglich hatte ich vor das auch mit den Karten so zu handhaben.
1. Aktion: Drehe Karte #UID# um
  --> Das Bild der Karte wird ausgetauscht, womit nicht mehr sichtbar ist welche Karte das nun war.
2. Aktion: Positioniere Karte #UID# an Position X/Y
  --> Man sieht nur die Rückseite einer Karte die sich an Position X/Y bewegt.

Mein Problem ist nun, dass jeder der den Netzwerkverkehr beobachtet einfach nachverfolgen kann welche UID wo positioniert wird.

Ich sehe keine Möglichkeit, das zu verhindern, also brauche ich eine andere Möglichkeit die verdeckten Karten zu handhaben.

Idee 1: Die verdeckten Karten nicht bei allen Clients verschieben, sondern nur ein Zeichen senden wenn der jeweilige Client _alle_ positioniert hat (und somit bereit zum aufdecken ist).
Problem hierbei ist eher kosmetischer Natur. Ich möchte dass sichtbar ist welche Karten verschoben werden etc.

Idee 2: Jedesmal nach dem verdecken der Karten die UIDs neu verteilen. Relativ aufwändig und fühlt sich nicht schön an.

Habt ihr eine bessere Idee?

~dave

  1. Ich möchte dass sichtbar ist welche Karten verschoben werden etc.

    Ich dachte das willst du gerade nicht sichtbar haben?
    Während der verdeckten Phase braucht kein anderer Spieler Informationen über die Karten geschickt bekommen. Da reicht es doch zu wissen dass alle Karten verdeckt sind und eine davon auf die Seite gelegt wird.

    Ich würde erst alle Karten der Spieler verdecken, dann vielleicht alle auf einen Haufen schieben und daraus eine auf den Sonderplatz legen. Dann sieht niemand mehr welche Karte das war.
    Wenn alle gemeinsam ihre Karten aufdecken, kannst du von jedem Spieler aus die aktuellen Infos verteilen.

    Falls du verhindern willst dass einer mithört und anhand der aufgedeckten Karten der anderen Spieler schnell entscheidet was er wirklich auf den Sonderplatz legen will, müsstest du noch ein Prüfverfahren einbauen.

    1. Hi,

      Ich möchte dass sichtbar ist welche Karten verschoben werden etc.
      Ich dachte das willst du gerade nicht sichtbar haben?

      Anders: Ich möchte dass sichtbar ist _wo_ bereits verdeckte Karten abgelegt wurden. Nicht aber _welche_.

      In der Realität nähmen die Spieler die Karten auf die Hand, mischen sie ggf. und verteilen sie dann verdeckt auf dem Spielplan.

      Während der verdeckten Phase braucht kein anderer Spieler Informationen über die Karten geschickt bekommen. Da reicht es doch zu wissen dass alle Karten verdeckt sind und eine davon auf die Seite gelegt wird.

      Nun, es werden ca. 5 - 8 Karten verdeckt irgendwohin gelegt.
      Es ist solange die Karten nicht aufgedeckt wurden für die anderen Spieler nicht wichtig, wo verdeckte Karten liegen und wo nicht, wie gesagt gefiehle mir das aber einfach besser.
      Sonst hat man auch kein Feedback wie weit die anderen Spieler sind.

      Ich würde erst alle Karten der Spieler verdecken, dann vielleicht alle auf einen Haufen schieben und daraus eine auf den Sonderplatz legen. Dann sieht niemand mehr welche Karte das war.

      Die Sache mit erst auf einem Haufen ist gut.
      Sonst könnte man sich ja einfach merken welche Karte wo war und dann nachverfolgen welche verschoben wird.
      Löst aber leider nicht das Problem, dass immer noch die UID mitgeschickt wird, wenn die Bewegung der Karten sichtbar sein soll.

      Wenn alle gemeinsam ihre Karten aufdecken, kannst du von jedem Spieler aus die aktuellen Infos verteilen.

      Die Clients kommunzieren ausschließlich über einen Server miteinander. Hatte ich im OP nicht erwähnt, entschuldige.

      Mein Vorhaben mag etwas kleinlich wirken, da ich auch zugebe, dass es prinzipell für das Spiel irrelevant ist ob man während des legens der Karten sieht wo sie gelegt wurde. Erst nach dem Aufdecken ist das dann relevant.
      Ich schiebe es jetzt einfach auf die User Experience die dadurch deutlich verbessert würde.

      ~dave

      1. Ich nehme mal an, eine Animation die aus den sichtbaren Karten irgendwas zusammenmischt und dann wieder nicht-unterscheidbare Kartenrückseiten zeigt, kriegst du irgendwie hin?
        Dann hättest du eine Voraussetzung um aus z.B. 5 sichtbaren Karten 5 unsichtbare zu machen und da immer die jeweils nächste zu verschieben. Und der Benutzer merkt dass die Karten jetzt nicht mehr in der vorherigen Reihenfolge angeordnet sind.

        Löst aber leider nicht das Problem, dass immer noch die UID mitgeschickt wird, wenn die Bewegung der Karten sichtbar sein soll.

        Das wird gelöst indem du die UID dann einfach nicht mitschickst :-)
        Du brauchst sie ja zunächst nicht. Du sagst der Animation dass sie die nächste Karte auf Position (x, y) schieben soll. Das tut sie, ohne zu wissen welche Karte das ist.
        Erst wenn die Karten aufgedeckt werden schickst du die UID der Karten mit.

        Zum Beispiel so:

        • Befehl "Karten verdecken". Dann werden die Karten umgedreht und auf dem Spielfeld sind jetzt nur noch die Kartenrückseiten zu sehen, ohne UID.
        • Befehl "nächste Karte auf x,y". Dieser Befehl hat die Nummer der Karte, die erste verschobene hat 1, die zweite 2.... Diese Nummer hat mit den UIDs nichts zu tun, die kennzeichnet nur welche Karte wann verschoben wurde.
        • weitere solche Befehle, bis alle Karten da sind wo sie hin sollen.
        • Dann der Befehl "Karten umdrehen". In diesem Befehl sind die Zuordnungen "Nummer -> UID" enthalten. Damit kann dein Spielfeld für alle Karten wieder die UIDs herstellen und die Karten richtig anzeigen.
        1. Zum Beispiel so:

          Praktisch genau das was Whouzuo um 23:10 auch geschrieben hat :-)

        2. Hi,

          danke.

          ~dave

  2. Mein Problem ist nun, dass jeder der den Netzwerkverkehr beobachtet einfach nachverfolgen kann welche UID wo positioniert wird.

    Ich sehe keine Möglichkeit, das zu verhindern,

    Bitte erklär erstmal, wie die Spieler untereinander kommunizieren und _wer_ beispielsweise den Sieger ermittelt. Wenn die Spieler tatsächlich direkt miteinander kommunizieren, wird es relativ schwierig.

    Eine Möglichkeit wäre, dass der Spieler den anderen Spielern nicht die UID seiner Karte schickt, sondern (nach einem bestimmten Algorithmus) jedem der anderen Spieler nur einen (veränderten) Teil der UID. Nach der verdeckten Phase schicken sich alle Spieler gegenseitig alle UID-Teile der anderen Spieler zu und erst nach dem Zusammensetzen wird die UID sichtbar. Somit besteht auch nicht die Möglichkeit, dass derjenige Spieler schummelt, der die verdeckte Karte gelegt hat.

    Eine andere Möglichkeit ist, dass der Spieler, der die verdeckte Karte legen soll mittels asymmetrischer Verschlüsselung einen privaten und öffentlichen Schlüssel generiert. Den öffentlichen Schlüssel verteilt er und verschlüsselt mit diesem die UID. Vom privaten Schlüssel verteilt er nur einen MD5 Hash (o.ä.). Nach der Phase gibt er seinen privaten Schlüssel preis. Die Anderen können dadurch sicherstellen, dass er die UID gelegt hat, die er zu legen vorgegeben hat.

    Ein zentraler Server würde das ganze allerdings stark vereinfachen...

    1. Hi,

      Bitte erklär erstmal, wie die Spieler untereinander kommunizieren und _wer_ beispielsweise den Sieger ermittelt. Wenn die Spieler tatsächlich direkt miteinander kommunizieren, wird es relativ schwierig.

      Alle Kommunikation läuft über einen Server. Die Spieler haben keine Verbindungen direkt zueinander.

      Ein zentraler Server würde das ganze allerdings stark vereinfachen...

      Ist somit vorhanden.

      ~dave

      1. Hi,

        Bitte erklär erstmal, wie die Spieler untereinander kommunizieren und _wer_ beispielsweise den Sieger ermittelt. Wenn die Spieler tatsächlich direkt miteinander kommunizieren, wird es relativ schwierig.

        Alle Kommunikation läuft über einen Server. Die Spieler haben keine Verbindungen direkt zueinander.

        Das ist leicht. Dann darf der Server den anderen Spielern lediglich mitteilen _wo_ eine Karte hingelegt wurde, nicht aber die UID. Ggf. kann der Server die UID auch temporär (solange die Karte verdeckt wird) durch eine temporäre ID für verdeckte Karten ersetzen. Wo ist dabei das Problem?

        1. Hi,

          Wo ist dabei das Problem?

          Eigentlich nur das Brett vor meinem Kopf.
          Danke.

          ~dave