[Hướng Dẫn] Cùng học Game Maker: Studio #3

phamphuphiphuongphamphuphiphuong Posts: 58Registered, Moderators
edited August 2019 in Game Maker: Studio

Cùng học Game Maker: Studio #3

Chào mừng các bạn quay lại với chuỗi bài viết Cùng học Game Maker: Studio của mình, bài này là bài cuối cùng của đám code basic củ chuối này :>

Vòng lặp (loop)

Vòng lặp cũng giống như câu lệnh if vòng lập sẽ thực hiện đoạn code nằm trong nó nếu thỏa mãn điều kiện nhưng khác là thực hiện nhiều lần liên tục cho tới khi điều kiện không còn thỏa mãn nó nữa thì dừng lại, và nếu điều kiện của nó luôn luôn đúng thì sẽ lặp vô hạn, có hai câu lệnh sử dụng vòng lặp đó là for và while

Cấu trúc vòng lặp for
for(khởi tạo; điều kiện; biểu thức){
    //Code
}
//Khởi tạo: là nơi tạo giá trị ban đầu cho biến điều khiển
//Điều kiện: điều kiện để thực hiện vòng lặp
//Biểu thức: tăng hoặc giảm giá trị của biến khởi tạo

XD Có vẻ mông lung như một trò đùa nhỉ, cơ mà các bạn xem qua ví dụ sau sẽ hiểu hơn

Ví dụ dùng vòng lặp để ghi chữ Tạo Trò Chơi mười lần
for(var i = 1; i <= 10; i++){
    show_debug_message("Tạo Trò Chơi");
}

Output
Tạo Trò Chơi
Tạo Trò Chơi
Tạo Trò Chơi
Tạo Trò Chơi
Tạo Trò Chơi
Tạo Trò Chơi
Tạo Trò Chơi
Tạo Trò Chơi
Tạo Trò Chơi
Tạo Trò Chơi


Như đoạn code trên theo cấu trúc thì biến khởi tạo chúng ta đặt là biến i có giá trị là 1, tiếp theo điều kiện của nó là i phải nhỏ hơn hoặc bằng 10, cuối cùng là tăng giá trị của biến i sau mỗi lần lập.

Đoạn code trên sẽ thực hiện như sau, ban đầu nó khởi tạo biến i bằng 1 và kiểm tra với điều kiện nhỏ hơn hoặc bằng 1 thỏa mãn chạy đoạn code bên trong for show dòng chữ "Tạo Trò Chơi" tiếp tục cộng biến i lên một giá trị (i++) lúc này biến i có giá trị là 2, quay trở lại kiểm tra điều kiện biến i vẫn nhỏ hơn 10 nên show dòng chữ "Tạo Trò Chơi", cho đến khi biến i bằng 10 show dòng chữ "Tạo Trò Chơi" lần thứ 10, biến i cộng thêm một giá trị, biến i lúc này có giá trị là 11, kiểm tra với điều kiện trên không thỏa mãn dừng vòng lặp XD


Ví dụ dùng vòng lặp for để countdown từ 10 đến 1

for(var i = 10; i >= 1; i--){    show_debug_message(i);}


Output
10
9
8
7
6
5
4
3
2
1


Đoạn code trên cho i ban đầu bằng 10 và sau mỗi vòng lặp sẽ show giá trị của i và trừ giá trị của i đi một giá trị cho tới khi biến i không còn thỏa mãn điều kiện nữa thì thoát khỏi vòng lặp


Cấu trúc vòng lặp while

while(true){
    //Code
}


Cũng giống như vòng lặp for nhưng while sẽ màu mè hơn for một chút chúng ta cùng làm ví dụ sẽ thấy sự khác biệt


Ví dụ dùng vòng lặp while để show dòng chữ "Tạo Trò Chơi" mười lần

i = 1;while(i <= 10){    show_debug_message("Tạo Trò Chơi");    i++;}


Output
Tạo Trò Chơi
Tạo Trò Chơi
Tạo Trò Chơi
Tạo Trò Chơi
Tạo Trò Chơi
Tạo Trò Chơi
Tạo Trò Chơi
Tạo Trò Chơi
Tạo Trò Chơi
Tạo Trò Chơi


Như đoạn code trên mình dùng vòng lặp while để show dòng chữ "Tạo Trò Chơi" mười lần, đoạn code sẽ thực hiện như sau, ban đầu khởi tạo biến i có giá trị bằng một bên trên vòng lặp, tiếp theo cho điều kiện lặp (i <= 10), lần lập đầu tiên kiểm tra biến i thỏa mãn vòng lập nên show dòng chữ, sau khi show dòng chữ thì đoạn code phía dưới nó tăng giá trị của i lên một lần, cứ tiếp tục cho đến khi biến i tăng lên 11 không còn thỏa mãn điều kiện nữa thì thoát khỏi vòng lặp.


Ví dụ dùng vòng lặp while countdown từ 10 xuống 1

i = 10;while(i >= 1){    show_debug_message(i);    i--;}


