次の方法で共有


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

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

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

この 2 番目のチュートリアルでは、次の方法を学習します。

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

前提 条件

このチュートリアルは、計算クイズの WinForms アプリを作成する前のチュートリアルに基づいています。 そのチュートリアルを完了していない場合は、先にそれをやってください。

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

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

  2. フォームを選択し、Form1を指定します。

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

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

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

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

プログラムを実行すると、フォームが開始されます。 その背後にあるコードは Random オブジェクトを作成し、それに ランダマイザーと名前を付けます。

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

  1. フォームに 2 つの整数変数を追加し、それらを addend1 および addend2 と命名し、Form1.cs または Form1.vbに配置します。

    手記

    整数変数は、C# では int、Visual Basic では 整数 と呼ばれます。 この種の変数は、-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()Form1.cs または Form1.vbという名前のメソッドを追加します。 このメソッドは、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. 残りの数学問題の整数変数を、問題変数の加算後にフォームに追加します。 Form1.cs または Form1.vb のコードは、次のサンプルのようになります。

    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. 次のコードを追加して、Form1.cs または Form1.vbStartTheQuiz() メソッドを変更します。最初は「減算問題を埋める」コメントから始まります。

    /// <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. アプリを実行し、[クイズ 開始] を選択します。 次のスクリーンショットに示すように、ランダムな数学の問題が表示されます。

    4 つの数学問題すべてにランダムな値を示すスクリーンショット。[テストの開始] ボタンが淡色表示されます。

次の手順

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