演習 - if、else if、else を使用して入れ子になった決定ロジックを作成する

完了

前のユニットでは、複数 if のステートメントを使用してゲームのルールを実装しました。 ただし、ユニットの最後で、コードの微細なバグを修正するために、より表現力のある if ステートメントが必要であることに気付きました。

この演習では、ifelseelse if ステートメントを使用して、コード内の分岐オプションを改善し、ロジックのバグを修正します。

2 つの個別の if ステートメントの代わりに、if と else ステートメントを使用する

2 つのチェックを実行して "You win!" または "Sorry, you lose" というメッセージを表示する代わりに、else キーワードを使用します。

  1. Program.cs コードが以下と一致していることを確認してください。

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        Console.WriteLine("You rolled doubles! +2 bonus to total!");
        total += 2;
    }
    
    if ((roll1 == roll2) && (roll2 == roll3)) 
    {
        Console.WriteLine("You rolled triples! +6 bonus to total!");
        total += 6;
    }
    
    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    
    if (total < 15)
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    

    これは、前のユニットで完了したコードです。

  2. ファイルの末尾にある 2 つの if ステートメントを、時間をかけて調べてください。

    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    
    if (total < 15)
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    

    両方の if ステートメントが同じ数値と total を比較していることに注目してください。 これは、else ステートメントを使用する最適な機会です。

  3. 2 つの if ステートメントを次のように更新してください。

    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    else 
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    

    ここでは、total >= 15 が false の場合は、else キーワードに続くコード ブロックが実行されます。 これら 2 つの結果は正反対の関係にあるので、これは else キーワードに最適なシナリオです。

  4. 更新した Program.cs ファイルには、次のコードが含まれているはずです。

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        Console.WriteLine("You rolled doubles!  +2 bonus to total!");
        total += 2;
    }
    
    if ((roll1 == roll2) && (roll2 == roll3))
    {
        Console.WriteLine("You rolled triples!  +6 bonus to total!");
        total += 6;
    }
    
    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    else 
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    

入れ子を使用して、ダブルとトリプルの重複したボーナスを削除するように、コードを変更する

前のユニットでは、アプリケーションに微細なロジック バグが混入していることを確認しました。 if ステートメントを入れ子にすることで、この問題を解決できます。

入れ子を使用すると、コード ブロックの内部にコード ブロックを配置できます。 この場合、両方のボーナスが授与されないように、別の if ステートメント (トリプルのチェック) 内に elseif の組み合わせ (ダブルのチェック) を入れ子にします。

  1. 次のコード リストと一致するようにコードを変更します。

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        if ((roll1 == roll2) && (roll2 == roll3))
        {
            Console.WriteLine("You rolled triples!  +6 bonus to total!");
            total += 6;
        }
        else
        {
            Console.WriteLine("You rolled doubles!  +2 bonus to total!");
            total += 2;
        }
    }
    
    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    else 
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    
  2. 入れ子になった if ステートメントを、時間をかけて確認してください。

    目標は、2 つの結果が反対の関係の内部 if-else コンストラクトを作成し、反対の結果 (if/true と else/false) を使用して、トリプルとダブルのボーナス ポイントを付与することです。 この目標を達成するには、外側の if ステートメントでダブルを、次に内部の if ステートメントでトリプルをチェックしてください。 このパターンにより、トリプルの内部チェックで false が返されるときに、else コード ブロックがダブルのポイントを付与できるようになります。

    次に、コード ロジックをテストするために、3 回振った結果を "ハード コード" してください。

  3. total が宣言および初期化されている行の上に空のコード行を作成してください。

  4. ダブルで振った場合をテストするには、次のコードを入力してください。

    roll1 = 6;
    roll2 = 6;
    roll3 = 5;
    

    3 つの roll 変数をハード コーディングすると、アプリケーションを何度も実行しなくてもコードをテストできます。

  5. [Visual Studio Code ファイル] メニューの [ 保存] をクリックします。

  6. エクスプローラー ビューで、TestProject フォルダーの場所でターミナルを開くには、[ TestProject] を右クリックし、[ 統合ターミナルで開く] を選択します。

    ターミナル パネルが開き、ターミナルが TestProject フォルダーの場所に対して開かれていることを示すコマンド プロンプトが含まれているはずです。

  7. ターミナル コマンド プロンプトで、コードを実行するには、「 dotnet run 」と入力し、Enter キーを押します。

    コードを実行すると、次の情報が表示されます。

    Dice roll: 6 + 6 + 5 = 17
    You rolled doubles!  +2 bonus to total!
    You win!
    
    
  8. トリプルで振った場合をテストするには、ハードコーディングされたロール変数を次のように更新してください。

    roll1 = 6;
    roll2 = 6;
    roll3 = 6;
    
  9. [Visual Studio Code ファイル] メニューの [ 保存] をクリックします。

  10. エクスプローラー ビューで、TestProject フォルダーの場所でターミナルを開くには、[ TestProject] を右クリックし、[ 統合ターミナルで開く] を選択します。

  11. ターミナル コマンド プロンプトで、コードを実行するには、「 dotnet run 」と入力し、Enter キーを押します。

    コードを実行すると、次の情報が表示されます。

    Dice roll: 6 + 6 + 6 = 18
    You rolled triples!  +6 bonus to total!
    You win!
    
    