Output
10
9
8
7
6
5
4
3
2
1


Mảng (Arrays)

Mảng là một tập hợp các phần tử cố định có cùng một kiểu, được lưu trữ liên tiếp nhau trong các ô nhớ. Kiểu phần tử có thể là có các kiểu bất kỳ
Có thể nói mảng như là một danh sách vậy

Danh sách lớp ttc
  1. DANG KHOA
  2. PHI PHUONG
  3. MELON
  4. PHO VANG
Khác với danh sách của chúng ta thì mảng có vị trí đứng đầu là 0
     0. DANG KHOA
     1. PHI PHUONG
     2. MELON
     3. PHO VANG

Mảng gồm có 2 loại đó là một chiều và mảng hai chiều, trong GML có thể khai báo mảng một chiều hai chiều thủ công, hoặc dùng các hàm về mảng được GML thiết kế sẵn.

Khác nhau giữa môt chiều và hai chiều (nhiều chiều), không biết giải thích sau các bạn xem hình dưới để so sánh với mảng 2 chiều


Như hình trên mảng một chiều thì mỗi phần tử (đã đánh số vị trí) bên trong mảng sẽ có một giá trị màu của nó, còn mảng hai chiều thì mỗi phần tử của mảng sẽ có giá trị là một mảng khác
Ở mảng một chiều nếu ta lấy phần tử thứ nhất của mảng (0) sẽ được màu đỏ, lấy phần tử thứ năm (4) sẽ có màu vàng
Ở mảng 2 chiều phần tử thứ nhất (0) theo hình dọc sẽ mang giá trị là một mảng dài 11 phần tử theo hình ngang
Nếu chúng ta lấy mảng dọc làm mảng chính thì khi phần tử thứ hai (1) và phần tử thứ ba (2) của mảng con hàng ngang chúng ta có màu xám (1, 2)
XD Mông lung như một trò đùa lần 2, các bạn xem ví dụ sẽ hình dung ra thôi

Mảng một chiều


Cách tạo mảng một chiều và lấy các phần tử trong mảng một chiều
//Cách thứ nhất
ten_mang = ["Phần tử thứ nhất", "Phần tử thứ hai", "Phần tử thứ ba", "Phần tử thứ tư"];

//Cách thứ hai
ten_mang[0] = "Phần tử thứ nhất";
ten_mang[1] = "Phần tử thứ hai";
ten_mang[2] = "Phần tử thứ ba";
ten_mang[3] = "Phần tử thứ tư";

Ví dụ tạo một mảng chứa tên các thành viên của ttc và lấy ra tên của người kế cuối 
Trên thực tế là nếu các bạn tạo mảng thì số lượng phần tử là rất nhiều, nên để lấy phần tử cuối cùng thì chúng ta cần có số lượng của các phần tử bên trong mảng, GML có một hàm sẽ trả về tất cả số lượng ở mảng là array_length_1d(array)

//Khởi tạo mảng một chiều
ttc = ["Dang Khoa", "Melon", "Pho vang", "Phi Phuong"];

//Đầu tiên mình sẽ show ra số lượng phần tử có trong mảng trước
so_luong_phan_tu = array_length_1d(ttc);
show_debug_message("Số lượng của mảng là " + so_luong_phan_tu);

//Tiếp theo lấy tên người gần cuối
nguoi_gan_cuoi = ttc[so_luong_phan_tu  - 2];

//Ghi ra tên người gần cuối
show_debug_message("Tên của người gần cuối là " + nguoi_gan_cuoi );

Output
Số lượng của mảng là 4
Tên người gần cuối là Pho vang

Như đoạn code trên ta có một biến với tên ttc gồm các phần tử lần lượt là Dang khoa (0), Melon (1), Pho vang (2), Phi phuong (3), vậy tổng số phần tử của mảng là 4
Để lấy phần tử gần cuối ta sẽ lấy phần tử cuối cùng và trừ đi 1 phải không? :)
Lý thuyết hoàn hảo thế nhưng chúng ta có một vấn để ở đây là hàm array_length_1d() sẽ trả về tổng số phần tử trong mảng và nó đã trả về 4 tức là hàm này sẽ đếm số phần tử và mặc định cho vị trí đầu tiên là 1, trong khi đó vị trí của các phần tử sẽ bắt đầu từ 0 nên nếu lấy 4 mà trừ đi 1 thì sẽ bằng 3 mà vị trí thứ 3 của mảng sẽ là Phi phuong, nên chúng ta cần trừ đi 2 lúc này bằng 2 và vị trí thứ 2 sẽ là vị gần 3 nhất :)

Như vậy để lấy giá trị một phần tử trong mảng các bạn chỉ cần ghi tên mảng và điền vị trí phần tử cần lấy giá trị vào bên trong ngoặc vuông

//Tạo mảng một chiều
ttc = ["Dang Khoa", "Melon", "Pho vang", "Phi Phuong"];

//Lấy giá trị thứ nhất
show_debug_message(ttc[0]);

