[Game Maker Adventure] Chương 008: If – else statement

if - else statement là một trong những concept cực kì quan trọng trong coding.

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é!”

Kurobo là gì?

Kurobo là một robot chuyên thu thập thông tin ở các thế giới. Có rất nhiều thế giới trong vũ trụ và Kurobo đảm nhận hành tinh này.

Robot thu thập thông tin?

Kurobo là chủng Robot thuộc tập đoàn Vượt Mọi Ánh Sao - Beyond Starlight. Tập đoàn này chuyên chu du khắp nơi trong vũ trụ để tìm hiểu về mọi thứ.

Hành tinh này?

Cư dân ở đây đã có ma thuật nên không cần thiết phải phát triển theo hướng công nghiệp hoá vì thế hành tinh này có nguồn năng lượng thiên nhiên cực lớn.

Nếu so sánh với công nghệ của tập đoàn thì nơi này còn kém xa rất nhiều.

Tại sao Kurobo lại ở đây?

Kurobo cũng không rõ, nhưng 525 năm 8 tháng 16 ngày trước đã xảy ra một chấn động lớn vô hiệu hoá hầu hết các chủng Robot tại hành tinh này.

Hoạt động bằng...

Kurobo cũng không rõ, bản thân hoạt động được trở lại có vẻ do chủ nhân vừa sử dụng năng lượng ma thuật để sửa chữa Kurobo.

Kurobo sẽ cố hết sức để trợ giúp chủ nhân sau này.

Phải làm sao để khôi phục

Khác với các chủng sinh vật có thể tự hồi phục, chủng robot cần khá nhiều nguyên liệu để sửa chữa.

Không có câu hỏi nào khác

Kurobo sẽ luôn bay theo và sẽ không làm phiền chủ nhân đâu.

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ệuCông dụng
Equality operatorCó bằng nhau không?==return true nếu bằng nhau, không thì false.
Inequality operatorCó khác nhau không?!=return true nếu không bằng nhau, không thì false.
Less than operatorCó nhỏ hơn không?<return true nếu nhỏ hơn, không thì false
Greater than operatorCó lớn hơn không?>return true nếu lớn hơn, không thì false
Less than or equal operatorCó 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 operatorCó 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
Các Comparison Operator (Toán tử so sánh) quan trọng

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à:

  1. You still alive! (Khi hp > 50)
  2. You are hurt! (Khi hp <= 50)
  3. You are in danger!!! (Khi hp <= 20)
  4. 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àngCông dụngGiá tiền (gold)
1Pointed HatElem. Atk. +320
2Iron HelmMax HP +10025
3Chakra BandRestores HP after every turn35
4Fur CapReduces dark damage60
5CircletSlightly reduces lightning damage taken120

Hãy viết chương trình thoả mãn:

  1. Nếu không đủ gold thì sẽ không thể mua được món hàng.
  2. 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ế

Kurrwo

Công nhân👷gõ 💬 văn bản ⌨️ trò chơi 🎮 điện tử 📱 👏👏👏

Post navigation

Subscribe
Notify of
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments