отображение случайных чисел - PullRequest
2 голосов
/ 01 июня 2009

Я пытаюсь разработать код, в котором можно угадать число. Я определил диапазон, который номер для отображения в моем списке. Я начал писать Random (1,10), но если я ввожу 11, он все еще пишет в моем списке. Как я могу просто написать число, выбранное из моего диапазона, которое составляет 1-10?

Я совершенно заблудился здесь. Есть идеи?

Спасибо, вот часть моего кода:

     private void btnOk_Click(object sender, EventArgs e)
      {

        string yourNumber;
        yourNumber = textBox1.Text.Trim();

        int returnNumber = RandomNumber(1, 10);                 
        int.TryParse(textBox1.Text, out returnNumber);
        listBox1.Items.Add(returnNumber);            
      }

========= Дополнительный вопрос если я хотел бы отобразить диапазон чисел, как, например, 1-10, как я могу это сделать: Так, например, если пользователь введет 11, программа не примет это.

Я сделал что-то вроде этого:

        int returnNumber = RandomNumber(1, 10);    

        string yourNumber;
        yourNumber = textBox1.Text.Trim();  


        if(Int32.TryParse(textBox1.Text>=1)) && (Int32.TryParse(textBox1.Text<=10));
        {
        listBox1.Items.Add(yourNumber);
        textBox1.Text = string.Empty;
        } 

что-то не так в программе

==============

Здравствуйте, еще раз спасибо Натаниэлю за ответ. Но я попробовал это:

int returnNumber=RandomNumber(1,10);
int counter=1;
int yourNumber;

Int32.TryParse(textBox1.Text.Trim(), out yourNumber);
if (yourNumber >=1 && yourNumber <= 10)
{
  listBox1.Items.Add(yourNumber);
}
else
{
  MessageBox.Show("Please enter a number between 1-10");
}

Я хотел бы разработать программу для угадывания числа. Итак, это первая часть.

====

