[Hướng Dẫn] Hệ thống túi đồ (số 1)

Focker_cFocker_c Posts: 1,577Registered
edited July 2019 in Game Maker: Studio
Giới thiệu
Chào các bạn.

Bài viết này có lẽ không chỉ dành riêng cho engine Game Maker, đây là một bài viết cung cấp cho bạn kiến thức cơ bản về mặt thuật toán để làm ra hệ thống Túi đồ (inventory) hay kể cả Ô chiêu thức (skill slots).

Yêu cầu
+ Thành thạo về array variable (biến dãy)
+ Thành thạo cú pháp "for".
+ Hiểu cơ bản về hệ thống trên.
Mình sẽ lần lượt hướng dẫn các yêu cầu trên ở bên dưới nhé.

Nội dung
Trước tiên ta hiểu về inventory trước. Nó là một túi đồ bao gồm nhiều ô đồ (slot) bên trong. Mỗi slot chứa 1 loại item nhất định và số lượng nhất định.

Về cơ bản thì ta sẽ khởi tạo nhiều biến, mỗi biến thể hiện ID của 1 slot.
ID_slot_1 = 0
quantity_slot_1 = 0

ID_slot_2 = 0
quantity_slot_2 = 0

ID_slot_3 = 0
quantity_slot_3 = 0

ID_slot_4 = 0
quantity_slot_4 = 0

ID_slot_5 = 0
quantity_slot_5 = 0
Khi mà muốn thêm một món đồ [Quả táo] có ID 25 và có số lượng 50 vào slot 1, ta sẽ đưa ra lệnh gán vào biến trên :
ID_slot_1 = 25
quantity_slot_1 = 50

Hay khi muốn bớt từ slot 1 đi 26 quả táo vì nộp nhiệm vụ chẳng hạn :
quantity_slot_1 -= 26

Về cơ bản thì cách vận hành inventory là như thế. Nhưng vấn đề ở đây là nếu làm như trên thì quá rườm rà.
Tại sao rườm rà ? => Quá nhiều biến, cũng như không có sự đồng bộ. Và giả dụ như muốn thêm những biến như :
name_slot_1 (hiển thị tên của item đang trong slot)
description_slot_1 (hiển thị chú thích item)
v.v...
thì chả phải là quá trời nhiều biến sao. Và chìa khóa để giải quyết việc này chính là : Array Var (biến dãy).
Nếu bạn nào đã học qua lập trình thì cũng không còn xa lạ gì với khái niệm này. Nhưng bài guide của mình dành cho maker căn bản, nên chúng ta bắt đầu tìm hiểu array var nhé.
Khác với biến thông thường, biến dãy cung cấp cho chúng ta nhiều khoảng chứa hơn chỉ với một biến gốc. Hay nói dễ hiểu, array var là cách chúng ta chia biến thành nhiều ô nhỏ và đánh số nó để tiện cho việc sử dụng.
Lấy luôn trường hợp mà chúng ta đang gặp phải bên trên, mình sẽ khởi tạo lại những biến mới như sau :

slot[1,1] = 0 // ID
slot[1,2] = 0 // Quantity

slot[2,1] = 0
slot[2,2] = 0

slot[3,1] = 0
slot[3,2] = 0

slot[4,1] = 0
slot[4,2] = 0

slot[5,1] = 0
slot[5,2] = 0


Nhìn có vẻ đã nhỏ gọn hơn và dễ đọc hơn.
Mẫu : slot[a,b] 
thì a là số thứ tự slot
và b là một giá trị của slot.
Nếu b là 1, biến sẽ là ID của slot.
Nếu b là 2, biến sẽ là số lượng item trong slot.
Và giả sử thêm :
Nếu b là 3, biến sẽ là tên item.
Nếu b là 4, biến sẽ là một đoạn chú thích cho item đang trong slot.

