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