Привет еще раз, вот мой окончательный код: я был бы рад, если бы вы могли дать отзыв о том, как я могу сделать это лучше. Благодарю. Я думаю, что следующая вещь, которую я сделаю, это ограничит время, когда пользователь вводит данные. Это означает, что они могут угадать правильное число только 3 раза или 5 раз. Не уверен, где это реализовать

  namespace Guessing_Game
   {
  public partial class Form1 : Form
   {
    private static int randomNumber;
    private const int rangeNumberMin = 1;
    private const int rangeNumberMax = 10;

    public Form1()
    {
        InitializeComponent();
        randomNumber = GenerateNumber(rangeNumberMin, rangeNumberMax);
    }


    private int GenerateNumber(int min,int max)
    {
        Random random = new Random();
        return random.Next(min, max);
    }

    private void btnOk_Click(object sender, EventArgs e)
    {
        int yourNumber = 0;

        Int32.TryParse(textBox1.Text.Trim(), out yourNumber);

        if (yourNumber>= rangeNumberMin && yourNumber<=rangeNumberMax)
        {
            listBox1.Items.Add(yourNumber);
            if (yourNumber > randomNumber)
            {
                listBox2.Items.Add("No the Magic Number is lower than your number");
            }

            if (yourNumber < randomNumber)
            {
                listBox2.Items.Add("No, the Magic Number is higher than your number");
            }

            if(yourNumber==randomNumber)
            {
                listBox2.Items.Add("You guessed the Magic Number!");
                btnRestart.Enabled = true;
            }
        }
        else
        {
            MessageBox.Show("Please enter a number between " + rangeNumberMin + " to " + rangeNumberMax);
        }
    }

    private void btnRestart_Click(object sender, EventArgs e)
    {
        listBox2.Items.Clear();
        listBox1.Items.Clear();
        textBox1.Text = null;
        randomNumber = GenerateNumber(rangeNumberMin, rangeNumberMax);
        btnRestart.Enabled = false;
    }
}

Ответы [ 3 ]

10 голосов
/ 01 июня 2009

Линия:

int returnNunmber = RandomNumber(1, 10); 

ничего не делает, потому что в следующей строке returnNumber используется в качестве выходной переменной и будет любым числом в textBox1. Удалить

int.TryParse(textBox1.Text, out returnNumber);

и добавит в список случайное число от 1 до 10.

EDIT :::: Чтобы ответить на дополнительный вопрос, попробуйте:

private void btnOk_Click(object sender, EventArgs e)
  {
    string yourNumber;
    yourNumber = textBox1.Text.Trim();
    int returnNumber;    
    int.TryParse(textBox1.Text, out returnNumber);
    if( returnNumber < 1 || returnNumber > 10) {
      returnNumber = RandomNumber(1, 10);
    }
    listBox1.Items.Add(returnNumber);            
  }
2 голосов
/ 10 июня 2009

Некоторые незначительные изменения в вашем коде, сжатие пары строк и добавление кода лимита, использование списка догадок в качестве счетчика:

namespace Guessing_Game
{
   public partial class Form1 : Form
   {
        private static int randomNumber;
        private const int rangeNumberMin = 1;
        private const int rangeNumberMax = 10;
        private const int maxGuesses = 5;

        public Form1()
        {
            InitializeComponent();
            randomNumber = GenerateNumber(rangeNumberMin, rangeNumberMax);
        }


        private int GenerateNumber(int min,int max)
        {
            Random random = new Random();
            return random.Next(min, max);
        }

        private void btnOk_Click(object sender, EventArgs e)
        {
            int yourNumber = 0;

            if (Int32.TryParse(textBox1.Text.Trim(), out yourNumber) &&
               yourNumber>= rangeNumberMin && yourNumber<=rangeNumberMax)
            {

                listBox1.Items.Add(yourNumber);

                if (yourNumber > randomNumber)
                {
                    listBox2.Items.Add("No the Magic Number is lower than your number");
                }
                else if (yourNumber < randomNumber)
                {
                    listBox2.Items.Add("No, the Magic Number is higher than your number");
                }
                else
                {
                    listBox2.Items.Add("You guessed the Magic Number!");
                    textBox1.Enabled = false;
                    btnOk.Enable = false;
                    btnRestart.Enabled = true;
                }

                //Will stop on the 5th guess, but guards the case that there were more than 5 guesses
                if(listBox1.Items.Count >= maxGuesses && yourNumber != randomNumber)
                { 
                    listBox2.Items.Add("You are out of guesses!");
                    textBox1.Enabled = false;
                    btnOk.Enable = false;
                    btnRestart.Enabled = true;
                }
            }
            else
            {
                MessageBox.Show("Please enter a number between " + rangeNumberMin + " to " + rangeNumberMax);
            }
        }

        private void btnRestart_Click(object sender, EventArgs e)
        {
            listBox2.Items.Clear();
            listBox1.Items.Clear();
            textBox1.Text = null;
            randomNumber = GenerateNumber(rangeNumberMin, rangeNumberMax);
            btnRestart.Enabled = false;
            textBox1.Enabled = true;
            btnOk.Enable = true;

        }
    }
}

Отредактировано, чтобы предотвратить сообщение "Вы вне догадок", когда число правильно угадано в последнем предположении.

2 голосов
/ 10 июня 2009

Давайте возьмем этот кусок за куском:

int returnNumber = RandomNumber(1, 10);

Нет встроенной функции RandomNumber; обратите внимание, что с классом Random конечное значение является эксклюзивным, поэтому для числа в диапазоне вам понадобится что-то вроде:

static readonly Random rand = new Random();
static int Random(int min, int max) {
    if(max < min) throw new ArgumentOutOfRangeException("max");
    lock(rand) {
        return rand.Next(min, max + 1);    
    }
}

Однако затем вы полностью отбрасываете это значение:

int.TryParse(textBox1.Text, out returnNumber);

Использование out означает, что предыдущее значение returnNumber полностью игнорируется. Я не уверен, каково ваше намерение, но оно кажется , как будто вы просто хотите проверить значение:

if(int.TryParse(textBox1.Text, out returnNumber)
      && returnNumber >= 1 && returnNumber <= 10)
{
    listBox1.Items.Add(returnNumber);
}

Я пытался взглянуть на последний пример, но на самом деле неясно, что вы пытаетесь сделать - вы можете уточнить?


(отредактировано после редактирования вопроса и комментариев)

Вам понадобится счетчик, который вы увеличиваете для неудачных попыток - что-то вроде:

using System;
using System.Drawing;
using System.Windows.Forms;
class MyForm : Form {
    Button btn;
    ListBox lst;
    TextBox tb;
    const int MaxTries = 3, MaxNumber = 10;
    int targetNumber, guessCount = 0;
    public MyForm() {
        targetNumber = new Random().Next(1, MaxNumber + 1);
        Text = "Guess a number";
        Icon = SystemIcons.Question;
        Controls.Add(lst = new ListBox {Dock=DockStyle.Fill});
        Controls.Add(btn = new Button {Text="Guess",Dock=DockStyle.Top});
        Controls.Add(tb = new TextBox {Dock=DockStyle.Top});
        btn.Click += btn_Click;
    }

    void  btn_Click(object sender, EventArgs e) {
        int userNumber;
        if (int.TryParse(tb.Text.Trim(), out userNumber)) {
            if (userNumber < 1 || userNumber > MaxNumber) {
                lst.Items.Add("Did I mention... between 1 and " + MaxNumber);
            } else {
                if (userNumber == targetNumber) {
                    lst.Items.Add("Well done! You guessed well");
                    btn.Enabled = false; // all done
                } else {
                    lst.Items.Add(targetNumber < userNumber
                        ? "Try a bit lower" : @"It is bigger than that");
                    if (++guessCount >= MaxTries) {
                        btn.Enabled = false;
                        lst.Items.Add("Oops, should have picked more wisely");
                    }
                }
            }
        } else {
            lst.Items.Add("Nice; now give me a number");
        }
    }
    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MyForm());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...