Announcement

Collapse
No announcement yet.

TicTacToe Buttons in Horizontal/Vertikal/Diagonal überprüfen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TicTacToe Buttons in Horizontal/Vertikal/Diagonal überprüfen

    Hallo.

    Ich hab mich heute dran gemacht mein TicTacToe Spiel in 'ne Windows Anwendung zu packen.
    Ich hab leider grade ein Problem bei der Abfrage.

    Das Programm besteht aus 9 Buttons. Wird ein Button gedrückt, erscheint darauf ein "X" oder ein "O" und der Button wird ausgegraut.

    Hier mal die Funktion um die es geht:

    Code:
    private void check()
            {
                bool win = false;
    
                //Horizontal
                if ((button1.Text == button2.Text)&&(button2.Text == button3.Text)&&(!button1.Enabled))
                {
                    win = true;
                }
    
                else if((button4.Text == button5.Text) && (button5.Text == button6.Text) && (!button4.Enabled))
                {
                    win = true;
                }
    
                else if((button7.Text == button8.Text) && (button8.Text == button9.Text) && (!button7.Enabled))
                {
                    win = true;
                }
                   
                //Vertikal
                else if ((button1.Text == button4.Text) && (button4.Text == button7.Text) && (!button1.Enabled))
                {
                    win = true;
                }
    
                else if ((button2.Text == button5.Text) && (button5.Text == button8.Text) && (!button2.Enabled))
                {
                    win = true;
                }
    
                else if ((button3.Text == button6.Text) && (button6.Text == button9.Text) && (!button3.Enabled))
                {
                    win = true;
                }
                
                //Diagonal
                else if ((button1.Text == button5.Text) && (button5.Text == button9.Text) && (!button1.Enabled))
                {
                    win = true;
                }
    
                else if ((button3.Text == button5.Text) && (button5.Text == button7.Text) && (!button3.Enabled))
                {
                    win = true;
                }
    
    
                if(win)
                {
                    string winner = "";
    
                    if(turn)
                    {
                        winner = "X";
                    }
                    
                    else
                    {
                        winner = "O";
                    }
    
                    MessageBox.Show(winner + " Wins!");
                }
            }
    Wenn ich z.B. in Zeile 1 meine "X" von rechts nach links setze, funktioniert die Abfrage an sich. Setze ich die "X" von links nach rechts, gerät alles durcheinander.

    Das !button1.Enabled habe ich gesetzt, damit nicht die leeren Felder miteinander verglichen werden.
    Und ich denke da liegt der Fehler.


    Ich hoffe ihr konntet mit meiner Beschreibung was anfangen und wisst worum es geht.
    Danke schon mal für die Antworten!

    Liebe Grüße
    ~retromops

  • #2
    Wenn du schon einen Verdacht hast wäre jetzt der nächste Schritt für dich das zu debuggen also mal schrittweise durch den Code zu steppen und zu vergleichen ob das was da passiert auch das ist was du erwartest das da passieren sollte. Das ist wesentlich lehrreicher als von uns da einfach mit dem Finger drauf zu zeigen insbesondere da der Fehler höchstwahrscheinlich nicht oder nicht nur in der gezeigten Methode steckt.

    Comment


    • #3
      Es liegt daran, dass du ja auch nur den einen Fall (rechts nach links) prüfst.
      Die "horizontale" Abfrage der ersten Reihe prüft im ersten Schritt nur, ob button1 ==button2 ist. Ist das schon nicht der Fall, wird der Rest nicht weiter beachtet.
      Besser wäre ein anderes Vorgehen:

      Lege einen Integerwert mit 0 an.
      Prüfe, ob Button 1 X ist -> erhöhe den Integerwert
      Prüfe, ob Button 2 X ist -> erhöhe den Integerwert
      Prüfe, ob Button 3 X ist -> erhöhe den Integerwert
      Enthält der Integerwert 3 sind alle 3 Buttons der ersten Reihe mit X belegt
      Das ganze lagerst du in eine extra Methode aus, die nur die 3 zu prüfenden Buttons übergeben bekommt und das Ergebnis der Prüfung (true/false) zurückgibt. so ersparst du dir die ganzen if's
      Zuletzt editiert von Christian Marquardt; 20.01.2015, 08:01.
      Christian

      Comment


      • #4
        @Christian

        Danke dir vielmals!
        Den Fehler hatte ich auch vermutet, aber mir ist nichts weiter eingefallen (wahrscheinlich weil in dem Moment auch keine Motivation mehr da war )

        Finde die Idee super und probiers dann bei nächster Gelgenheit aus

        Comment


        • #5
          Code:
           private void button_Click(object sender, EventArgs e)
                  {
                      Button b = (Button)sender;
                      
                      b.Enabled = false;
                      
                      if (turn)
                      {
                          b.Text = "X";
                      }
                      else
                      {
                          b.Text = "O";
                      }
          
                      //Waagerecht
                      check(button1, button2, button3);
                      check(button4, button5, button6);
                      check(button7, button8, button9);
          
                      //Senkrecht
                      check(button1, button4, button7);
                      check(button2, button5, button8);
                      check(button3, button6, button9);
          
                      //Diagonal
                      check(button1, button5, button9);
                      check(button3, button5, button7);
          
                      turn = !turn;
                     }
          
                  private void check(Button a, Button b, Button c)
                  {
                      int x = 0;
                      int o = 0;
          
                      List<Button> zuverwenden = new List<Button>();
                      zuverwenden.Add(a);
                      zuverwenden.Add(b);
                      zuverwenden.Add(c);
          
                      foreach (Button button in zuverwenden)
                      {
                          if (button.Text == "X")
                                  x += 1;
          
                          else if (button.Text == "O")
                                  o += 1;
                          }
          
                      if (x == 3)
                      {
                          reset();
                          MessageBox.Show("X gewinnt!");
                      }
          
                      else if (o == 3)
                      {
                          reset();
                          MessageBox.Show("O gewinnt!");
                      }
                  }
          
                  private void reset()
                  {
                      foreach (Control control in Controls)
                      {
                          if (control is Button)
                          {
                              control.Enabled = true;
                              control.Text = "";
                          }
                      }
                  }
          Es klappt wunderbar!

          Danke nochmal!

          Ich hoffe der Programmierstil ist einigermaßen okay.

          Comment


          • #6
            Schön, dass es geht.

            Man würde allerdings in einer Methode "check" auch nur einen check machen und nichts anderes (reset, Anzeige).

            Man könnte von der Methode einen boolschen Wert zurückgeben lassen und jeden Aufruf mit OR verknüpfen.

            Aber das dann das nächste mal...
            Christian

            Comment

            Working...
            X