[Game Maker Adventure] Chương 010: Vòng lặp: while loop, for loop

Tóm tắt chương trước

Bạn tạo ra một ma pháp mới nhờ gợi ý của Kurobo. Từ bây giờ bạn sẽ không cần lo lắng về việc bị đột kích bất ngờ nữa.

Kiến thức chương này

  • Vòng lặp chạy đoạn code lặp đi lặp lại.
  • Hai vòng lặp phổ biến: whilefor.
  • continue; sẽ chuyển sang một vòng lặp mới ngay lập tức.
  • break; sẽ thoát toàn bộ vòng lặp ngay lập tức.

Cốt truyện

Bạn tiến sâu vào tàn tích cùng Kurobo.

Theo lời Kurobo kể, khu vực này đã từng là một thành phố hưng thịnh. Trải qua năm tháng, mọi thứ chỉ còn là đổ nát.

Nhưng nếu gặp may, có thể sẽ tìm thấy thứ gì đó sửa chữa cho Kurobo.

À, tất nhiên…

Cũng có thể tăng sức chiến đấu cho bạn nữa.

Vòng lặp: while

Các vòng lặp có tác dụng chạy đoạn code lặp đi lặp lại, từ trên xuống dưới cho tới khi không còn thoả mãn điều kiện nào đó thì nó sẽ dừng lại.

Trong game, các vòng lặp hầu như lúc xuất hiện ở khắp mọi nơi. Chẳng hạn NPC chờ bạn tới gần mới nói chuyện, gà sẽ đẻ trứng sau mỗi ngày, chu kì ngày đêm, bảng xếp hạng cập nhật theo thời gian thực…

BXH là một tính năng tưởng chừng đơn giản nhưng lại rất nặng trong game, nguyên nhân ở chỗ phải liên tục cập nhật thứ hạng của người chơi, việc chạy các vòng lặp để sắp xếp vị trí cho đúng sẽ tốn khá nhiều tài nguyên của máy chủ.

Vòng lặp while là một trong những loại vòng lặp đơn giản nhất. Tương tự như if statement, while loop cũng cần một điều kiện dạng bool để quyết định xem có chạy đoạn code bên trong block statement của nó không. Vòng lặp sẽ chạy tới khi điều kiện không còn thoả mãn sẽ thoát.

Sơ đồ của while loop trong một đoạn code sẽ như sau:

Như ta đã biết, code sẽ chạy lần lượt 1 > 2 > 3 > 4, điều này luôn đúng. Chỉ có một điều cần chú ý, do while là vòng lặp nên code phải chạy xong vòng lặp đó mới có thể sang 4 để kết thúc chương trình.

Thí dụ 1

while (true)
{
    Console.WriteLine("Hello, World!");
}

Đoạn code trên sẽ luôn in ra một loạt dòng “Hello, World!” do điều kiện bool của while lúc nào cũng là true nên máy tính không bao giờ thoát khỏi vòng lặp này.

Các vòng lặp này được gọi là infinite loop (vòng lặp vô hạn). Infinite loop sẽ khiến chương trình không thể kết thúc, lag hoặc crash.

Thí dụ 2

int hp = 3;

while (hp > 0)
{
    hp -= 1;
    Console.WriteLine("You received 1 damage, your current HP: " + hp);
}

Console.WriteLine("You are dead.");

Đoạn code sẽ xuất ra 4 dòng như sau:

You received 1 damage, your current HP: 2
You received 1 damage, your current HP: 1
You received 1 damage, your current HP: 0
You are dead.

Máy tính thực hiện đoạn code như sau:

  1. Khởi tạo biến hp = 3.
  2. Kiểm tra điều kiện hp > 0 -> return true do hp = 3.
  3. Điều kiện hợp lệ, bắt đầu chạy block statement trong while loop.
  4. Block statement: trừ 1 hp và in ra màn hình.
  5. Lại kiểm tra điều kiện hp > 0 -> return true do hp = 2.
  6. Điều kiện hợp lệ, bắt đầu chạy block statement trong while loop.
  7. Block statement: trừ 1 hp và in ra màn hình.
  8. … lặp lại cho tới khi hp = 0.
  9. Lúc này khi kiểm tra điều kiện do hp > 0 -> return false do hp = 0.
  10. Thoát vòng lặp.
  11. In nốt ra màn hình dòng cuối cùng.

Vòng lặp: for

for là vòng lặp có cách sử dụng phức tạp hơn while một chút nhưng bù lại là tính tiện dụng của nó.

Công thức của for như sau:

Thí dụ:

for (int i = 0; i < 3; i++)
{
    Console.WriteLine(i);
}

Trong đó:

  • int i = 0 là for initializer
  • i < 3 là for condition
  • i++ là for iterator

Hãy cùng phân tích từng phần một nhé

for initializer (khởi tạo biến điều kiện)

Tại bước này, bạn cần khởi tạo 1 biến mới. Trong thí dụ là int i = 0 , bạn có thể đặt i thành bất kì tên nào khác để code được dễ đọc hơn.

