Как поместить генератор случайных чисел во весь код для C#

#c# #visual-studio

#c# #visual-studio

Вопрос:

В настоящее время я работаю над математической игрой в C # windows form. Мне нужно сгенерировать 2 случайных числа 1-99 и отобразить их для каждой математической функции. У меня есть две кнопки: одна для запуска игры, а другая для отправки ответа. Моя ошибка заключалась в том, что я сделал два отдельных набора случайных чисел, чтобы кнопка «Пуск» имела разные случайные числа от кнопки отправки. Я хочу иметь одинаковые случайные числа для каждого раздела, как мне это сделать? У меня есть идея поместить его в общедоступный класс form1, но он продолжает говорить, что у меня ошибка.

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MathLearning
{

    public partial class Form1 : Form
    {
        //This is where I believe it is supposed to go
        //Random ranNum = new Random();
        //int num1 = ranNum.Next(1, 100);
        //int num2 = ranNum.Next(1, 100);
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }
        private void btnStart_Click(object sender, EventArgs e)
        {
            btnStart.Text = "Next";
            if (rdoAddition.Checked)
            {
                int answer = num1   num2;
                lblQuestion.Text = $"{num1   "   "   num2   "?"}";
            }
            if (rdoSubtraction.Checked)
            {
                int answer = num1 / num2;
                lblQuestion.Text = $"{num1   " / "   num2   "?"}";
            }
            if (rdoMultiplication.Checked)
            {
                int answer = num1 * num2;
                lblQuestion.Text = $"{num1   " * "   num2   "?"}";
            }
            if (rdoDivison.Checked)
            {
                int answer = num1 / num2;
                lblQuestion.Text = $"{num1   " / "   num2   "?"}";
            }
        }

        private void btnSubmit_Click(object sender, EventArgs e)
        {
            Random ranNum = new Random();
            int num1 = ranNum.Next(1, 100);
            int num2 = ranNum.Next(1, 100);
            int i = 0;
            if(rdoGenderM.Checked)
            {
                if (rdoAddition.Checked)
                {
                    int answer = num1   num2;
                    if(int.Parse(txtAnswer.Text) == answer)
                    {
                        lblQuestion.Text = $"{"Good Job SirnYou got "   i   " correct Out of "   i   " problems."}";
                    }
                    else
                        lblQuestion.Text = $"{num1   "   "   num2   "?nThe answer is "   answer}";
                }
            }
            //else if(rdoGenderF.Checked)
            //{
            //    lblQuestion.Text = $"{"Good Job MadamnYou got "   i   " correct Out of "   i   " problems."}";
            //}
            //else
            //   lblQuestion.Text = $"{"Good Job Unknown gendernYou got "   i   " correct Out of "   i   " problems."}";
        }
    }
}
  

Вот как выглядит моя форма

Комментарии:

1. Вы правильно считаете. Удалите код из in btnSubmit_Click и поместите его туда, куда вы думаете.

2. Вы также должны использовать decimal , а не int как с int , когда вы делаете 9 / 2 ответ, который вы получаете 4 , нет 4.5 . Вам нужно decimal (или double ) получить, ну, десятичные числа.

Ответ №1:

Вы на правильном пути, просто инициализируйте их в конструкторе или где бы это ни имело смысл.

 private Random ranNum = new Random();
private int num1;
private int num2;

public Form1()
{
    InitializeComponent();
    num1 = ranNum.Next(1, 100);
    num2 = ranNum.Next(1, 100);
}
  

Более длинная история

Инициализаторы полей / свойств не могут получить доступ к нестатическим элементам, таким как ваше случайное поле, в этом случае это привело бы к введению логики инициализации, зависящей от порядка, которая легко ломается и зависит от реализации. Однако вы можете получить доступ к элементам экземпляра в конструкторе. Во время вызова конструктора были вызваны все другие инициализаторы полей и свойств, что делает безопасным вызов членов экземпляра.

Ответ №2:

Это должно сработать, каждый раз, когда вы нажимаете «Пуск», он будет генерировать новые числа.

 using System.Collections.Generic;
using System;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MathLearning
{

    public partial class Form1 : Form
    {
        //This is where I believe it is supposed to go
        Random ranNum = new Random();
        int num1 = 0;
        int num2 = 0;
        int i = 0;
        int numProblems = 0;

        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }
        private void btnStart_Click(object sender, EventArgs e)
        {
            btnStart.Text = "Next";
            int num1 = ranNum.Next(1, 100);
            int num2 = ranNum.Next(1, 100);
            if (rdoAddition.Checked)
            {
                int answer = num1   num2;
                lblQuestion.Text = $"{num1   "   "   num2   "?"}";
            }
            if (rdoSubtraction.Checked)
            {
                int answer = num1 / num2;
                lblQuestion.Text = $"{num1   " / "   num2   "?"}";
            }
            if (rdoMultiplication.Checked)
            {
                int answer = num1 * num2;
                lblQuestion.Text = $"{num1   " * "   num2   "?"}";
            }
            if (rdoDivison.Checked)
            {
                int answer = num1 / num2;
                lblQuestion.Text = $"{num1   " / "   num2   "?"}";
            }

            numProblems  ;
        }

        private void btnSubmit_Click(object sender, EventArgs e)
        {
            
            if(rdoGenderM.Checked)
            {
                if (rdoAddition.Checked)
                {
                    int answer = num1   num2;
                    if(int.Parse(txtAnswer.Text) == answer)
                    {
                        i  ;
                        lblQuestion.Text = $"{"Good Job SirnYou got "   i   " correct Out of "   numProblems   " problems."}";
                    }
                    else
                        lblQuestion.Text = $"{num1   "   "   num2   "?nThe answer is "   answer}";
                }
            }
            //else if(rdoGenderF.Checked)
            //{
            //    lblQuestion.Text = $"{"Good Job MadamnYou got "   i   " correct Out of "   numProblems   " problems."}";
            //}
            //else
            //   lblQuestion.Text = $"{"Good Job Unknown gendernYou got "   i   " correct Out of "   numProblems   " problems."}";
        }
    }
}
  

Комментарии:

1. OP объявляется int answer в btnStart_Click методе. Вы сделали то же самое. Но это не работает — если вы собираетесь показывать весь этот код, вы должны убедиться, что он работает.