2013-09-13 3 views
1

Когда я запускаю это и играю в игру, генерируется только число 0. Можете ли вы помочь мне понять, в чем проблема?C# - Ошибка генератора случайных чисел

public partial class MainPage : PhoneApplicationPage 
{ 
    int numberguessed; 
    // Constructor 
    public MainPage() 
    { 
     InitializeComponent(); 
     Random randnum = new Random(); 
     int numberguessed = randnum.Next(0,1000); 
    } 



    private void myButton_Click(object sender, RoutedEventArgs e) 
    { 
     myTextBlock.Text = " No worries ! Go again .. "; 
     myTextbox.Text = ""; 
     myTextbox.Focus(); 
    } 

    private void myButton2_Click(object sender, RoutedEventArgs e) 
    { 
     //string sval = myTextbox.Text; 
     int ival = System.Convert.ToInt32(myTextbox.Text); 
     if (ival == numberguessed) 
      myTextBlock.Text = " You won "; 
     else if (ival < numberguessed) 
      myTextBlock.Text = "Your guess is too low !"; 
     else if (ival > numberguessed) 
      myTextBlock.Text = "Your guess is too high !"; 
    } 

    private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     myTextbox.Focus(); 
    } 
+1

@ DanielHilgarth Я полагаю, что мы поддерживаем друг друга честно! –

ответ

4

в этой части

public MainPage() 
    { 
     InitializeComponent(); 
     Random randnum = new Random(); 
     int numberguessed = randnum.Next(0,1000); 
    } 

Вы overwritting вашу верхнюю numberguessed переменную уровня с префиксом "ИНТ". Измените его на:

public MainPage() 
    { 
     InitializeComponent(); 
     Random randnum = new Random(); 
     numberguessed = randnum.Next(0,1000); 
    } 
4

Вы объявляете numberguessed как field, а затем повторно объявите новую локальную переменную int numberguessed в MainPage(). В других методах будет использоваться значение field. Как это не инициализирован, он будет иметь значение по умолчанию для междунар, 0.

int numberguessed; 
     // Constructor 
     public MainPage() 
     { 
      InitializeComponent(); 
      Random randnum = new Random(); 
      //remove int there like this 
      //int numberguessed = randnum.Next(0,1000); 
      numberguessed = randnum.Next(0,1000); 
     } 

Кстати, вы должны иметь предупреждение (или, возможно, это просто ReSharper делает это) о том, что

Местный переменная numberguessed скрывает поля .MainPage.numberguessed

0

изменение этой части

int numberguessed; 
    // Constructor 
    public MainPage() 
    { 
     InitializeComponent(); 
     Random randnum = new Random(); 
     int numberguessed = randnum.Next(0,1000); 
    } 

Для

private int numberguessed; 
    // Constructor 
    public MainPage() 
    { 
     InitializeComponent(); 
     Random randnum = new Random(); 
     numberguessed = randnum.Next(0,1000); 
    } 

Проблема заключается в том, что как только вы объявляете поле/свойство в классе, а затем создать аналогичное поле с декларацией int numberguessed снова внутри конструктора. Это последнее поле остается в пределах внутри конструктора и отмирает после завершения конструктора. Тем не менее, значение по умолчанию для всех int-полей равно 0, а поле, к которому вы обращаетесь, - это тот, который был назначен классом OUTSIDE. Следовательно, вы получаете только значение по умолчанию.

Смежные вопросы