Biến i sau này sẽ được sử dụng để kiểm tra điều kiện thoát vòng lặp.

for condition (kiểm tra điều kiện)

Bước này sẽ kiểm tra điều kiện của i được tạo từ bước trước với một giá trị nào đó. Điều kiện sẽ quyết định xem vòng for có được thực hiện không. Nếu return true thì mới chạy, false sẽ thoát vòng lặp.

VD: i < 3 return true do bước khởi tạo i = 0.

for iterator (được thực hiện sau mỗi vòng lặp)

Trong for iterator, mỗi khi kết thúc 1 vòng lặp thì đoạn code ở đây sẽ được thực hiện.

Trong thí dụ, mỗi khi kết thúc 1 vòng thì thực hiện i++ (viết tắt của i += 1. Tương tự với i-- là viết tắt của i -= 1).

Máy tính thực hiện đoạn code trong thí dụ như sau:

  1. Khởi tạo biến int i = 0.
  2. Kiểm tra điều kiện i < 3 -> return true do i = 0.
  3. Điều kiện hợp lệ, bắt đầu chạy block statement trong for loop.
  4. Block statement: in i ra màn hình. Kết quả: 0
  5. Chạy for iterator: i++. i lúc này có giá trị 1.
  6. Lại kiểm tra điều kiện i < 3 -> return true do i = 1.
  7. Điều kiện hợp lệ, bắt đầu chạy block statement trong for loop.
  8. Block statement: in i ra màn hình. Kết quả: 1
  9. Lại chạy for iterator: i++. i lúc này có giá trị 2.
  10. … lặp lại cho tới iterator tiếp theo: i có giá trị 3.
  11. Lúc này khi kiểm tra điều kiện do i < 3 -> return false do i = 3 nên sẽ thoát vòng lặp.

Trong Visual Studio, có thể gõ nhanh for loop bằng cách gõ “for” sau đó ấn 2 lần Tab.

Gợi ý của Kurobo

Phá vòng lặp: break và continue

Đôi khi, bạn không cần thực sự phải chạy hết tất cả các vòng lặp, hoặc, bạn cũng chẳng biết chính xác khi nào có thể thể kết thúc chúng.

break

Khi chạy tới đây, thoát toàn bộ vòng lặp ngay lập tức. Ta có thí dụ như sau:

int number = 1;
while (true)
{
    number++;
    if (number == 100)
    { 
        break; 
    }
    Console.WriteLine(number);
}

Khi number có giá trị là 100, lúc này điều kiện trong if statement return true. break; được thực hiện, ngay lập tức thoát tất cả các vòng lặp. Điều này nghĩa là dòng Console.WriteLine(number); sẽ không được chạy nữa.

continue

Khi chạy tới đây, chuyển sang một vòng lặp mới ngay lập tức.

Khác với break; continue; chỉ bỏ qua vòng lặp hiện tại của nó để sang vòng lặp mới mà không thoát hoàn toàn khỏi vòng lặp.

int number = 1;
while (true)
{
    number++;
    if (number == 100)
    { 
        continue; 
    }
    Console.WriteLine(number);
}

Khi number có giá trị là 100, continue; được gọi và thoát vòng lặp hiện tại. Chương trình vẫn tiếp tục chạy bình thường với các giá trị khác. Chỉ riêng giá trị 100 không được in ra màn hình.

Việc phá vòng lặp không phải lúc nào cũng cần tới. Chúng được sử dụng trong các bài toán phụ thuộc vào người chơi, trong các thuật toán như Monte Carlo… (Sẽ nói thêm trong Act II và III).

Quest: Cánh cửa khó mở

Bạn và Kurobo quyết định tiến sâu vào tàn tích.

Trước mặt bạn là một cánh cổng lớn. Trên cánh cổng là một câu đố, hình như phải giải nó bạn mới có thể tiến vào.

Trên cánh cổng có 3 nút bấm, trên mỗi nút có 3 con số lần lượt là 1, 2, 3.

Khi bấm vào một nút bất kì, con số trong nút đó giảm 1 đơn vị, còn con số trong các nút cạnh nó sẽ tăng 1 đơn vị.

Chẳng hạn, khi bấm vào 2, thì 1 thành 2, 3 thành 4, 2 giảm về 1 (xem hình dưới)

Dường như, phải làm sao cho cả 3 nút có cùng số thì sẽ mở được cửa.

Quest: Cánh cửa khó mở ✦✦✧✧✧

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

  1. In ra màn hình 3 nút và hỏi người chơi lựa chọn vị trí nút bấm.
  2. Khi người chơi lựa chọn bấm vào một nút bất kì, nút đó sẽ giảm 1 đơn vị, các nút bên cạnh nó tăng 1 đơn vị. In ra màn hình các nút và số mới.
  3. Khi 3 nút có cùng số thì in ra màn hình thông báo hoàn thành trò chơi.

Chương trình của bạn sẽ có kết quả tương tự như sau (tham khảo):

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
1 Comment
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Thang CD

Bài hay lắm bạn ơi