改进猜数游戏代码

Improving number guessing game code

我正在尝试制作一个小型猜谜游戏,它会生成一个随机数,然后用户使用 TextBoxButton 输入一个数字。目前它正在创建随机数并做我想做的一切,但每次用户按下按钮上的提交时,它都会生成一个新的随机数供他们猜测

我对 ASP.NET 类型的东西很陌生,所以我的代码可能效率低下且不正确,哈哈,所以我有两个特别的问题。

  1. 我怎样才能改进我的代码以使其完全正常工作better/work。
  2. 我需要跑步者 class 才能让它发挥作用吗?我该怎么做?
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)";
        }
    }
}

原因是 asp.net 回发 浏览器中执行的每个操作的所有数据都发送到服务器。由于您在 构造函数 中生成随机数,因此您面临着这个问题。我想这会对你有所帮助。

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)";
        }
    }

您的代码有几处错误:

您永远不应创建页面的新实例 (new WebPageSeparated())。每次您导航到该页面(通过在浏览器中输入其 URL)以及每当您引起回传(例如通过单击 asp:button)时,都会创建一个新实例。

如果你想要一些代码,它只在页面第一次被调用时运行(即不在回发期间,只在导航到页面时),那么你应该将该代码包装在 if (!IsPostBack) {}块。

因为为每个 PostBack 创建了一个新的页面实例,所以您不能在页面的实例字段中存储任何状态(随机数)。您必须找到另一个存储状态的地方,例如:

  • 在静态字段中,例如:private static int randNum
    • 注意:不推荐这样做,因为静态字段在页面的所有实例之间共享(如果多个用户同时访问您的网站则不起作用)
  • 在会话变量中,例如Session["randNum"] = randomNum.Next(0, 10)
  • 在页面的 ViewState 中,例如ViewState["randNum"] = ...
    • 这是我为您的示例推荐的内容
  • 在数据库中

考虑到所有这些要点,您的 Page_Load 方法将如下所示:

    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!";
    }

此外,在用户猜对数字的情况下,您应该生成并存储一个新的随机数(如 if (!IsPostBack) 中所做的那样)。


最后,您可能想阅读更多有关的一些主题:页面生命周期、回发、视图状态、会话状态