[Game Maker Adventure] Chương 008: If – else statement
Tóm tắt chương trước
Trong lúc đi tìm lương thực, bạn bắt gặp một phế tích và một thứ không xác định bay lơ lửng giữa đống vụn đá.
Dường như nó đã chịu thương tổn rất nặng khiến cả phần cứng lẫn phần mềm bên trong đều khó lòng khôi phục.
Bạn quyết định sửa lại (ít nhất là phần mềm), nhưng với kiến thức hiện tại của mình, bạn chỉ có thể khôi phục lại một xíu năng lực của thứ đó.
Kiến thức chương này
- if – else statement được sử dụng để thực hiện đoạn code nếu thoả mãn điều kiện nào đó: nếu (điều kiện) thì (thực hiện).
- (điều kiện) trong if – else statement thực chất là kiểu bool (true hoặc false). Nếu true thì thực hiện.
- Block Statement cho phép if – else (thực hiện) nhiều hơn 1 statement nếu (điều kiện) được thoả mãn.
- Các operator kiểm tra (điều kiện) trong if statement là: ==, !=, <, >, <=, >=. Kết quả của các operator đó đều return true hoặc false.
- else if cho phép ta kiểm tra nhiều (điều kiện) hơn và (thực hiện) các đoạn code tương ứng những điều kiện đó.
- Sau khi (thực hiện) thì máy sẽ không chạy các đoạn code khác của if – else statement nữa, vì thế thứ tự (điều kiện) cực kì quan trọng.
Cốt truyện
*bíp bíp*
*bíp bíp*
Đôi mắt (ánh đèn) của vật thể đó bỗng nhiên sáng lên, nó bay rất nhanh một vòng quanh bạn.
“Quá trình reset hoàn tất!”
*bíp bíp*
“Xin chào, tôi là Kurobo – một robot dẫn đường của tập đoàn Vượt Mọi Ánh Sao (Beyond Starlight)! Hãy đặt tay lên đây để hoàn tất quá trình thiết lập!”
Dường như bạn đã bắt gặp một sinh vật? hoặc cũng có thể là máy móc? kì lạ.
Trông nó không có vẻ gì là thù địch. Bạn quyết định chạm vào Kurobo.
…
*chạm*
…
*ping*
“Xác nhận sinh trắc thành công! Nếu chủ nhân có bất kì thắc mắc nào xin hãy hỏi Kurobo nhé!”
Chọn lựa nếu thì – còn không thì: If – else statement
Game bản chất là một chuỗi các lựa chọn mang tính liên tục*. Phần lớn thời gian chúng ta ở trong game là để chọn lựa.
Chẳng hạn khi bạn chọn sử dụng kĩ năng, nếu không đủ mana thì bạn sẽ không sử dụng được. Hoặc khi bắn cung, nếu có tên mới có thể bắn. Hoặc khi boss bị đánh xuống một mức máu nào đó, nó sẽ sử dụng những kĩ năng tối thượng.
Không quan trọng các bạn đang chơi game nào, các lựa chọn đều xuất hiện ở khắp mọi nơi!
*Xem bài Lựa chọn này thật thú vị
Hãy lấy một thí dụ đơn giản trong game: nếu máu về 0 thì nhân vật sẽ chết, còn không thì nhân vật vẫn sống.
int hp;
string input = Console.ReadLine();
hp = Convert.ToInt32(input);
if (hp == 0)
{
Console.WriteLine("You are dead!");
Console.WriteLine("Press any key to continue...");
}
else
{
Console.WriteLine("You still alive!");
}
Ta thấy sự xuất hiện của các thành phần mới: statement if (nếu), statement else (còn không thì) và equality operator == (so sánh bằng) – khác với assignment operator = là dấu gán.
Nếu bạn nhập vào một số int khác 0 (ở đây mình nhập 22) thì sẽ luôn có một kết quả hiện trên màn hình “You still alive!“
Ngược lại, nếu nhập 0 sẽ nhận về kết quả “You are dead!” và “Press any key to continue…”.
Như vậy, if và else có tác dụng kiểm tra điều kiện, sau đó chạy các statement tương ứng với điều kiện đó.
Khi kết thúc dòng if (hp == 0) sẽ không có dấu ; (semicolon) thay vào đó là một block statement. Block statement sẽ bắt đầu bằng mở ngoặc nhọn và kết thúc bằng đóng ngoặc nhọn.
{
Console.WriteLine("You are dead!");
Console.WriteLine("Press any key to continue...");
}
Trong 1 block statement sẽ có nhiều statement nhỏ khác. Bạn có thể hiểu chúng giống như một khối lệnh lớn cũng được.
Tất cả các statement bên trong block statement sẽ được chạy khi thoả mãn điều kiện tương ứng với nó (trong trường hợp này là khi hp bằng 0).
Toàn bộ đoạn code có thể được diễn giải như sau:
Giống như cách chúng ta đọc các loại văn bản thông thường, code cũng có thể đọc từ trên xuống dưới như vậy.
If statement
Công thức đơn giản nhất của if statement là:
if (hp == 0) Console.WriteLine("You are dead!");
Ở đây, bạn sẽ không thấy có else và các block statement bởi đây là một cách viết rút gọn. Không nhất thiết lúc nào cũng cần else sau if. Nhưng else chỉ có thể hoạt động nếu trước đó có if.
Ta cũng không cần sử dụng block statement nếu chỉ cần chạy 1 statement sau nó. VD:
if (hp == 0) Console.WriteLine("You are dead!");
Console.WriteLine("Press any key to continue...");
Ở đoạn code này, nếu hp không phải 0 thì máy sẽ bỏ qua
Console.WriteLine("You are dead!");
nhưng nó sẽ vẫn chạy
Console.WriteLine("Press any key to continue…");
bởi máy không biết ta muốn chạy gì, bỏ gì khi điều kiện được thoả mãn. Lúc này buộc phải sử dụng bIock statement.
if (hp == 0)
{
Console.WriteLine("You are dead!");
Console.WriteLine("Press any key to continue...");
}
C# không quan tâm tới các khoảng trắng ” ” (space) vì thế tất cả các cách trình bày như sau đều có chung một kết quả:
if (hp == 0) Console.WriteLine("You are dead!"); //style 1
if (hp == 0)
Console.WriteLine("You are dead!"); //style 2
if (hp == 0)
Console.WriteLine("You are dead!"); //style 3
if (hp == 0) //style 4
{
Console.WriteLine("You are dead!");
}
Các bạn có thể thấy style 3 cực kì dễ nhầm lẫn nếu ta tiếp tục viết thêm vào sau nó các statement khác. Còn style 1 và 2 là 2 kiểu trình bày có hệ thống, khó nhầm lẫn hơn.
Một số người thích sử dụng style 4 để code (luôn sử dụng block statement) do tính rõ ràng và dễ mở rộng.
Mình khuyên các bạn hãy sử dụng style 4 và style 1. Các dạng style khác rất dễ gây nhầm và trông rất rối nếu đưa vào những đoạn code lớn.
Các điều kiện của if statement
Cấu trúc của if statement là: nếu <điều kiện nào đó thoả mãn> thì <làm gì đó>. Phần <làm gì đó> là phần mà ta đã biết, còn <điều kiện nào đó thoả mãn> thì vẫn phải tìm hiểu thêm một chút.
Về bản chất, if statement sẽ nhận điều kiện dạng đúng hoặc sai – tức kiểu dữ liệu bool (sẽ nói ở bài sau), hiểu đơn giản thì kiểu dữ liệu này chỉ có 2 trạng thái: true hoặc false.
Xét điều kiện: (hp == 0):
- Nếu hp = 0 thì return true.
- Nếu hp ≠ 0 thì return false.
Lúc này đoạn code trở thành:
Operator == được gọi là equality operator. Operator này sẽ so sánh 2 vế với nhau, nếu bằng nhau thì return true, nếu khác nhau thì return false.
Ngoài equality operator còn rất nhiều các operator khác có thể trả về 2 trạng thái true hoặc false như sau:
Tên (Eng) | Mô tả | Kí hiệu | Công dụng |
Equality operator | Có bằng nhau không? | == | return true nếu bằng nhau, không thì false. |
Inequality operator | Có khác nhau không? | != | return true nếu không bằng nhau, không thì false. |
Less than operator | Có nhỏ hơn không? | < | return true nếu nhỏ hơn, không thì false |
Greater than operator | Có lớn hơn không? | > | return true nếu lớn hơn, không thì false |
Less than or equal operator | Có nhỏ hơn hoặc bằng không? | <= | return true nếu nhỏ hơn hoặc bằng, không thì false |
Greater than or equal operator | Có lớn hơn hoặc bằng không? | >= | return true nếu lớn hơn hoặc bằng, không thì false |
Chú ý: Chỉ có thể sử dụng các toán tử khi tất cả các vế của nó là cùng loại.
Nghĩa là chỉ có thể cộng, trừ, nhân, chia, hoặc so sánh int với int, float với float, double với double, string với string… Tuy vậy, C# ngầm convert các vế thành cùng loại nên ta vẫn có thể thực hiện các operator giữa int với float, double với float… (string thì người dùng phải tự convert).
VD: khi thực hiện phép toán: 3/6f (với 3 là int, 6f là float) thì C# sẽ convert 3 từ int sang float sau đó mới thực hiện chia. Kết quả sẽ ra một số float.
Else if
Khi muốn có nhiều kết quả khác nhau thì công thức if – else vẫn còn bị giới hạn. Lúc này else if được chèn vào giữa để xử lí các bài toán có nhiều kết quả (nhiều state): if – (else if) – else. Xem thí dụ bên dưới:
int hp;
string input = Console.ReadLine();
hp = Convert.ToInt32(input);
if (hp == 0)
{
Console.WriteLine("You are dead!");
Console.WriteLine("Press any key to continue...");
}
else if (hp <= 20)
{
Console.WriteLine("You are in danger!!!");
}
else if (hp <= 50)
{
Console.WriteLine("You are hurt!");
}
else
{
Console.WriteLine("You still alive!");
}
Bằng cách sử dụng else if, tương ứng vào từng mức hp mà màn hình sẽ hiện ra các dòng chữ khác nhau. Ta có thể thêm bao nhiêu khối else if tuỳ thích.
Một điểm lưu ý ở đây là đoạn code sẽ được chạy từ trên xuống dưới nên khi thoả mãn điều kiện ở một khối if – else máy sẽ bỏ qua TẤT CẢ các khối còn lại.
Giả sử, khi chiến đấu, hp của nhân vật sẽ giảm dần từ 100 về 0. Với thí dụ bên trên, thứ tự các thông báo hiển thị trên màn hình sẽ là:
- You still alive! (Khi hp > 50)
- You are hurt! (Khi hp <= 50)
- You are in danger!!! (Khi hp <= 20)
- You are dead! và Press any key to continue… (Khi hp = 0)
Tuy nhiên, nếu ta đảo thứ tự điều kiện trong các khối như sau (khối hp <= 50 lên trên khối hp <= 20).
int hp;
string input = Console.ReadLine();
hp = Convert.ToInt32(input);
if (hp == 0)
{
Console.WriteLine("You are dead!");
Console.WriteLine("Press any key to continue...");
}
else if (hp <= 50)
{
Console.WriteLine("You are hurt!");
}
else if (hp <= 20)
{
Console.WriteLine("You are in danger!!!");
}
else
{
Console.WriteLine("You still alive!");
}
Lúc này, khi hp <= 50, máy sẽ luôn báo “You are hurt!”, kể cả khi hp <= 20 thì dòng “You are in danger!!!” sẽ không bao giờ được in ra màn hình do khi <= 20 nghĩa là <=50 thoả mãn.
Hình thái cuối cùng của các block (if – else if – … – else) chúng ta cần nhớ ở chương này là
Thứ tự điều kiện trong các khối rất quan trọng.
@gamenhalam
Máy tính rất lười biếng, một khi có điều kiện thoả mãn là nó sẽ không quan tâm các điều kiện khác nữa. Vì thế, hãy đảm bảo logic của mình sẽ xảy ra được nhé.
Quest: Thế giới trong sách
Bây giờ bạn đã có thêm Kurobo.
Bạn thở dài vì bản thân lại có thêm rất nhiều thứ phải làm.
- Tới Ma quốc.
- Nâng cao sức mạnh.
- Tìm hiểu giấc mơ huyền bí.
- Khôi phục Kurobo. (New)
Về Kurobo, cả phần mềm lẫn phần cứng của nó đã bị hư hỏng rất nhiều. Việc sửa chữa phần mềm sẽ không tốn tài nguyên, tuy nhiên, phần cứng thì không đơn giản như thế.
Mà…
Nghĩ nhiều về tương lai cũng không có tác dụng gì. Bạn chỉ cần cố hết sức mình ở hiện tại là được.
Bạn sẽ vào thế giới trong sách để tới được chương sau.
Quest: Thế giới trong sách ✦✦✧✧✧
Hãy hoàn thành đề bài dưới đây:
Một mạo hiểm giả mang theo 100 gold và bước vào cửa hàng trang bị. Cửa hàng này bày bán các mặt hàng sau:
Số thứ tự | Mặt hàng | Công dụng | Giá tiền (gold) |
1 | Pointed Hat | Elem. Atk. +3 | 20 |
2 | Iron Helm | Max HP +100 | 25 |
3 | Chakra Band | Restores HP after every turn | 35 |
4 | Fur Cap | Reduces dark damage | 60 |
5 | Circlet | Slightly reduces lightning damage taken | 120 |
Hãy viết chương trình thoả mãn:
- Nếu không đủ gold thì sẽ không thể mua được món hàng.
- Khi mua thành công, thông báo số gold còn lại và công dụng của món hàng.
Xem đáp án
Premium Content
Kể từ phần này, bạn cần đăng nhập và một lượng Point để tiếp tục xem 🙁
Chương Trước | Tổng quan | Chương Kế