//Lấy giá trị thứ hai
show_debug_message(ttc[1]);

//Lấy giá trị thứ ba
show_debug_message(ttc[2]);

//Lấy giá trị thứ tư
show_debug_message(ttc[3]);

Output
Dang khoa
Melon
Pho vang
Phi phuong

Các bạn chạy đoạn code trên xẽ rõ ràng hơn cách lấy các phần tử

Mảng hai chiều 

:) Cái vấn đề mảng mủng này mệt mỏi quá
Mảng hai chiều là mảng một chiều nhưng các phần tử bên trong của mảng sẽ là một mảng khác, mông lung như một trò đùa lần ba :) các bạn xem ví dụ sẽ hiểu

Cách khai báo mảng hai chiều
ten_mang[0, 0] = "something";
ten_mang[0, 1] =  "something";
ten_mang[0, 2] =  "something";

ten_mang[1, 0] = "something";
ten_mang[1, 1] =  "something";
ten_mang[1, 2] =  "something";

ten_mang[2, 0] = 1;
ten_mang[2, 1] = 2;
ten_mang[2, 2] = 3;

Các phần tử của mảng chính sẽ đứng bên trái và phần tử của mảng con sẽ đứng bên phải

Ví dụ tạo một danh sách lớp học lưu tên, điểm trung bình và xếp hạng của các học sinh trong lớp bằng mảng hai chiều, lớp học gồm 4 học sinh, lấy thông tin bất kì của một học sinh trong lớp và show ra màn hình.
Ok như ví dụ thì chúng ta cần một danh sách cùng lúc lưu cả ba giá trị nên mảng con của chúng ta sẽ có 3 phần tử và mảng chính sẽ có 4 phần tử là số học sinh của lớp, ta làm như sau.

//Khai báo mảng hai chiều gồm 4 phần tử cho mảng chính
//Mỗi phần tử là một mảng con gồm 3 phần tử

//Phần tử thứ nhất của mảng chính
//Phần tử thứ nhất của mảng con của phần tử thứ nhất của mảng chính
danh_sach_lop[0, 0] = "NGUYỄN VĂN A";
//Phần tử thứ hai của mảng con của phần tử thứ nhất của mảng chính
danh_sach_lop[0, 1] = 5.6;
//Phần tử thứ ba của mảng con của phần tử thứ nhất của mảng chính
danh_sach_lop[0, 2] = "Trung bình";

//============================================

//Phần tử thứ hai của mảng chính
//Phần tử thứ nhất của mảng con của phần tử thứ hai của mảng chính
danh_sach_lop[1, 0] = "NGUYỄN VĂN B";
//Phần tử thứ hai của mảng con của phần tử thứ hai của mảng chính
danh_sach_lop[1, 1] = 7.6;
//Phần tử thứ ba của mảng con của phần tử thứ hai của mảng chính
danh_sach_lop[1, 2] = "Khá";

//============================================

//Phần tử thứ ba của mảng chính
//Phần tử thứ nhất của mảng con của phần tử thứ ba của mảng chính
danh_sach_lop[2, 0] = "NGUYỄN VĂN C";
//Phần tử thứ hai của mảng con của phần tử thứ ba của mảng chính
danh_sach_lop[2, 1] = 3.5;
//Phần tử thứ ba của mảng con của phần tử thứ ba của mảng chính
danh_sach_lop[2, 2] = "Yếu";

//============================================

//Phần tử thứ tư của mảng chính
//Phần tử thứ nhất của mảng con của phần tử thứ tư của mảng chính
danh_sach_lop[3, 0] = "NGUYỄN VĂN D";
//Phần tử thứ hai của mảng con của phần tử thứ tư của mảng chính
danh_sach_lop[3, 1] = 9.9;
//Phần tử thứ ba của mảng con của phần tử thứ tư của mảng chính
danh_sach_lop[3, 2] = "Giỏi";

//Lấy ra thông tin của học sinh thứ  2
//Tạo biến lưu tên, điểm, hạnh kiểm
ten = danh_sach_lop[1, 0];
tb = danh_sach_lop[1, 1];
hanh_kiem = danh_sach_lop[1, 2];

show_debug_message("Học sinh " + ten);
show_debug_message("Hạnh kiểm " + hanh_kiem);
show_debug_message("Trung bình " + tb);

Output
Học sinh NGUYỄN VĂN B
Hạnh kiểm Khá
Trung bình 7.6

Mong các bạn nhìn ví dụ sẽ hiểu phần nào :) Yep đến đây thì các bạn sẽ có thể bắt đầu với Game Maker: Studio rồi, phần sau mình sẽ làm hướng dẫn về giao diện, chức năng các thao tác cơ bản
Bài hướng dẫn lập trình này không thể đầy đủ và xịn các bạn nên học theo clip bên dưới các bạn tập trong vòng 1 2 ngày sẽ hiểu hết những gì mình muốn truyền tải thôi (học đến bài mảng là được rồi).

Comments

Sign In or Register to comment.