2016-09-20 7 views
0

Ich versuche, ein kleines Ratespiel zu machen, wo es eine Zufallszahl generiert, und der Benutzer gibt eine Nummer mit einem TextBox und Button. Derzeit erstellt es die Zufallszahl und tut alles, was ich will, aber jedes Mal, wenn der Benutzer drückt auf die Schaltfläche, generiert er eine neue Zufallszahl für sie zu erratenVerbessern der Anzahl Raten Spiel Code

Ich bin sehr neu in ASP.NET Art Zeug, so Mein Code ist wahrscheinlich ineffizient und falsch lol, also habe ich zwei bestimmte Fragen.

  1. Wie kann ich meinen Code verbessern, damit er besser funktioniert/überhaupt funktioniert?
  2. Brauche ich eine Läuferklasse, damit es funktioniert und wie würde ich das tun?
public partial class WebPageSeparated : System.Web.UI.Page 
{ 
    private int randNum; 
    private int theirGuess; 
    public WebPageSeparated() 
    { 
     Random randomNum = new Random(); 
     randNum = randomNum.Next(0, 10); 
     theirGuess = 0; 
    } 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Label1.Text = "Guessing game! Guess a number between [0,10) to see if you can get it right!"; 
     new WebPageSeparated(); 
    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      theirGuess = Convert.ToInt32(TextBox1.Text); 
      if (theirGuess != this.randNum) 
      { 
       Label1.Text = "Sorry, wrong number. Please try again!"; 
      } 
      else if(theirGuess == this.randNum) 
      { 
       Label1.Text = "Correct! A new number has been generated, go ahead and try to do it again!"; 
       new WebPageSeparated(); 
      } 
     } 
     catch (System.FormatException) 
     { 
      Label1.Text = "Enter a number [1,10)"; 
     } 
    } 
} 
+0

Also, wenn sie es getroffen einreichen kehrt nicht eine dieser beiden Antworten? –

+0

@ LucasKot-Zaniewski es tut, aber die Zahl, die angenommen werden soll, ändert sich jedes Mal, wenn Sie eine neue Nummer senden –

+0

Schritt 1: Verwenden Sie keine Ausnahmen, um Programmablauf zu steuern. –

Antwort

0

Mehrere Dinge sind falsch mit Ihrem Code:

Sie sollten niemals eine neue Instanz Ihrer Seite (new WebPageSeparated()) erstellen. Eine neue Instanz wird jedes Mal erstellt, wenn Sie zu der Seite navigieren (indem Sie ihre URL im Browser eingeben) und immer dann, wenn Sie ein PostBack verursachen (z. B. durch Klicken auf eine asp:button).

Wenn Sie Code haben möchten, der nur beim ersten Aufruf der Seite ausgeführt wird (d. H. Nicht während eines PostBacks, nur beim Navigieren zur Seite), dann sollten Sie diesen Code in einen if (!IsPostBack) {} Block schreiben.

Da für jedes PostBack eine neue Instanz der Seite erstellt wird, können Sie keinen Status (die Zufallszahl) in einem Instanzfeld der Seite speichern. Sie haben einen anderen Ort zu finden, wo Sie den Zustand, zB speichern:

  • in einem statischen Feld, zB: private static int randNum
    • Anmerkung: Dies ist nicht zu empfehlen, da das statische Feld zwischen allen Instanzen gemeinsam genutzt wird Ihre Seite (funktioniert nicht, wenn mehrere Benutzer gleichzeitig auf Ihrer Website sind)
  • in einer Sitzungsvariablen, z Session["randNum"] = randomNum.Next(0, 10)
  • in dem ViewState der Seite, z.B.ViewState["randNum"] = ...
    • das ist, was ich für Ihre Probe

    Mit all diesen Punkten im Auge

  • in einer Datenbank würde empfehlen, Ihre Page_Load Methode würde wie folgt aussehen:

    protected void Page_Load(object sender, EventArgs e) 
        { 
         if (!IsPostBack) 
         { 
          Random randomNum = new Random(); 
          randNum = randomNum.Next(0, 10); 
          ViewState["randNum"] = randNum; 
         } 
         else 
         { 
          randNum = (int) ViewState["randNum"]; 
         } 
         Label1.Text = "Guessing game! Guess a number between [0,10) to see if you can get it right!"; 
        } 
    

    Als o, in dem Fall, dass der Benutzer die richtige Zahl errät, sollten Sie eine neue Zufallszahl erzeugen und speichern (wie in der).


    Schließlich sind einige Themen, die Sie vielleicht mehr über lesen wollen: Seite Lifecycle, Postback, Viewstate, Session-Zustand

  • -2

    Der Grund asp.net ist Postbacks alle Daten an den Server für jede Aktion im Browser ausgeführt. Da Sie eine Zufallszahl im Konstruktor erzeugen, stehen Sie vor diesem Problem. Ich schätze, das wird dir helfen.

    public partial class WebPageSeparated : System.Web.UI.Page 
    
    { 
    
    private int randNum; 
    private int theirGuess; 
    
    
    
    
    protected void Page_Load(object sender, EventArgs e) 
    { 
        Random randomNum = new Random(); 
        randNum = randomNum.Next(0, 10); 
        theirGuess = 0; 
        Label1.Text = "Guessing game! Guess a number between [0,10) to see if you can get it right!"; 
        new WebPageSeparated(); 
    } 
    
    protected void Button1_Click(object sender, EventArgs e) 
    { 
         try 
         { 
          theirGuess = Convert.ToInt32(TextBox1.Text); 
          if (theirGuess != this.randNum) 
          { 
           Label1.Text = "Sorry, wrong number. Please try again!"; 
          } 
          else if(theirGuess == this.randNum) 
          { 
           Label1.Text = "Correct! A new number has been generated, go ahead and try to do it again!"; 
           new WebPageSeparated(); 
          } 
         } 
         catch (System.FormatException) 
         { 
          Label1.Text = "Enter a number [1,10)"; 
         } 
        } 
    
    +0

    Ich habe versucht, den Code, den Sie oben haben, und es hat es nicht behoben, ich habe es so gemacht, wenn es sagt "versuche es erneut" es ausdruckt, was die Zufallszahl ist und jedes Mal, wenn ich auf die Schaltfläche drücken, ändert sich die Nummer .. –

    +0

    I Gerade jetzt bemerkt, dass die neue WebPageSeparated() Instanziierung innerhalb der Event-Handler getan wird, die nicht notwendig ist. Aber ich frage mich, warum du jedes Mal instanziierst. – Aravind