2012-03-24 8 views
1

Я создаю простую игру, в которой компьютер генерирует случайные числа и добавляет их. Правило состоит в том, что, хотя добавление обоих случайных чисел равно < 17, сгенерируйте другое случайное число и добавьте его к ранее сгенерированному. Компьютер также генерирует случайное число для пользователя. Однако пользователь решает, хочет ли он генерировать больше или нет. В случае, если он хочет, вновь созданный номер добавляется к предыдущим.случайных чисел на Page_Load

Проблема, с которой я столкнулся, заключается в том, что компьютерная функция генерации его случайных чисел находится в событии 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); 
} 

ответ

2

магазин значение случайного числа в ViewState (как ViewState [ «RandNum»] = случайное число А в чеке Pageload если страница является постбэк (например, страницы. . 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); 
    } 
0

разделяйте вопросы с номерами, вам потребуется сеанс для этого

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

Вы можете сохранить любой объект в сеансе, поэтому используйте список или очередь для хранения нескольких номеров для пользователя.

Редактировать: как сказал Дарьял, всегда сохраняйте числа, тогда, если это из-за обратной передачи, вы знаете, что цифры хранятся. Даже тогда сеанс длится только 20 минут (обычно), поэтому всегда полезно проверить, действительно ли объекты присутствуют на сеансе.

0

Сохраните номер. ASP.NET предоставляет несколько вариантов сохранения данных в приложении. Взгляните на ASP.NET State Management Recommendations, в частности на «Параметры управления государством на стороне сервера».

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).