Arschloch/Präsident (Kartenspiel) Umsetzung

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Arschloch/Präsident (Kartenspiel) Umsetzung

    Hallo liebe VBP-Community,

    ich habe mich die letzten Tage damit beschäftigt, das Kartenspiel „Arschloch“ (oder Präsident) mit C# auf den PC zu bringen.
    Mit dem Datenmodell bin ich eigentlich relativ zufrieden, mit der Rendering-Umsetzung und der Spielsteuerung überhaupt nicht. Mein Ziel war es eigentlich, dass Programm so umzusetzen, dass es Schritt für Schritt verbessert und erweitert werden kann; also bspw. die Grafik verbessert, dann die AI „schlauer“ gemacht werden kann, oder dass mit erweiterten Decks gespielt werden kann etc.

    Jetzt meine Frage: Wie kann ich, zuerst einmal, die „Spielgeschäftslogik“ so umsetzen, dass diese flexibler wird, heißt also, mit einer unterschiedlichen Anzahl von Spielern, sowohl menschlichen, als auch Computerspielern, umgehen kann? Momentan bin ich hier mit Async/Await in einer ziemlichen Spaghetti-Switch-While-Konstruktion, die mir suboptimal und unflexibel erscheint; wie würdet ihr das Ganze umsetzen? Die Regeln sind eigentlich recht einfach, deshalb nehme ich auch an, dass es eine relativ schlanke Umsetzung geben müsste!?

    Das Problem mit meiner HumanPlayer-Klasse ist auch, dass alle Events in der Main-Form abgearbeitet werden, während die AiPlayer-Klasse schon ihre play()-Methode hat. Das verstärkt den „Spaghetti-Effekt“ nochmal – soll ich hier die Events an das Objekt weiterleiten oder gibt es eine bessere Lösung? Gerade wenn es einmal mehrere HumanPlayer geben soll, wird die momentane Logik an ihre Grenzen stoßen.

    Nun zum zweiten großen Punkt: Dem Rendering. Momentan wird komplett unflexibel alles beim Paint-Event gezeichnet. Das ist nicht besonders schick und verlangt nach einer Menge Refreshes. Später sollen auch noch Animationen dazu kommen, deshalb habe ich mich gefragt, ob es überhaupt sinnvoll ist, hier mit GDI+ zu arbeiten. Eigentlich ist es grafisch ja nicht aufwendig, aber ich weiß nicht, wie gut die GDI-Performance bei Animationen ist. Generell wüsste ich ehrlichgesagt nicht, wie sich das alles mit dem Datenmodell geschickt verknüpfen lässt. Hat da jemand Ideen/Tipps/Links für ein Konzept?

    Tut mir leid für den langen Text, aber ich hoffe, ihr wisst jetzt, bei was ich Hilfe brauche, wenn nicht, dann gerne noch einmal nachhaken!
    Dateien
    • Arschloch.zip

      (1,42 MB, 185 mal heruntergeladen, zuletzt: )
    Twitch Viewer Display Chat-, Zuschauer- und Statistiktool für Streamer
    Moin,

    ich hatte mich damals mal privat daran versucht (BecomeThePresident), bin dann aber an der KI gescheitert, weil ich das sehr real machen wollte. Der Ansatz über IComparer ist schon mal ganz gut, allerdings legt die KI somit immer eine höhere Karte, was dem realen Spielen natürlich nicht immer gleich kommt.
    Auf jeden Fall würde ich keinen Paint-Handler dafür nutzen, sondern das über entsprechende Renderer und Methoden (Draw, Update) regeln. Dann halt darauf aufbauend Sachen wie MouseManager usw., aber gut, das ist dann für die nächste Version. :P

    Und eventbasiert ist meistens, wenn man es nicht richtig umsetzt, bei Games böse. Von daher: s. o., denn damit hast Du ja auch die Probleme. Also mach das mit Methoden einer abstrakten Klasse bzw. eines Interfaces und warte jeweils, auf die Beendigung, damit sich da nichts überschneidet.
    Du musst Dir halt eine richtige Architektur überlegen und darauf aufbauend dann zentral alles verwalten.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:

    allerdings legt die KI somit immer eine höhere Karte, was dem realen Spielen natürlich nicht immer gleich kommt.

    KI ist momentan nur Platzhalter, damit das Spiel überhaupt spielbar ist. Aber dank ungnädiger Kartengötter habe ich leider trotzdem schon oft genug verloren :D

    Trade schrieb:

    über entsprechende Renderer und Methoden (Draw, Update) regeln

    Und genau hier stecke ich mehr oder weniger fest. Ich habe ja ein Datenmodell. Aber wie bringe ich dieses elegant auf den Bildschirm? Sozusagen OOP-Style, d. h. jede Karte zeichnet sich selber? Oder doch zentral in der Draw-Methode? Dann hätte ich ja wieder das gleiche Problem wie jetzt auch. Wüsstest du da irgendein Open-Source-Projekt, wo ich mir einen guten Ansatz abschauen kann?

    Trade schrieb:

    mach das mit Methoden einer abstrakten Klasse bzw. eines Interfaces und warte jeweils, auf die Beendigung, damit sich da nichts überschneidet.
    Du musst Dir halt eine richtige Architektur überlegen und darauf aufbauend dann zentral alles verwalten.

    Und hier hänge ich fest. Ich habe so etwas noch nie gemacht, deshalb bin ich hier etwas überfordert. Hast du hier irgendeinen Link oder ähnliches wo mir so etwas anschauen kann?

    EaranMaleasi schrieb:

    Achja, Muss es .Net 4.5.2 sein?

    Zumindest 4.5 muss es ja wegen Async/Await sein.
    Twitch Viewer Display Chat-, Zuschauer- und Statistiktool für Streamer

    newcat schrieb:

    d. h. jede Karte zeichnet sich selber?

    Ja, Du kannst eine Ansammlung von Karten erstellen (​List<Card>) und dann iterierst Du im Draw Deiner ​Game-Klasse für die zentrale Verwaltung da durch und zeichnest jede Karte entsprechend. Ich habe für mein Projekt Sharpex2D verwendet und entsprechend geht das dann halt über Szenen. Im Endeffekt ist das aber ja das Selbe. Da hast Du dann auch schon alles drin, was Du brauchst, um Spiele zu erstellen und dann kannste das komfortabel implementieren.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Abstrakte Klasse bedeutet du hast eine Master Klasse und leitest davon die Slave Klassen ab. So mit ist es egal ob du ein KI oder Human spieler hast weil beide von der Klasse Spieler erben.

    LG, J.Herbrich
    Datenmodell ist ja schön und gut, aber da tut es imho eine einfache Klasse für. Da brauchst Du hier überhaupt kein Dataset oder eine Datenbank. Ich habe auch noch nie ein Spiel mit Dataset gesehen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    wie du meinst.
    ich hab jdfs. grad kurz die Regeln geguckt, da tauchen schon allerlei Entitäten auf:
    Spieler, Karten, Karten in der Hand, aufgedeckte Karten, Kartenstapel, beiseite gelegte Karten, Runden, ....

    Im gegensatz dazu halte ich eine fette Game-Engine zunächstmal für entbehrlich. Das Spiel könnte man sogar ohne spezielle Grafik umsetzen, allein mit Listboxen und Zeugs.

    Aber vlt. irre ich mich auch. Ich habs ja im Gegensatz zu dir noch nicht ausprogrammiert.

    ErfinderDesRades schrieb:

    ich hab jdfs. grad kurz die Regeln geguckt, da tauchen schon allerlei Entitäten auf:
    Spieler, Karten, Karten in der Hand, aufgedeckte Karten, Kartenstapel, beiseite gelegte Karten, Runden, ....


    Ja klar, aber worin liegt da der Nutzen von Datasets?
    es bietet ein relationales Datenmodell.
    Also eine Instanz kann mehreren Auflistungen gleichzeitig angehören, wie in der Wirklichkeit - gugge die Relationale GrundIdee

    Aber vlt. habt ihr auch recht, und das Präsident-Spiel kann man trotz der vielen Entitäten modellieren, ohne eine m:n-Relation zu benötigen. Ich habs jetzt nicht im Einzelnen durchdacht, aber vlt. ists ja möglich.
    Wozu hat man Klassen, Interfaces, stuctures und Enums? Damit lässt sich wunderprächtig das ganze Szenario Modellieren. Das einzige das man an Daten erfassen muss ist die Anzahl der Spieler(Human als auch AI) und diese Daten sind nur temporär wichtig, sie müssen später nicht verwaltet werden können.
    Dementsprechend fände ich es unsinnig das über Datasets zu lösen, wo man doch die ganzen "Entitäten" ebenfalls im Code nachbilden muss, um der Objektorientierten Grundidee gerecht zu werden:

    Wikipedia schrieb:

    Die Grundidee besteht darin, die Architektur einer Software an den Grundstrukturen desjenigen Bereichs der Wirklichkeit auszurichten, der die gegebene Anwendung betrifft.
    Der Erfinder und seine Datasets :)
    Ich glaube auch, dass man hier erstmal rein mit Klassen auskommt. Wenn man möchte kann man sich ja erstmal ein Klassendiagramm erstellen, aber Datasets sind da doch ein wenig overload. Und Relationen lassen sich auch zwischen Klassen abbilden
    Das ist meine Signatur und sie wird wunderbar sein!

    J.Herbrich schrieb:

    So mit ist es egal ob du ein KI oder Human spieler hast weil beide von der Klasse Spieler erben.

    OK, das war sowieso mein Ansatz, da bin ich schonmal beruhigt :D

    Die Diskussion ob Dataset oder nicht - ich habe mich noch nie mit Datasets beschäftigt, aber eigentlich ist so ein Spiel mit den ganzen Entitäten und deren Relationen zwischeneinander doch eine Paradeaufgabe für OOP oder? Schließlich kann man hier schon sehr viel mit Vererbung usw. abbilden, hat somit also auch ein Modell, das sich an der Realität orientiert (Objekt Player hat Objekt Deck, was aus einer Liste von Kartenobjekten, die jeweils einen Enum für Wert und Farbe haben etc.); ich weiß aber nicht, ob man das mit Datasets auch so leicht umsetzen kann?

    Mein Hauptproblem gerade ist, wie ich die Spiellogik mit Events und so weiter ohne Spaghetti-Code basteln kann. Dabei ist es ja auch relativ egal, ob ich eine Engine benutze oder nicht - ich habe ja in beiden Fällen Ereignisse, auf die abhängig von diversen Faktoren (wer ist dran, welcher Zug ist möglich etc.) unterschiedlich reagieren muss. Bisher habe ich das prinzipiell versucht, mit einem endlichen Zustandsautomaten zu lösen, aber ich würde gerne wissen, ob es hier noch eine elegantere Lösung gibt?
    Twitch Viewer Display Chat-, Zuschauer- und Statistiktool für Streamer