練習 - 使用 if 陳述式建立決策邏輯
大部分的應用程式都包含大量的執行路徑。 例如,應用程式可以根據使用者選取的功能表選項來實作不同的執行路徑。 開發人員會將實作不同執行路徑的程式碼稱為「程式碼分支」。
最廣泛使用的程式碼分支陳述式是 if
陳述式。 if
陳述式依賴用一組括弧括住的布林運算式。 如果運算式為 True,則會執行陳述式 if
之後的程式碼。 如果不是,NET 執行階段會忽略該程式碼,而且不會加以執行。
在本練習中,您將藉由建立遊戲來練習撰寫 if
陳述式。 首先,您將定義遊戲的規則,然後在程式碼中實作這些規則。
您將會使用 Random.Next()
方法來模擬擲出三顆六面骰子。 我們將評估這些值來計算分數。 如果分數大於任意總分,則您將會向使用者顯示獲勝訊息。 如果分數低於截止分數,您將會向使用者顯示失敗訊息。
- 如果您擲出的任兩個骰子產生相同的值,即會因為擲出兩倍而得到兩點獎勵。
- 如果您擲出的三顆骰子全都產生相同的值,則會因為擲出三倍而得到六點獎勵。
- 如果這三顆骰子擲出的總和加上任何獎勵點數為 15 或以上,您就贏得此遊戲。 否則,您就輸了。
隨著您深入了解 if
陳述式,就會精簡規則。
重要
本練習會廣泛使用 System.Random
類別。 如果您需要 Random.Next()
如何運作的進修課程,請參閱標題為「使用 C# 從 .NET Class Library 呼叫方法」的 Microsoft Learn 課程模組。
準備您的撰寫程式碼環境
本課程模組包含活動,引導您完成建置和執行範例程式代碼的程式。 鼓勵您使用 Visual Studio Code 做為開發環境來完成這些活動。 針對這些活動使用 Visual Studio Code,可協助您更熟悉在全球專業人員使用的開發人員環境中撰寫及執行程式碼。
打開 Visual Studio Code。
您可以使用 Windows [開始] 功能表 (或另一個作業系統的對等資源) 來開啟 Visual Studio Code。
在 Visual Studio Code 的 [檔案] 功能表上,選取 [開啟資料夾]。
在 [開啟資料夾] 對話方塊中,瀏覽至 Windows Desktop 資料夾。
如果您在不同的資料夾位置中保留程式碼專案,您可以改用該資料夾位置。 針對本訓練,請務必使用容易找到並記住的位置。
在 [開啟資料夾] 對話方塊中,選取 [選取資料夾]。
如果您看到詢問您是否信任作者的安全性對話方塊,請選取 [是]。
在 Visual Studio Code 的 [終端] 功能表上,選取 [新增終端]。
請注意,終端面板中的命令提示字元會顯示目前資料夾的資料夾路徑。 例如:
C:\Users\someuser\Desktop>
注意
如果您是在自己的電腦上工作,而不是在沙箱或託管環境中工作,且您已完成此 C# 系列中的其他 Microsoft Learn 課程模組,您可能已針對程式碼範例建立專案資料夾。 如果是這種情況,您可以略過下一個步驟,這個步驟會用來在 TestProject 資料夾中建立主控台應用程式。
在終端命令提示字元中,若要在指定的資料夾中建立新的主控台應用程式,請輸入 dotnet new console -o ./CsharpProjects/TestProject,然後按 Enter 鍵。
這個 .NET CLI 命令會使用 .NET 程式範本,在指定的資料夾位置中建立新的 C# 主控台應用程式專案。 這個命令會為您建立 CsharpProjects 和 TestProject 資料夾,並使用 TestProject 做為
.csproj
檔案的名稱。在 [總管] 面板中,展開 CsharpProjects 資料夾。
您應該會看到 TestProject 資料夾和兩個檔案:名為 Program.cs 的 C# 應用程式檔案,以及名為 TestProject.csproj 的 C# 專案檔。
在 [總管] 面板中,若要在 [編輯器] 面板中檢視程式碼檔案,請選取 [Program.cs]。
刪除現有的程式碼。
您將使用此 C# 主控台專案,在本課程模組期間建立、建置及執行程式碼範例。
關閉 [終端] 面板。
撰寫程式碼以產生三個亂數,並在輸出中顯示這些亂數
請確定您已在 Visual Studio Code 中開啟空的 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}");
請花幾分鐘檢閱您所輸入的程式碼。
首先,您會建立
System.Random
類別的新執行個體,並將物件的參考儲存在名為dice
的變數中。 然後,您會在dice
物件上呼叫Random.Next()
方法三次,並同時提供下限和上限來限制1
與6
之間的可能值 (上限除外)。 您會將這三個亂數分別儲存於變數roll1
、roll2
與roll3
中。接下來,您會將三個骰子加總,並將值儲存至名為
total
的整數變數中。最後,您會使用
WriteLine()
方法,利用字串內插補點來顯示三個值。當您執行程式碼時,應該會看到下列訊息 (數字將會不同)。
Dice roll: 4 + 5 + 2 = 11
此第一個工作是設定工作。 現在,您可在程式碼中加入決策邏輯,讓遊戲變得更有趣。
新增 if 陳述式,根據 total 變數的值顯示不同的訊息
在 Visual Studio Code 編輯器中,將游標定位在程式碼檔案底部,然後建立空白的程式碼行。
若要建立您的第一個遊戲功能,請輸入下列
if
陳述式。if (total > 14) { Console.WriteLine("You win!"); } if (total < 15) { Console.WriteLine("Sorry, you lose."); }
這兩個
if
陳述式是用來處理輸贏案例。 請花一分鐘的時間檢查第一個if
陳述式。請注意,
if
陳述式是由三個部分組成:if
關鍵字- 位於括弧
()
之間的「布林運算式」 - 以大括弧
{ }
定義的「程式碼區塊」
系統會在執行階段評估布林運算式
total > 14
。 若此陳述式為 True (如果total
的值大於14
),則執行流程將繼續執行程式碼區塊中所定義的程式碼。 換句話說,它將執行大括弧中的程式碼。不過,若布林運算式為 False (
total
的值不大於14
),則執行流程將略過此程式碼區塊。 換句話說,它將不會執行大括弧中的程式碼。最後,若使用者輸了,第二個
if
陳述式就會控制訊息。 在下一個單元中,您將在if
陳述式上使用變化,將這兩個陳述式縮短成單一陳述式,更清楚地表達意圖。
什麼是布林運算式?
布林運算式是任何會傳回布林值 (true
或 false
) 的程式碼。 最簡單的布林運算式就只是值 true
與 false
。 或者,布林運算式可以是傳回值 true
或 false
的方法結果。 例如,以下是一個簡單的程式碼範例,此範例會使用 string.Contains()
方法來評估某個字串是否包含另一個字串。
string message = "The quick brown fox jumps over the lazy dog.";
bool result = message.Contains("dog");
Console.WriteLine(result);
if (message.Contains("fox"))
{
Console.WriteLine("What does the fox say?");
}
因為 message.Contains("fox")
會傳回 true
或 false
值,所以符合布林運算式的條件,而且可在 if
陳述式中使用。
您可以使用運算子來建立其他簡單的布林運算式,以比較兩個值。 運算子包括:
==
,用來測試是否相等的「等於」運算子>
,用來測試左邊值是否大於右邊值的「大於」運算子<
,用來測試左邊值是否小於右邊值的「小於」運算子>=
,「大於或等於」運算子<=
,「小於或等於」運算子- 依此類推…
注意
Microsoft Learn 上的 C# 訓練系列會將整個課程模組用於布林運算式。 有許多運算子,您可以用來建立布林運算式,但在本課程模組中,您只會在這裡討論一些基本概念。 如需布林運算式的詳細資訊,請參閱標題為「在 C# 中評估布林運算式以進行決策」的 Microsoft Learn 課程模組。
在此範例中,您已評估過布林運算式 total > 14
。 不過,您可能已選擇布林運算式 total >= 15
,因為在此案例中,其是相同的。 假設遊戲規則指定「如果三顆骰子的點數總和加上任何獎勵點數為 15 點或以上,您就贏得遊戲」,您應該可能會實作 >= 15
運算式。 您將在此練習的下一個步驟中進行該變更。
什麼是程式碼區塊?
程式碼區塊是一或多行程式碼的集合,以左和右大括弧符號 { }
來定義。 其代表在您的軟體系統中具有單一用途的程式碼完整單位。 在此案例中,若布林運算式為 True,即會在執行階段執行程式碼區塊中的所有程式碼。 反之,若布林運算式為 False,則會忽略程式碼區塊中的所有程式碼。
您也應該知道程式碼區塊可以包含其他程式碼區塊。 事實上,在您的應用程式中,一個程式碼區塊成為另一個程式碼區塊內的「巢狀」區塊,這是很常見的。 當您在另一個陳述式的程式碼區塊內建立一個 if
陳述式時,您稍後會在本課程模組中開始巢狀化自己的程式碼區塊。
注意
Microsoft Learn 上的 C# 訓練系列會將整個課程模組用於了解程式碼區塊。 程式碼區塊是了解程式碼組織和結構的核心,可以定義變數範圍的界限。 請參閱課程模組「[Control variable scope and logic using code blocks in C#](TBD)
」。
新增另一個 if 陳述式來實作雙倍獎勵
接下來,您可以實作規則:「如果您擲出的任兩個骰子產生相同的值,即會因為擲出雙倍而得到兩點獎勵」。 修改先前步驟的程式碼,以符合下列程式碼清單:
在 Visual Studio Code 編輯器中,將游標定位在第一個
if
陳述式上方的空白程式碼行上。若要建立您的「雙倍」遊戲功能,請輸入下列
if
陳述式。if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)) { Console.WriteLine("You rolled doubles! +2 bonus to total!"); total += 2; }
在這裡您會結合三個布林運算式,在單行程式碼中建立一個複合布林運算式。 這有時稱為「複合條件」。 您有一組外部括弧,其中會結合三組以兩個直立線符號字元分隔的內部括弧。
雙直立線符號字元
||
是邏輯 OR 運算子,基本上表示「左邊運算式或右邊運算式必須為 True,才能讓整個布林運算式為 True」。 如果這兩個布林運算式都為 False,則整個布林運算式都會是 False。 您使用兩個邏輯 OR 運算子,如此便能將評估擴充至第三個布林運算式。首先,您會評估
(roll1 == roll2)
。 若為 True,則整個運算式為 True。 若為 False,您會評估(roll2 == roll3)
。 若為 True,則整個運算式為 True。 若為 False,您會評估(roll1 == roll3)
。 若為 True,則整個運算式為 True。 若為 False,則整個運算式為 False。若複合布林運算式為 True,您會執行下列程式碼區塊。 這次有兩行程式碼。 第一行程式碼會向使用者列印訊息。 第二行程式碼則會依
2
遞增total
的值。若要改善程式碼的可讀性,請更新第二個
if
陳述式,如下所示:if (total >= 15)
請注意,您現在正在用來評估獲勝擲骰的運算式中使用
>=
運算式。>=
運算子表示「大於或等於」。 因此,您可以比較total
與15
的值,而不是14
。 使用這些變更時,您用來評估獲勝擲骰的運算式現在類似您針對失敗擲骰進行評估的運算式。 這應該有助於讓您的程式碼更容易理解 (更容易閱讀)。 因為您正在處理整數值,所以新的運算式(total >= 15)
在功能上會與您先前撰寫的(total > 14)
相同。請花幾分鐘檢閱您的程式碼。
您的程式碼應該會符合下列程式碼:
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 (total >= 15) { Console.WriteLine("You win!"); } if (total < 15) { Console.WriteLine("Sorry, you lose."); }
請注意,已在用來評估獲勝和失敗擲骰的運算式之間,改善了對齊方式。
新增另一個 if 陳述式來實作三倍獎勵
接下來,您可以新增另一個規則:「如果您擲出的三個骰子全都產生相同的值,則會因為擲出三骰同點而得到六點獎勵」。修改先前步驟的程式碼,以符合下列程式碼清單:
在 Visual Studio Code 編輯器中,於「雙倍」
if
陳述式的程式碼區塊下方建立空白程式碼行。若要建立您的「三倍」遊戲功能,請輸入下列
if
陳述式。if ((roll1 == roll2) && (roll2 == roll3)) { Console.WriteLine("You rolled triples! +6 bonus to total!"); total += 6; }
在這裡您會結合兩個布林運算式,在單行程式碼中建立一個複合布林運算式。 您有一組外部括弧,其中會結合兩組以兩個 & 符號字元分隔的內部括弧。
雙 & 符號字元
&&
是邏輯 AND 運算子,基本上表示「只有在這兩個運算式都為 True 時,則整個運算式才為 True」。 在此案例中,如果roll1
等於roll2
且roll2
等於roll3
,則在推算之後,roll1
必須等於roll3
,而且使用者已擲出三倍。在 Visual Studio Code 的 [檔案] 功能表上,按一下 [儲存]。
請花幾分鐘檢閱您的程式碼。
確定您的程式碼符合下列項目:
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."); }
在 [總管] 面板中,若要在 TestProject 資料夾位置開啟 [終端],請以滑鼠右鍵按一下 [TestProject],然後選取 [在整合式終端機中開啟]。
終端窗格應開啟,且應包含命令提示字元,顯示已對 TestProject 資料夾位置開啟終端。
在終端命令提示字元中,若要執行程式碼,請輸入 dotnet run,然後按 Enter 鍵。
注意
如果您看到訊息指出「找不到要執行的專案」,請確定終端命令提示字元會顯示預期的 TestProject 資料夾位置。 例如:
C:\Users\someuser\Desktop\csharpprojects\TestProject>
您應該會看到類似下列其中一個結果的輸出:
Dice roll: 3 + 6 + 1 = 10 Sorry, you lose.
或者,如下:
Dice roll: 1 + 4 + 4 = 9 You rolled doubles! +2 bonus to total! Sorry, you lose.
或者,如下:
Dice roll: 5 + 6 + 4 = 15 You win!
或者,如果您很幸運,就會看到如下輸出:
Dice roll: 6 + 6 + 6 = 18 You rolled doubles! +2 bonus to total! You rolled triples! +6 bonus to total! You win!
不過,等等,您真的要同時獎勵玩家三倍獎勵和雙倍獎勵嗎? 畢竟,擲出三倍獎勵暗示其也擲出雙倍獎勵。 在理想情況下,獎勵不應該「疊加」。 應該有兩個不同的獎勵條件。 這是邏輯中必須更正的 Bug。
您邏輯中的問題,以及改善程式碼的機會
雖然這是很好的起點,但您已經了解許多關於 if
陳述式、布林運算式、程式碼區塊、邏輯 OR 與 AND 運算子等等的資訊,其中還有許多改善空間。 您將在下一個單元中執行此作業。
概括回顧
- 使用
if
陳述式來為程式碼邏輯設定分支。 如果if
決策陳述式的布林運算式等於 True,則將執行其程式碼區塊中的程式碼。 否則,執行階段將略過此程式碼區塊,並繼續執行此程式碼區塊後面的下一行程式碼。 - 布林運算式是任何會傳回布林值的運算式。
- 布林運算子將比較其左邊和右邊的兩個值,以進行相等、比較等操作。
- 程式碼區塊會以大括弧
{ }
來定義。 它會收集應視為單一單位的程式碼。 - 邏輯 AND 運算子
&&
會彙總兩個運算式,如此一來,這兩個子運算式都必須為 True,整個運算式才為 True。 - 邏輯 OR 運算子
||
會彙總兩個運算式,如此一來,若任一個子運算式為 True,則整個運算式即為 True。