2016-10-30 1 views
0

Ich versuche, eine grundlegende Nullen und Kreuze Spiel in C# zu machen. Bis jetzt habe ich das Raster mit Tasten gemacht, deren Text sich ändert, wenn gedrückt wird, je nachdem, welcher Spieler dran ist. Der Teil, auf dem ich feststecke, überprüft, ob einer der Spieler gewonnen hat, ich habe dies geschrieben, aber es scheint nichts zu tun.C# - Bedingung, die wahr ist, wenn 3/9 Tasten den gleichen Text haben

 private void Form1_Load(object sender, EventArgs e) 
    { 
     if (button1.Text == "X" && button5.Text == "X" && button9.Text == "X") 
     { 
      MessageBox.Show("Player", player_turntxt.Text + " wins"); 
      Application.Restart(); 
     } 
    } 
    private void button1_Click(object sender, EventArgs e) 
    { 
     int Player_Turn = Convert.ToInt32(player_turntxt.Text); 
     if (Player_Turn == 1) 
     { 
      button1.Text = "X"; 
      player_turntxt.Text = "2"; 
      button1.Enabled = false; 
      return; 
     } 
     else 
     { 
      button1.Text = "O"; 
      player_turntxt.Text = "1"; 
      button1.Enabled = false; 
      return; 
     } 

(Die Application.Restart(); ist nur eine vorübergehende Methode zu überprüfen, ob es funktioniert.) Dies ist nur eines von 8 Aussagen, die ich als Bedingungen für den Sieg machen müssen werde, eine Idee, wo Ich gehe falsch?

Update:

 public void CheckForWinner(int x) 
    { 

     if (button1.Text == "X" && button5.Text == "X" && button9.Text == "X") 
     { 
      x = 1; 
     } 
     else if (button3.Text == "X" && button5.Text == "X" && button7.Text == "X") 
     { 
      x = 1; 
     } 
     else if (button1.Text == "X" && button4.Text == "X" && button7.Text == "X") 
     { 
      x = 1; 
     } 
     else if (button2.Text == "X" && button5.Text == "X" && button8.Text == "X") 
     { 
      x = 1; 
     } 
     else if (button3.Text == "X" && button6.Text == "X" && button9.Text == "X") 
     { 
      x = 1; 
     } 
     else if (button1.Text == "X" && button2.Text == "X" && button3.Text == "X") 
     { 
      x = 1; 
     } 
     else if (button4.Text == "X" && button5.Text == "X" && button6.Text == "X") 
     { 
      x = 1; 
     } 
     else if (button7.Text == "X" && button8.Text == "X" && button9.Text == "X") 
     { 
      x = 1; 
     } 



     if (button1.Text == "O" && button5.Text == "O" && button9.Text == "O") 
     { 
      x = 2; 
     } 
     else if (button3.Text == "O" && button5.Text == "O" && button7.Text == "O") 
     { 
      x = 2; 
     } 
     else if (button1.Text == "O" && button4.Text == "O" && button7.Text == "O") 
     { 
      x = 2; 
     } 
     else if (button2.Text == "O" && button5.Text == "O" && button8.Text == "O") 
     { 
      x = 2; 
     } 
     else if (button3.Text == "O" && button6.Text == "O" && button9.Text == "O") 
     { 
      x = 2; 
     } 
     else if (button1.Text == "O" && button2.Text == "O" && button3.Text == "O") 
     { 
      x = 2; 
     } 
     else if (button4.Text == "O" && button5.Text == "O" && button6.Text == "O") 
     { 
      x = 2; 
     } 
     else if (button7.Text == "O" && button8.Text == "O" && button9.Text == "O") 
     { 
      x = 2; 
     } 


    } 
+0

Was passiert, wenn Sie debuggen? – MordechayS

+0

Die Prüfung erfolgt, wenn das Formular geladen wird, nicht nach jeder Runde. – Rob

+0

Sie sollten eine Methode erstellen, um zu prüfen, ob ein Spieler gewonnen hat, und diese am Ende jedes Ihrer "Knopfklicks" ausführen. –

Antwort

0

Sie müssen überprüfen, ob ein Spieler nach jeder Runde gewinnt. Sie überprüfen es gerade einmal, nachdem das Formular geladen wurde.

1

Sie sollten eine Methode erstellen, um zu überprüfen, ob ein Spieler gewonnen hat, und sie am Ende jedes Ihrer "Knopfklicks" auszuführen.

Ich schlage vor, dass Sie die "Rückkehr" von Ihren Knopfklicks entfernen. Sie können manchmal unerwartetes Verhalten einführen, wie das Beenden der Funktion, bevor Sie die Codezeile ausführen, die die Methode aufruft, um zu überprüfen, ob jemand gewonnen hat.

Etwas wie folgt aus:

private void button1_Click(object sender, EventArgs e) 
    { 
     int Player_Turn = Convert.ToInt32(player_turntxt.Text); 
     if (Player_Turn == 1) 
     { 
      button1.Text = "X"; 
      player_turntxt.Text = "2"; 
      button1.Enabled = false; 

     } 
     else 
     { 
      button1.Text = "O"; 
      player_turntxt.Text = "1"; 
      button1.Enabled = false; 

     } 

CheckIfSomeoneHasWon(); 
} 

Lassen Sie uns die Implementierung von CheckIfSomeoneHasWon diskutieren. Ich denke, dass es mehrere Möglichkeiten gibt, dies zu tun. Wir könnten ein zweidimensionales Array mit den Werten der Schaltflächen erstellen und es iterieren. In der Tat werde ich es so machen. Dein Weg funktioniert auch, aber wir müssten viel schreiben. Das ist, was ich dachte:

static readonly string _player1_symbol = "X"; 
     static readonly string _player2_symbol = "O"; 

static void CheckIfSomeoneHasWon() 
     { 
      string[,] userChoices = BuildUserChoices(); 

      string winner = CheckWhoWon(userChoices); 

      if (winner != null) 
      { 
       // Somebody won! Display message and start over 
      } 
     } 

     private static string CheckWhoWon(string[,] values) 
     { 
      // Horizontal checks 
      for (int i = 0; i < 3; i++) 
      { 
       if (values[i, 0] == values[i, 1] && values[i, 1] == values[i, 2]) 
       { 
        return (values[i, 0] == _player1_symbol) ? "player 1" : "player 2"; 
       } 
      } 

      // Vertical checks 
      for (int i = 0; i < 3; i++) 
      { 
       if (values[0, i] == values[1, i] && values[1,i] == values[2,i]) 
       { 
        return (values[i, 0] == _player1_symbol) ? "player 1" : "player 2"; 
       } 
      } 

      // Diagonal checks 
      if (values[0, 0] == values[1, 1] && values[1, 1] == values[2, 2]) 
      { 
       return (values[0, 0] == _player1_symbol) ? "player 1" : "player 2"; 
      } 

      if (values[0, 2] == values[1, 1] && values[1, 1] == values[2, 0]) 
      { 
       return (values[1, 1] == _player1_symbol) ? "player 1" : "player 2"; 
      } 
      // No one has won yet 
      return null; 
     } 

     private static string[,] BuildUserChoices() 
     { 
      var values = new string[3, 3]; 
      values[0, 0] = button1.Text; 
      values[0, 1] = button2.Text; 
      values[0, 2] = button3.Text; 
// and so on... 
      // If a button has not been click, they must have a unique text, like a number 

      return values; 
     } 
+0

Welchen Parameter würde ich der Methode geben? – Usiek

+0

Ich würde keine Parameter senden. Sie müssen nur den Text der Schaltflächen überprüfen. Brauchen Sie Hilfe bei der Implementierung? –

+0

Bitte ja ... Ich werde meine Frage mit dem, was ich bisher getan habe, aktualisieren. – Usiek

Verwandte Themen