改进猜数游戏代码
Improving number guessing game code
我正在尝试制作一个小型猜谜游戏,它会生成一个随机数,然后用户使用 TextBox
和 Button
输入一个数字。目前它正在创建随机数并做我想做的一切,但每次用户按下按钮上的提交时,它都会生成一个新的随机数供他们猜测
我对 ASP.NET 类型的东西很陌生,所以我的代码可能效率低下且不正确,哈哈,所以我有两个特别的问题。
- 我怎样才能改进我的代码以使其完全正常工作better/work。
- 我需要跑步者 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)
中所做的那样)。
最后,您可能想阅读更多有关的一些主题:页面生命周期、回发、视图状态、会话状态
我正在尝试制作一个小型猜谜游戏,它会生成一个随机数,然后用户使用 TextBox
和 Button
输入一个数字。目前它正在创建随机数并做我想做的一切,但每次用户按下按钮上的提交时,它都会生成一个新的随机数供他们猜测
我对 ASP.NET 类型的东西很陌生,所以我的代码可能效率低下且不正确,哈哈,所以我有两个特别的问题。
- 我怎样才能改进我的代码以使其完全正常工作better/work。
- 我需要跑步者 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)
中所做的那样)。
最后,您可能想阅读更多有关的一些主题:页面生命周期、回发、视图状态、会话状态