TicTacToe



  • Guten Abend,

    ich programmiere zur Zeit ein recht einfach gehaltenes TicTacToe in C#. Bisher hab ich 2 Klassen, die Field und Cell Klasse. Die sehen bei mir wie folgt aus:

    public class Cell
    {
        public enum Sign // Zustandsformen der Zelle
        {
            Empty_Sign, //Leere Zelle
            X_Sign, //Zelle mit einem X
            O_Sign //Zelle mit einem O
        }
        public Sign Cell_Sign = Sign.Empty_Sign; //Die Zelle ist anfangs leer
    }
    
    public class Field
    {
        public List<Cell> Cell_List = new List<Cell>(); //Ein Feld mit Zellen
        public Field()
        {
            for (int i = 0; i <= 9; i++) //Cell_List mit 9 Cell-Objekten füllen (Feld hat 9 Zellen)
            {
                this.Cell_List.Add(new Cell());
            }
        }
        public bool SetSign(int position, Cell.Sign sign)
        {
            if (this.Cell_List[position].Cell_Sign == Cell.Sign.Empty_Sign) //wenn die Zelle leer ist
            {
                this.Cell_List[position].Cell_Sign = sign; //setze ein Zeichen
                return true; //setzen erfolgreich
            }
            else //Zelle ist besetzt
            {
                return false; //setzen fehlgeschlagen
            }
        }
        /*public string DisplayField()
        {
            StringBuilder sb = new StringBuilder();
        }*/
    }
    

    Erstmal wollte ich fragen, ob die Klassen mit ihrem Inhalt okay sind.
    Dann hätte ich eine weitere Frage, die die Methode DisplayField betrifft.
    Das Spielfeld sieht bei mir so aus

    o | x | o
          ---------- 
           x | o | x        // Skizze des Spielfeldes
          ----------
           o | x | o
    

    Nun will ich mit einem StringBuilder, dieses Feld als einen String darstellen. Um aber angenommen die erste Reihe des Feldes zusammen zu bauen, muss ich jeweils prüfen, ob die erste Zelle leer ist, ein "o" oder ein "x" enthält. Mir fällt aber leider keine elegante Lösung ein.
    Ich möchte quasi so etwas

    string FeldString
    
    wenn erste Zelle leer ist:
        FeldString += "   | "
    wenn erste Zelle ein o ist:
        FeldString += " o | "
    ansonsten:
        FeldString += " x | "
    ...
    

    Ich hoffe ich versteht was ich meine.

    Eine weitere Frage, die ich gleich schonmal mitstelle. Bei meiner Skizze des Feldes (siehe oben), kann man sehen, dass der Spieler mit den "o"'s gewonnen hat, da er diagonal 3 Zeichen hintereinander hat. In meiner Field Klasse kann man sehen, dass ich dort eine Liste alle Zellen habe, die jeweils die Information durch ein enum haben, ob sie leer sind, ein "o" oder ein "x" enthalten. Wie kann ich das realisieren, dass ich nach setzen eines Zeichens prüfen kann, ob der Spieler gewonnen hat? Angenommen der Spieler mit den "o"'s hat unten links und in der Mitte ein "o" und setzt dann oben rechts ein weiteres "o". Wie kann ich dann prüfen, ob der Spieler 3 "o"'s in eine Reihe hat? Ich möchte hierzu kein Code, nur Pseudo-Code oder eine Idee, aber zu dem Problem mit der Darstellung des Feldes, würde ich mich über einen kleinen Codeschnipsel freuen.

    Mit freundlichen Grüßen,
    Freaky



  • Wo genau liegt dein Problem. Ich mein DisplayField ist ne Methode von Field, hat also Zugriff auf Cell_List und damit alle Informationen die nötig sind. Du kannst dort doch einfach nachschauen was für ein Zeichen in der jeweiligen Zelle gesetzt ist!? Was die das Prüfen ob einer gewonnen hat angeht: versuch mal ganz einfach zu formulieren was passieren muss damit einer der Spieler gewinnt.



  • Wenn ich so wie in meinem Pseudocode mache, sieht mein Feld am Ende so aus

    o | x | o |
          -----------
           x | o | x |      // Skizze des Spielfeldes
          -----------
           o | x | o |
    

    Dann ist da jeweils nochmal ein Strich ganz rechts. Um die Informationen etc. geht es mir nicht, eher um eine elegante und ordentliche Darstellung des Feldes als String.
    Wegen der Prüfung, ich werde dann am besten 3 Funktionen erstellen, die jeweils die Vertikalen, Horizontalen und Diagonalen prüft. Ein Problem also gelöst, geht dann nur noch um die Felddarstellung.



  • lol dann musst du eben dafür sorgen dass am Ende kein Strich gemacht wird!?
    Mein Ansatz würde auf der Beobachtung basieren dass du bei jedem dritten Feld ein '\n' machen willst und sonst immer ein '|'...


Anmelden zum Antworten