【问题标题】:random numbers on Page_LoadPage_Load 上的随机数
【发布时间】:2012-03-24 23:11:37
【问题描述】:

我正在创建一个简单的游戏,其中计算机生成随机数并将它们相加。规则是,当两个随机数相加小于 17 时,生成另一个随机数并将其添加到先前生成的随机数中。计算机还为用户生成一个随机数。然而,用户决定他是否想要生成更多。如果他愿意,新生成的数字会添加到之前的数字中。

我面临的问题是,生成他的随机数的计算机功能是在 Page_Load 事件中。这导致了一个问题;这意味着当用户显示他的随机数时,假设他决定生成另一个。在 Button_Click 事件中,用户按下“生成”按钮并获得他的新随机数。问题在于每当按下按钮时,页面都会刷新并且计算机随机数会更改,因为该方法位于 page_load 事件中。

如何让电脑产生随机数,存储起来,不受页面其他事件的影响。另外,如何将新生成的用户随机数添加到之前生成的随机数中?

这是代码:

int computer_first_number;
int computer_second_number;
int extra_number;
int computer_total;
int user_number1;
int user_number2;
int user_total;

private int randomNumber(int min, int max)
{
Random random = new Random(BitConverter.ToInt32(Guid.NewGuid().ToByteArray(), 0));
return random.Next(min, max);
}

protected void Page_Load(object sender, EventArgs e)
{
       computer_first_number = randomNumber(1, 10);
       computer_second_number = randomNumber(1, 10);
       user_number1 = randomNumber(1, 10);
       computer_total = computer_first_number + computer_second_number;

       while (computer_total < 17)
       {
          try
          {
              extra_number = randomNumber(1, 10);
              computer_total = computer_first_number + computer_second_number + extra_number;
          }
          catch (Exception ex)
          {
              Console.Write(ex);
          }
       }
}

protected void Button1_Click1(object sender, EventArgs e)
{
       user_number2 = randomNumber(1, 10);
       user_total = user_number1 + user_number2;
       Label4.Text = Convert.ToString(user_total);
 }

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    将随机数的值存储在 ViewState 中(如 ViewState["RandNum"] = random number。并在页面加载中检查 Page 是否为回发(如 Page.IsPostback)。类似的东西;

    private int randomNumber(int min, int max)
        {
    
            Random random = new Random(BitConverter.ToInt32(Guid.NewGuid().ToByteArray(), 0));
            return random.Next(min, max);
        }
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                int number = randomNumber(1, 10) + randomNumber(1, 10);
                while (number < 17)
                {
                    number += randomNumber(1, 10);
                }
    
                ViewState["RandNum"] = number;
            }
            Label4.Text = ViewState["RandNum"].ToString();
        }
    
        protected void Button1_Click1(object sender, EventArgs e)
        {
            int userNumber = randomNumber(1, 10);
            userNumber = int.Parse(ViewState["RandNum"].ToString()) + userNumber;
            ViewState["RandNum"] = userNumber;
            Label4.Text = Convert.ToString(userNumber);
        }
    

    【讨论】:

      【解决方案2】:

      请将您的问题与数字分开,您需要此会话。

      Session["randomNumber"] = computer_first_number;
      computer_first_number = (int)Session["randomNumber"];
      

      您可以在会话中存储任何对象,因此请使用 List 或 Queue 为用户存储多个号码。

      编辑:就像 daryal 所说,始终存储数字,然后如果它来自 Postback,那么您就知道存储了数字。即使这样,会话也只持续 20 分钟(通常),因此检查对象是否实际存在于会话中总是好的。

      【讨论】:

        【解决方案3】:

        存储号码。 ASP.NET 为在应用程序中持久化数据提供了几个选项。看看ASP.NET State Management Recommendations,特别是“服务器端状态管理选项”部分。

        【讨论】:

          【解决方案4】:

          首先,您的Page_Load 需要有一个IsPostback 签入:

          protected void Page_Load(object sender, EventArgs e)
          {
                 if(!IsPostback){
                   computer_first_number = randomNumber(1, 10);
                   computer_second_number = randomNumber(1, 10);
                   user_number1 = randomNumber(1, 10);
                   ...  //keep your normal processing
          
                   //at the end, put your total in a hidden field
                   hidFieldRandomTotal.Value = computer_total;
                 } else {
                   //here's where you'd add on a new random number
                   int newRandomNumber = randomNumber(1,10);
                   computer_total = Convert.ToInt32(hidFieldRandomTotal.Value);
                   //add it to the total
                   hidfieldRandomTotal.Value = newRandomNumber + computer_total;
                 }
          
          }
          

          您需要一种方法来在最初加载页面和用户发回数据之间保留状态。有很多方法可以做到这一点。我在上面展示的内容非常简单,也不是很优雅,但这是一个开始。您基本上必须知道何时开始加载页面 (IsPostback == false) 以及何时更新页面 (IsPostback == true)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-08-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-04
            • 2023-03-31
            相关资源
            最近更新 更多