2016-09-20 5 views
0

J'essaie de faire un petit jeu de devinettes où il génère un nombre aléatoire, et l'utilisateur entre un nombre en utilisant TextBox et Button. Actuellement, il crée le nombre aléatoire et fait tout ce que je veux, mais chaque fois que l'utilisateur presse soumettre sur le bouton, il génère un nouveau nombre aléatoire pour les devinerAméliorer le nombre de deviner le code du jeu

Je suis très nouveau pour les choses de type ASP.NET, donc mon code est probablement inefficace et incorrect lol, donc j'ai deux questions particulières.

  1. Comment puis-je améliorer mon code pour qu'il fonctionne mieux/fonctionne pas du tout.
  2. Ai-je besoin d'une classe de coureurs pour le faire fonctionner, et comment le ferais-je?
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

Alors, quand ils ont frappé le soumettre ne retourne pas l'un de ces deux réponses? –

+0

@ LucasKot-Zaniewski c'est le cas, mais le nombre supposé être deviné change chaque fois que vous soumettez un nouveau nombre –

+0

Étape 1: N'utilisez pas d'exceptions pour contrôler le flux du programme. –

Répondre

0

Plusieurs choses sont mal avec votre code:

Vous ne devez jamais créer une nouvelle instance de votre page (new WebPageSeparated()). Une nouvelle instance est créée chaque fois que vous accédez à la page (en entrant son URL dans le navigateur) et chaque fois que vous créez un PostBack (par exemple en cliquant sur un asp:button). Si vous voulez avoir du code, qui ne s'exécute que la première fois que la page est invoquée (pas pendant un PostBack, uniquement lorsque vous naviguez vers la page), vous devez placer ce code dans un bloc if (!IsPostBack) {}. Comme une nouvelle instance de la page est créée pour chaque PostBack, vous ne pouvez pas stocker d'état (le nombre aléatoire) dans un champ d'instance de la page. Vous devez trouver un autre endroit où vous stockez l'état, par exemple:

  • dans un champ statique, par exemple: private static int randNum
    • Note: ce n'est pas recommandé, puisque le champ statique est partagé entre toutes les instances de votre page (ne fonctionne pas si plusieurs utilisateurs sont sur votre site Web en même temps)
  • dans une variable de session, par ex. Session["randNum"] = randomNum.Next(0, 10)
  • dans le ViewState de la page, par ex.ViewState["randNum"] = ...
    • ce que je vous recommande pour votre échantillon
  • dans une base de données

Avec tous ces points à l'esprit, votre méthode Page_Load ressemblerait à quelque chose comme ceci:

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, dans le cas, l'utilisateur devine le nombre correct, vous devez générer et stocker un nouveau nombre aléatoire (comme fait dans le if (!IsPostBack)).


Enfin, certains sujets que vous voudrez peut-être en savoir plus sur: Cycle de vie page, publication automatique, Viewstate, état de session

-2

La raison est asp.net postback toutes les données au serveur pour chaque action effectuée dans le navigateur. Puisque vous générez un nombre aléatoire dans le constructeur votre face à ce problème. Je suppose que cela vous aidera.

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

J'ai essayé le code que vous avez ci-dessus et il n'a pas réparé, je l'ai fait quand il dit "réessayer" il imprime ce que le nombre aléatoire est et chaque fois que j'appuie sur le bouton le nombre change .. –

+0

I vient de remarquer que la nouvelle instanciation WebPageSeparated() est faite à l'intérieur des gestionnaires d'événements, ce qui n'est pas nécessaire. Mais je me demande pourquoi vous instanciez chaque fois. – Aravind