演習 - if、else if、else を使用して入れ子になった決定ロジックを作成する
前のユニットでは、複数 if
のステートメントを使用してゲームのルールを実装しました。 ただし、ユニットの最後で、コードの微細なバグを修正するために、より表現力のある if
ステートメントが必要であることに気付きました。
この演習では、if
、else
、else if
ステートメントを使用して、コード内の分岐オプションを改善し、ロジックのバグを修正します。
2 つの個別の if ステートメントの代わりに、if と else ステートメントを使用する
2 つのチェックを実行して "You win!" または "Sorry, you lose" というメッセージを表示する代わりに、else
キーワードを使用します。
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 つの
if
ステートメントを、時間をかけて調べてください。if (total >= 15) { Console.WriteLine("You win!"); } if (total < 15) { Console.WriteLine("Sorry, you lose."); }
両方の
if
ステートメントが同じ数値とtotal
を比較していることに注目してください。 これは、else
ステートメントを使用する最適な機会です。2 つの
if
ステートメントを次のように更新してください。if (total >= 15) { Console.WriteLine("You win!"); } else { Console.WriteLine("Sorry, you lose."); }
ここでは、
total >= 15
が false の場合は、else
キーワードに続くコード ブロックが実行されます。 これら 2 つの結果は正反対の関係にあるので、これはelse
キーワードに最適なシナリオです。更新した 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
ステートメント (トリプルのチェック) 内に else
と if
の組み合わせ (ダブルのチェック) を入れ子にします。
次のコード リストと一致するようにコードを変更します。
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."); }
入れ子になった
if
ステートメントを、時間をかけて確認してください。目標は、2 つの結果が反対の関係の内部
if-else
コンストラクトを作成し、反対の結果 (if/true と else/false) を使用して、トリプルとダブルのボーナス ポイントを付与することです。 この目標を達成するには、外側のif
ステートメントでダブルを、次に内部のif
ステートメントでトリプルをチェックしてください。 このパターンにより、トリプルの内部チェックでfalse
が返されるときに、else
コード ブロックがダブルのポイントを付与できるようになります。次に、コード ロジックをテストするために、3 回振った結果を "ハード コード" してください。
total
が宣言および初期化されている行の上に空のコード行を作成してください。ダブルで振った場合をテストするには、次のコードを入力してください。
roll1 = 6; roll2 = 6; roll3 = 5;
3 つの
roll
変数をハード コーディングすると、アプリケーションを何度も実行しなくてもコードをテストできます。[Visual Studio Code ファイル] メニューの [ 保存] をクリックします。
エクスプローラー ビューで、TestProject フォルダーの場所でターミナルを開くには、[ TestProject] を右クリックし、[ 統合ターミナルで開く] を選択します。
ターミナル パネルが開き、ターミナルが TestProject フォルダーの場所に対して開かれていることを示すコマンド プロンプトが含まれているはずです。
ターミナル コマンド プロンプトで、コードを実行するには、「 dotnet run 」と入力し、Enter キーを押します。
コードを実行すると、次の情報が表示されます。
Dice roll: 6 + 6 + 5 = 17 You rolled doubles! +2 bonus to total! You win!
トリプルで振った場合をテストするには、ハードコーディングされたロール変数を次のように更新してください。
roll1 = 6; roll2 = 6; roll3 = 6;
[Visual Studio Code ファイル] メニューの [ 保存] をクリックします。
エクスプローラー ビューで、TestProject フォルダーの場所でターミナルを開くには、[ TestProject] を右クリックし、[ 統合ターミナルで開く] を選択します。
ターミナル コマンド プロンプトで、コードを実行するには、「 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 の場合は、旅行を獲得します。
- それ以外の場合は、プレーヤーは子猫を獲得します。
次のコード リストのように、前のステップのコードを変更します。
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!"); }
更新された
if-elseif-else
コンストラクトを、時間をかけて確認してください。if
、else if
、else
ステートメントを使用すると、複数の排他条件をブール式として作成できます。 つまり、1 つの結果だけを発生させたくても、可能性のある条件と結果が複数ある場合は、必要な数だけelse if
ステートメントを使用します。if
とelse if
ステートメントのいずれも適用されない場合は、最終的なelse
コード ブロックが実行されます。else
は省略可能ですが、含める場合は最後に指定する必要があります。roll
変数を一時的にハード コーディングする方法を使用して、各メッセージをテストしてください。
要点
-
if
とelse
ステートメントの組み合わせを使用すると、1 つの条件をテストしてから、2 つの結果のいずれかを実行できます。if
のコード ブロックは、ブール式がtrue
の場合に実行され、else
のコード ブロックはブール式がfalse
の場合に実行されます。 -
if
ステートメントを入れ子にし、考えられる条件を絞り込むことができます。 しかし、代わりにif
、else if
、else
ステートメントを使用することを検討する必要があります。 - 複数の排他的条件を作成するには、
else if
を使用します。 -
else
は省略可能ですが、含める場合は常に最後に指定する必要があります。