Laden...

[erledigt] Eine Switchanweisung mehrfach ausführen

Erstellt von Jonas007 vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.106 Views
J
Jonas007 Themenstarter:in
37 Beiträge seit 2020
vor 4 Jahren
[erledigt] Eine Switchanweisung mehrfach ausführen

Hallo liebe Community,
Die folgende Methode benötige ich um in einem einfachen Tic Tac Toe Spiel, gemacht in einer Windows Forms-App, gegen einen Computer zu spielen, wobei ich vorgesehen habe, dass das Programm seinen Zug zufällig setzt. Ihr seht hier nur einen Ausschnitt der Methode jedoch hoffe ich, dass ihr versteht wie ich es aufgebaut habe. Meine Frage ist, wie ich, wenn das Programm zu den Punkten Y1 oder Y2 kommen sollte, es wieder zurück zu Punkt X geht, eine neue Zufallszahl generiert und das "o" auf ein Feld schreibt welches leer ist. Ich habe bereits versucht das Problem mit einer Schleife zu lösen, habe es aber nicht geschafft. Ich bin ein völliger Programmieranfänger und wollte fragen ob man das Problem so lösen kann wie ich mir das vorstelle (mit irgendeinem Befehl von den Y-Punkten zu Punkt X zu kommen) oder ich das Problem irgendwie anders lösen könnte.


       Random Genertor = new Random();
       public void Computerzug()
        {
                // Punkt X
                switch (Genertor.Next(1, 10))
                {
                    case 1:
                        if (button1.Text == "")
                        {
                            button1.Text = "o";
                        }
                        else
                        {
                            if (button1.Text == "x")
                            {
                              // Punkt Y1
                            } 
                        }
                        break;
                    case 2:
                        if (button2.Text == "")
                        {
                            button2.Text = "o";
                        }
                        else
                        {
                            if (button2.Text == "x")
                            {
                              // Punkt Y2
                            }
                        }
                        break;
                        .
                        .
                        .


Danke, Jonas 😉

1.029 Beiträge seit 2010
vor 4 Jahren

Hi,

grundlegend halte ich die Vorgehensweise so viele einzelne Buttons separat anzusprechen für unschön.

Viel schöner wäre es doch, wenn du die 9 Buttons einer Liste hinzufügst. Dann hast du die Möglichkeit diese Liste auf unbeschriftete Buttons zu filtern und per Random.Next einen zufälligen Button zum Beschriften auszuwählen.

Damit wäre das Ganze deutlich übersichtlicher und wohl auch etwas leichter auszuformulieren.

LG

Edit - etwas auf dieser Basis:


var buttons = new List<Button>(new Button[] {
            new Button(),
            new Button(),
            new Button(),
            new Button(),
            new Button(),
            new Button(),
            new Button(),
            new Button(),
            new Button()
        });
        
        var unusedButtons = buttons.Where(b => string.IsNullOrWhiteSpace(b.Text)).ToList();

T
2.219 Beiträge seit 2008
vor 4 Jahren

Zusätzlich sparst du damit auch die ganze Redundanz durch den doppelten Code in deinen case Blöcke.
Merkt dir immer, dass Redundanz im Code immer ein Hinweis auf schlechten Code ist.
Hier gibt es das Prinzip DRY

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

4.931 Beiträge seit 2008
vor 4 Jahren

@Taipi88: Die Buttons sind wahrscheinlich mittels des Designers gesetzt, dann wäre ein new Button() kontraproduktiv - s. besser [FAQ] Variablennamen zur Laufzeit zusammensetzen / Dynamisches Erzeugen von Controls.

Und selbst wenn kein Array benutzt wird, so könnte der Code in eine Methode ausgelagert werden:


bool SetO(Button button)
{
    if (button.Text == "")
    {
        button.Text = "o";
        return true;
    }
    else if (button.Text == "x")
    {
            return false;
    }

    return false;
}

Und das dann in einer Schleife aufrufen:


bool has_set = false;

do
{
  switch (generator.Next(1, 10))
  {
     case 1:
         has_set = SetO(button1);
         break;
     case 2:
         has_set = SetO(button2);
         break;
     // ...
  }
} while (!has_set);

PS: Wir wissen alle, daß dies reiner Anfängercode ist - in einem fortgeschrittenen Programm sollte der Code in eine Logikklasse ausgelagert sein und die UI nur noch per DataBinding aktualisiert werden.