練習 - 使用 if、else if 和 else 建立巢狀決策邏輯

已完成

您已在上一個單元中使用多個 if 陳述式來實作遊戲的規則。 不過,您在單元的結尾注意到需要使用更多表達性 if 陳述式來修正程式碼中的細微錯誤。

在本練習中,您將使用 ifelseelse if 陳述式來改善程式碼中的分支選項,並修復邏輯錯誤。

使用 if 和 else 陳述式,而不是兩個不同的 if 陳述式

您不會執行兩項檢查來顯示 "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. 花一分鐘的時間檢查檔案最後的兩個 if 陳述式:

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

    請注意,兩個 if 陳述式都會以相同的數值比較 total。 這是使用 else 陳述式的絕佳機會。

  3. 按照以下範例更新兩個 if 陳述式:

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

    在這裡,如果 total >= 15 為 false,則將會執行 else 關鍵字後的程式碼區塊。 由於這兩個結果是相關的相反項,因此,這是 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 陳述句進行巢狀處理來修正該問題。

巢狀處理讓您能夠將程式碼區塊放在程式碼區塊內部。 在此情況下,您將巢狀處理 ifelse 的組合 (檢查雙倍) 到另一個 if 陳述式 (檢查三倍) 中,以防止同時獲得兩個獎勵。

  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 陳述式。

    目標是建立內部 if-else 建構,其中兩個結果是相關的相反項,然後使用相反的結果 (if/true 和 else/false) 來獎勵三倍和雙倍的額外點數。 為了達成此目標,您會檢查外部 if 陳述式中的雙倍,然後檢查內部 if 陳述式中的三倍。 這個模式能確保當三倍的內部檢查傳回 false 時,您的 else 程式碼區塊能獎勵雙倍的點數。

    接著,您將對三個擲骰結果進行「硬式編碼」來測試程式碼邏輯。

  3. 在宣告和初始化 total 位置的行上方建立空白程式碼行。

  4. 為了測試雙倍的擲骰結果,請輸入以下程式碼:

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

    對三個 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 和 else if 陳述式來提供獎勵,而不是輸贏的訊息

為了讓遊戲變得更有趣,您可以將遊戲從輸贏變更為針對每個分數頒發虛構獎項。 您可以提供四個獎項。 然而,玩家只能贏得一個獎項:

  • 如果玩家分數大於或等於 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 陳述式可讓您建立多個獨佔條件作為布林運算式。 換句話說,當您只想得到一個結果,但有數個可能的條件和結果時,請視需要使用多個 else if 陳述式。 如果 ifelse if 陳述式都不適用,則將執行最後一個 else 程式碼區塊。 您可以使用或不使用 else,如果要包含則必須放在最後面。

  3. 使用暫時硬式編碼 roll 變數的技術來測試每個訊息。

概括回顧

  • ifelse 陳述式的組合可讓您測試一個條件,然後執行兩個結果中的其中一個。 當布林運算式為 true 時,會執行 if 的程式碼區塊,而當布林運算式為 false 時,則會執行 else 的程式碼區塊。
  • 您可以巢狀處理 if 陳述式來縮小可能的條件。 不過,您應該考慮改為使用 ifelse ifelse 陳述式。
  • 使用 else if 陳述式來建立多個獨佔條件。
  • else 是選擇性的,但如果要包含,則必須一律放在最後。