Page_Load上的随机数

时间:2012-03-24 14:23:59

标签: c# asp.net

我正在创建一个简单的游戏,计算机会生成随机数并将其相加。规则是,虽然两个随机数的加法是< 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);
 }

4 个答案:

答案 0 :(得分:2)

在ViewState中存储随机数的值(如ViewState [“RandNum”] =随机数。在页面加载中检查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);
    }

答案 1 :(得分:0)

请将您的问题与数字分开,您需要参加会议。

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

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

编辑:像daryal说的那样,总是存储数字,然后如果它来自Postback,你知道数字是存储的。即使那时会话只持续20分钟(通常),所以总是很好检查对象是否实际存在于会话中。

答案 2 :(得分:0)

存储号码。 ASP.NET提供了几种在应用程序中保存数据的选项。看看ASP.NET State Management Recommendations,特别是&#34;服务器端状态管理选项&#34;部分。

答案 3 :(得分:0)

首先,您的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)。