練習 - 使用 if、else if 和 else 建立巢狀決策邏輯
您已在上一個單元中使用多個 if
陳述式來實作遊戲的規則。 不過,您在單元的結尾注意到需要使用更多表達性 if
陳述式來修正程式碼中的細微錯誤。
在本練習中,您將使用 if
、else
和 else if
陳述式來改善程式碼中的分支選項,並修復邏輯錯誤。
使用 if 和 else 陳述式,而不是兩個不同的 if 陳述式
您不會執行兩項檢查來顯示 "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."); }
這是您在上一個單元中完成的程式碼。
花一分鐘的時間檢查檔案最後的兩個
if
陳述式:if (total >= 15) { Console.WriteLine("You win!"); } if (total < 15) { Console.WriteLine("Sorry, you lose."); }
請注意,兩個
if
陳述式都會以相同的數值比較total
。 這是使用else
陳述式的絕佳機會。按照以下範例更新兩個
if
陳述式:if (total >= 15) { Console.WriteLine("You win!"); } else { Console.WriteLine("Sorry, you lose."); }
在這裡,如果
total >= 15
為 false,則將會執行else
關鍵字後的程式碼區塊。 由於這兩個結果是相關的相反項,因此,這是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
陳述式。目標是建立內部
if-else
建構,其中兩個結果是相關的相反項,然後使用相反的結果 (if/true 和 else/false) 來獎勵三倍和雙倍的額外點數。 為了達成此目標,您會檢查外部if
陳述式中的雙倍,然後檢查內部if
陳述式中的三倍。 這個模式能確保當三倍的內部檢查傳回false
時,您的else
程式碼區塊能獎勵雙倍的點數。接著,您將對三個擲骰結果進行「硬式編碼」來測試程式碼邏輯。
在宣告和初始化
total
位置的行上方建立空白程式碼行。為了測試雙倍的擲骰結果,請輸入以下程式碼:
roll1 = 6; roll2 = 6; roll3 = 5;
對三個
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 和 else if 陳述式來提供獎勵,而不是輸贏的訊息
為了讓遊戲變得更有趣,您可以將遊戲從輸贏變更為針對每個分數頒發虛構獎項。 您可以提供四個獎項。 然而,玩家只能贏得一個獎項:
- 如果玩家分數大於或等於 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
陳述式可讓您建立多個獨佔條件作為布林運算式。 換句話說,當您只想得到一個結果,但有數個可能的條件和結果時,請視需要使用多個else if
陳述式。 如果if
與else if
陳述式都不適用,則將執行最後一個else
程式碼區塊。 您可以使用或不使用else
,如果要包含則必須放在最後面。使用暫時硬式編碼
roll
變數的技術來測試每個訊息。
概括回顧
if
和else
陳述式的組合可讓您測試一個條件,然後執行兩個結果中的其中一個。 當布林運算式為true
時,會執行if
的程式碼區塊,而當布林運算式為false
時,則會執行else
的程式碼區塊。- 您可以巢狀處理
if
陳述式來縮小可能的條件。 不過,您應該考慮改為使用if
、else if
和else
陳述式。 - 使用
else if
陳述式來建立多個獨佔條件。 else
是選擇性的,但如果要包含,則必須一律放在最後。