Và để đơn giản hóa tối đa, chúng ta sử dụng câu lệnh for  :
for (i = 1; i <= 5; i += 1)
{
   slot[i,1] = 0 // ID
   slot[i,2] = 0 // quantity
   slot[i,3] = “” //name
   slot[i,4] = “” //description
}
Trước hết hãy nhìn vào ví dụ trên, biến i sẽ chạy lần lượt từ 1 đến 5. Mỗi lần tăng lên 1 số. Và biến i đó cũng được sử dụng bên dưới luôn.
Tức là mình dùng i đển thay cho số thứ tự slot.
Còn các giá trị ID, số lượng, tên, chú thích của slot thì mình khởi tạo theo từng i.
Câu lệnh for thực chất sử dụng khi ta muốn làm đi làm lại một việc gì đó mà mỗi lần lặp lại, ta thay đổi một số gì đó tương đương với số lần lặp.
Cú pháp chuẩn bài sách giáo khoa :
for ( <1> ; <2> ; 3> )
trong đó :
<1> là giá trị ban đầu. Nó sẽ biến đổi dần nên <2>.
<2> là giới hạn giá trị cuối. Khi nào giá trị còn thỏa mãn cái này thì mới cho lặp. Vượt quá cái này thì kết thúc cả lệnh for.
3> là thay đổi giá trị mỗi lần lặp.


Thêm 1 ví dụ khác cho phong phú :
for (i = 10; i >= 1; i -= 1)
Lặp 10 lần, nhưng đếm ngược từ 10 về 1. Mỗi lần lặp sẽ giảm đi 1 số.

TỔNG KẾT
Vậy là kết thúc guide này, chúng ta đã hiểu và biết cách dùng biến dãy và câu lệnh for. Cũng như hiểu cơ bản về hệ thống đồ đạc.
Ở PHẦN SAU :
Chúng ta sẽ đi sâu vào vấn đề với :
- Cách hiển thị inventory ( ở bên trên với là phần hoạt động bên trong của inventory, chứ chưa hiện gì cho người chơi xem)
- Một số điều nâng cao như : 
+ tự động hóa việc thêm item vào inven : kiểu như là hệ thống báo là nhận được 26 quả táo, thì inven tự tìm ra slot trống đầu tiên và thêm vào. Hay đã có táo trong inven rồi thì cộng thêm vào slot đã có đó.
+ tương tự với việc tự động hóa trừ item.

Hẹn gặp lại ở số sau,
Focker C from TTC.

Comments

  • Quang TrầnQuang Trần Posts: 258Registered
    Hì hì, bài 2 ra sớm nha anh : )))))
  • Black FaceBlack Face Posts: 424Registered
    Bài viết tốt quá, viết phần 2 đi bạn, mình muốn góp 1 ý nhỏ của bài này là nếu có muốn nhập thông tin vật phẩm, name, descrip thì lấy giá trị từng dòng từ file text bên ngoài theo item ID, ID = 0 ứng với dòng 1 trong file

    VD 1 code C# đơn giản, các ngôn ngữ khác cũng tương tự
    string[] item_name = File.RealAllLines("item_name.txt");
    string[] item_des = File.RealAllLines("item_des.txt");
    for (i = 1; i <= 5; i++)
    {
      slot[i,1] = i; // ID
      slot[i,2] = i*10; // Quality
      slot[i,3] = item_name[slot[i,1]]; // Name
      slot[i,4] = item_des[slot[i,1]]; // Description
    }
    
  • Focker_cFocker_c Posts: 1,577Registered
    Tức là nhập từ file hả ?
    Uhm, cũng là việc nên làm, nhưng mà
    giới hạn của bài là hướng dẫn cơ bản về 2 thứ là biến array và lệnh for.
    Cũng muốn mở rộng vấn đề nhiều thứ, những sợ dài dòng, những bạn mới tiếp cận sẽ thấy khó ấy mà :)
Sign In or Register to comment.