チュートリアル: 数学クイズの WinForms アプリに数学の問題を追加する

この 4 つのチュートリアル シリーズでは、計算クイズを作成します。 クイズには、クイズの解答者が指定した時間内に解答する 4 つのランダムな数学の問題が含まれています。

コントロールでは、C# または Visual Basic コードを使用します。 この 2 番目のチュートリアルでは、乱数に基づく数学の問題のコードを追加して、クイズを難しくします。 また、問題を埋めるために StartTheQuiz() という名前のメソッドも作成します。

この 2 番目のチュートリアルでは、次の作業を行う方法について説明します。

  • 数学の問題で使用する Random オブジェクトを作成するコードを記述します。
  • スタート ボタンのイベント ハンドラーを追加します。
  • クイズを開始するコードを記述します。

前提条件

このチュートリアルは、前のチュートリアル「数学クイズの WinForms アプリを作成する」を基にしています。 そのチュートリアルをまだ完了していない場合は、最初にそちらを終わらせてください。

ランダムな加算問題の作成

  1. Visual Studio プロジェクトで Windows フォーム デザイナーを選択します。

  2. フォーム [Form1] を選択します。

  3. メニュー バーで [表示]>[コード] の順に選択します。 使用しているプログラミング言語によって Form1.cs または Form1.vb が表示されるため、フォームの分離コードを表示できます。

  4. コードの先頭付近に new ステートメントを追加して Random オブジェクトを作成します。

    public partial class Form1 : Form
    {
        // Create a Random object called randomizer 
        // to generate random numbers.
        Random randomizer = new Random();
    

重要

このページの右上にあるプログラミング言語のコントロールを使用して、C# コード スニペットまたは Visual Basic コード スニペットのいずれかを表示します。

Programming language control for Microsoft Learn

このような new ステートメントを使用して、ボタン、ラベル、パネル、OpenFileDialogs、ColorDialogs、SoundPlayers、Randoms、さらにフォームも作成できます。 これらの項目はオブジェクトと呼ばれます。

プログラムを実行すると、フォームが開始されます。 その背後にあるコードによって Random オブジェクトが作成され、randomizer という名前が付けられます。

クイズには、各問題に対して作成される乱数を格納する変数が必要です。 変数を使用する前に、変数を宣言する必要があります。つまり、名前とデータ型を一覧表示します。

  1. 2 つの整数変数をフォームに追加し、addend1addend2 という名前を付けます。

    注意

    整数変数は、C# では int、Visual Basic では Integer と呼ばれます。 この種類の変数は、-2147483648 から 2147483647 の正または負の数を格納し、整数のみを格納することができ、小数は格納できません。

    次のコードに示すように、Random オブジェクトを追加する際に使用したものと同様の構文を使用して整数変数を追加します。

    // Create a Random object called randomizer 
    // to generate random numbers.
    Random randomizer = new Random();
    
    // These integer variables store the numbers 
    // for the addition problem. 
    int addend1;
    int addend2;
    

  1. StartTheQuiz() という名前のメソッドを追加します。 このメソッドは、Random オブジェクトの Next() メソッドを使用してラベルの乱数を生成します。 StartTheQuiz() により最終的にすべての問題が入力され、タイマーが開始されるため、この情報を概要コメントに追加します。 この関数は次のコードのようになります。

    /// <summary>
    /// Start the quiz by filling in all of the problems
    /// and starting the timer.
    /// </summary>
    public void StartTheQuiz()
    {
        // Fill in the addition problem.
        // Generate two random numbers to add.
        // Store the values in the variables 'addend1' and 'addend2'.
        addend1 = randomizer.Next(51);
        addend2 = randomizer.Next(51);
    
        // Convert the two randomly generated numbers
        // into strings so that they can be displayed
        // in the label controls.
        plusLeftLabel.Text = addend1.ToString();
        plusRightLabel.Text = addend2.ToString();
    
        // 'sum' is the name of the NumericUpDown control.
        // This step makes sure its value is zero before
        // adding any values to it.
        sum.Value = 0;
    }
    

randomizer.Next(51) を呼び出す場合など、Random オブジェクトで Next() メソッドを使用する場合、51 未満、つまり 0 から 50 の乱数が取得されます。 このコードで randomizer.Next(51) が呼び出され、2 つの乱数を合計した答えが 0 から 100 の間になるようにします。

次のステートメントについて詳しく見てみましょう。

plusLeftLabel.Text = addend1.ToString();
plusRightLabel.Text = addend2.ToString();

これらのステートメントにより、plusLeftLabelplusRightLabelText プロパティが設定され、2 つの乱数が表示されるようになります。 ラベル コントロールにより、テキスト形式で値が表示され、プログラミングでは文字列にテキストが保持されます。 各整数の ToString() メソッドにより、整数がラベルで表示できるテキストに変換されます。

ランダムな減算、乗算、除算の問題を作成する

次の手順では、変数を宣言し、他の数学の問題にランダムな値を指定します。

  1. 問題変数を追加した後、残りの数学の問題の整数変数をフォームに追加します。 コードは次の例のようになります。

    public partial class Form1 : Form
    {
        // Create a Random object called randomizer 
        // to generate random numbers.
        Random randomizer = new Random();
    
        // These integer variables store the numbers 
        // for the addition problem. 
        int addend1;
        int addend2;
    
        // These integer variables store the numbers 
        // for the subtraction problem. 
        int minuend;
        int subtrahend;
    
        // These integer variables store the numbers 
        // for the multiplication problem. 
        int multiplicand;
        int multiplier;
    
        // These integer variables store the numbers 
        // for the division problem. 
        int dividend;
        int divisor;
    

  1. "Fill in the subtraction problem" (減算問題を埋める) というコメントから始まる下記のコードを追加して、StartTheQuiz() メソッドを変更します。

    /// <summary>
    /// Start the quiz by filling in all of the problem 
    /// values and starting the timer. 
    /// </summary>
    public void StartTheQuiz()
    {
        // Fill in the addition problem.
        // Generate two random numbers to add.
        // Store the values in the variables 'addend1' and 'addend2'.
        addend1 = randomizer.Next(51);
        addend2 = randomizer.Next(51);
    
        // Convert the two randomly generated numbers
        // into strings so that they can be displayed
        // in the label controls.
        plusLeftLabel.Text = addend1.ToString();
        plusRightLabel.Text = addend2.ToString();
    
        // 'sum' is the name of the NumericUpDown control.
        // This step makes sure its value is zero before
        // adding any values to it.
        sum.Value = 0;
    
        // Fill in the subtraction problem.
        minuend = randomizer.Next(1, 101);
        subtrahend = randomizer.Next(1, minuend);
        minusLeftLabel.Text = minuend.ToString();
        minusRightLabel.Text = subtrahend.ToString();
        difference.Value = 0;
    
        // Fill in the multiplication problem.
        multiplicand = randomizer.Next(2, 11);
        multiplier = randomizer.Next(2, 11);
        timesLeftLabel.Text = multiplicand.ToString();
        timesRightLabel.Text = multiplier.ToString();
        product.Value = 0;
    
        // Fill in the division problem.
        divisor = randomizer.Next(2, 11);
        int temporaryQuotient = randomizer.Next(2, 11);
        dividend = divisor * temporaryQuotient;
        dividedLeftLabel.Text = dividend.ToString();
        dividedRightLabel.Text = divisor.ToString();
        quotient.Value = 0;
    

このコードでは、Random クラスの Next() メソッドを、加算問題の方法とは少し異なる方法で使用します。 Next() メソッドに 2 つの値を指定した場合、最初の値以上で 2 番目の値未満の乱数が選択されます。

2 つの引数を持つ Next() メソッドを使用すると、減算の問題の解答が正の数になり、乗算の解答が最大 100 で、除算の解答が分数ではないことが確保されます。

スタート ボタンにイベント ハンドラーを追加する

このセクションでは、スタート ボタンが選択されているときにクイズを開始するコードを追加します。 ボタンの選択のようなイベントに反応して実行されるコードは、イベント ハンドラーと呼ばれます。

  1. Windows フォーム デザイナーで、 [Start the quiz] ボタンをダブルクリックするか、それを選択して Enter キーを押します。 フォームのコードと、新しいメソッドが表示されます。

    これらのアクションによって、Click イベント ハンドラーがスタート ボタンに追加されます。 クイズの解答者がこのボタンを選択すると、この新しいメソッドに追加するコードがアプリによって実行されます。

  2. 次の 2 つのステートメントを追加して、イベント ハンドラーによりクイズが開始されるようにします。

    private void startButton_Click(object sender, EventArgs e)
    {
        StartTheQuiz();
        startButton.Enabled = false;           
    }
    

最初のステートメントは新しい StartTheQuiz() メソッドを呼び出します。 2 番目のステートメントで startButton コントロールの Enabled プロパティが false に設定されるため、クイズの解答者はクイズ中にこのボタンをクリックできません。

アプリを実行する

  1. コードを保存します。

  2. アプリを実行し、 [Start the quiz] ボタンを選択します。 次のスクリーンショットに示すように、ランダムな数学の問題が表示されます。

    Screenshot that shows random values in all four math problems. The Start the quiz button appears dimmed.

次のステップ

次のチュートリアルに進み、数学のクイズにタイマーを追加し、ユーザーの答えを確認します。