if、else if、else ステートメントを使用して、勝ち負けメッセージではなく賞品を与える

ゲームをいっそう面白くするため、"勝ち負け" のゲームを、スコアごとに架空の賞品を与えるゲームに変更することができます。 4 つの賞品を提供します。 ただし、プレーヤーが獲得できる賞品は 1 つだけです。

  • プレーヤーのスコアが 16 以上の場合は、新車を獲得します。
  • プレーヤーのスコアが 10 以上の場合は、新しいラップトップを獲得します。
  • プレーヤーのスコアがちょうど 7 の場合は、旅行を獲得します。
  • それ以外の場合は、プレーヤーは子猫を獲得します。
  1. 次のコード リストのように、前のステップのコードを変更します。

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        if ((roll1 == roll2) && (roll2 == roll3))
        {
            Console.WriteLine("You rolled triples!  +6 bonus to total!");
            total += 6;
        }
        else
        {
            Console.WriteLine("You rolled doubles!  +2 bonus to total!");
            total += 2;
        }
    
        Console.WriteLine($"Your total including the bonus: {total}");
    }
    
    if (total >= 16)
    {
        Console.WriteLine("You win a new car!");
    }
    else if (total >= 10)
    {
        Console.WriteLine("You win a new laptop!");
    }
    else if (total == 7)
    {
        Console.WriteLine("You win a trip for two!");
    }
    else
    {
        Console.WriteLine("You win a kitten!");
    }
    
    
  2. 更新された if-elseif-else コンストラクトを、時間をかけて確認してください。

    ifelse ifelse ステートメントを使用すると、複数の排他条件をブール式として作成できます。 つまり、1 つの結果だけを発生させたくても、可能性のある条件と結果が複数ある場合は、必要な数だけ else if ステートメントを使用します。 ifelse if ステートメントのいずれも適用されない場合は、最終的な else コード ブロックが実行されます。 else は省略可能ですが、含める場合は最後に指定する必要があります。

  3. roll 変数を一時的にハード コーディングする方法を使用して、各メッセージをテストしてください。

要点

  • ifelse ステートメントの組み合わせを使用すると、1 つの条件をテストしてから、2 つの結果のいずれかを実行できます。 if のコード ブロックは、ブール式が true の場合に実行され、else のコード ブロックはブール式が false の場合に実行されます。
  • if ステートメントを入れ子にし、考えられる条件を絞り込むことができます。 しかし、代わりに ifelse ifelse ステートメントを使用することを検討する必要があります。
  • 複数の排他的条件を作成するには、else if を使用します。
  • else は省略可能ですが、含める場合は常に最後に指定する必要があります。