Vasily Novoselov từ Azur Games đã thực hiện phân tích sâu về dữ liệu đằng sau “meta” trong game chiến thuật Kingdom Clash, hé lộ cách hàng triệu người chơi đưa ra quyết định trong game.
Mục lục
Việc phân tích các game có nhiều đơn vị tương tác với nhau là một thách thức cực kỳ lớn. Nhìn vào các game thẻ bài (CCG) điển hình: người chơi có thể bắt đầu với hàng trăm lá bài và xây dựng bộ bài độc đáo, dẫn đến vô số cách kết hợp khác nhau.
Trong game chiến thuật midcore Kingdom Clash, chúng ta có hàng chục đơn vị khác nhau, mỗi đơn vị có thể chiếm một vị trí cụ thể trên chiến trường – tạo ra gần như vô số cách sắp xếp. Mục tiêu chính của nghiên cứu này là xác định những đội hình phổ biến nhất và xem liệu có thực sự tồn tại meta trong game hay không.

Tại thời điểm viết bài, Kingdom Clash có 36 đơn vị, và mỗi đơn vị có thể được đặt vào bất kỳ vị trí nào trong số 49 ô (7×7), với khả năng lặp lại. Vì vậy, số lượng cách sắp xếp có thể là:
36^49 ≈ 10^76
Để so sánh, ước tính chỉ có khoảng 10^27 ngôi sao trong vũ trụ quan sát được.

Việc trả lời câu hỏi đơn giản như “Đội hình quân đội nào phổ biến nhất trong số người chơi?” không hề dễ dàng. Ngay cả khi bạn cố gắng liệt kê tất cả các đội hình độc đáo và đơn giản tính xem có bao nhiêu người chơi sử dụng mỗi đội hình, bạn sẽ không thể tìm được hai đội hình hoàn toàn giống nhau.
“Việc trả lời câu hỏi đơn giản như ‘Đội hình quân đội nào phổ biến nhất trong số người chơi?’ không hề dễ dàng.”
Lưu ý: Tôi hơi phóng đại quy mô ở đây – người chơi không sử dụng tất cả các đơn vị có thể, chỉ những đơn vị mang lại lợi thế lớn nhất cho họ. Vì vậy, số lượng đội hình “hữu ích” thực tế thấp hơn, nhưng vẫn còn rất lớn.
Tuy nhiên, chúng ta cần một cách để xử lý sự đa dạng này. Hãy thử xác định các đội hình phổ biến nhất và tìm hiểu xem liệu có tồn tại meta thực sự hay không.
Trả lời những câu hỏi này có thể giúp chúng ta hiểu cách người chơi chọn đơn vị và những điều chỉnh cân bằng nào có thể cần thiết trong các bản cập nhật tương lai. Cuối cùng, phân tích này sẽ mang lại không chỉ những hiểu biết sâu sắc mà còn là công cụ để giám sát và đưa ra quyết định liên tục.
Mô tả đội hình
Hãy xem xét một số cách có thể để lưu trữ và biểu diễn đội hình:
- Bảng chỉ định đơn vị nào chiếm mỗi vị trí {Vị trí 1: Đơn vị A, Vị trí 2: Đơn vị B, …}

Tuy nhiên, cách tiếp cận này không giúp chúng ta khái quát hóa đội hình theo bất kỳ cách nào, vì vậy nó không thực sự phù hợp cho phân tích của chúng ta. Mặc dù vị trí chính xác của các đơn vị trên chiến trường là quan trọng để xác định ai thắng, chúng ta có thể tạm gác lại điều đó cho mục tiêu hiện tại: đo lường mức độ phổ biến của từng đơn vị.
Về cơ bản, chúng ta chỉ muốn biết mỗi đơn vị xuất hiện bao nhiêu lần, bất kể nó được đặt ở đâu.
- Bảng chỉ định số lượng mỗi đơn vị trong đội hình {Đơn vị A: 3, Đơn vị B: 0, Đơn vị C: 1, …}
Điều này đã hữu ích hơn, nhưng vẫn chưa có cách rõ ràng để so sánh hai đội quân khác nhau. Liệu chúng ta nên so sánh từng đơn vị một, hay có cách nào khác?
Cuối cùng, tôi đã đi đến một cách tiếp cận thanh lịch hơn:
Một vector trong đó mỗi phần tử tương ứng với một đơn vị cụ thể, và giá trị là số lần đơn vị đó xuất hiện trong đội hình.

Nói cách khác, chúng ta có thể biểu diễn mỗi đội hình dưới dạng [3,0,1,0,…,2,0]. Không chỉ là cách ghi lại đội quân của người chơi một cách nhỏ gọn, việc chuyển đội hình thành vector còn mở ra cánh cửa cho việc sử dụng đại số vector để phân tích và so sánh các đội hình khác nhau.
Xác định đơn vị cốt lõi của đội hình
Từ nghiên cứu trước đây và kinh nghiệm trong game, rõ ràng có một số loại meta (ví dụ: việc sử dụng phổ biến catapults + magic archers).
Lưu ý: “Meta người chơi” đề cập đến một số chiến lược mà phần lớn người chơi chọn để giành chiến thắng tại một thời điểm nhất định. Trong bài viết này, meta/meta người chơi là tập hợp các đơn vị mà người chơi chọn thường xuyên nhất để có kết quả tốt nhất.
“Một phương pháp đơn giản là lấy trung bình của tất cả các vector đội hình. Điều đó sẽ không cung cấp cho chúng ta bức tranh hoàn hảo về meta, nhưng nó là một xấp xỉ đầu tiên vững chắc.”
Ngoài lõi này, người chơi có thể bao gồm bất kỳ đơn vị nào họ có. Vì vậy, chúng ta cần một cách để xác định các đơn vị xuất hiện nhiều nhất trong đội hình và sau đó tách chúng ra.
Một phương pháp đơn giản là lấy trung bình của tất cả các vector đội hình. Điều đó sẽ không cung cấp cho chúng ta bức tranh hoàn hảo về meta, nhưng nó là một xấp xỉ đầu tiên vững chắc.
Bằng cách tổng hợp tất cả các vector đội hình và sau đó chia cho tổng số đội hình, chúng ta có được vector đội hình trung bình, hoặc cái mà chúng ta có thể gọi là đội hình trung bình.
Vì lõi đội hình chính chỉ là một phần của tổng số 49 đơn vị, chúng ta cần đặt một ngưỡng cắt. Giả sử “lõi” đề cập đến 40 trong số 49 đơn vị đó. Chúng tôi chọn 40 dựa trên đánh giá chuyên môn. Sau đó, chúng ta chọn các đơn vị phổ biến nhất cho đến khi tổng số đạt 40.
Phương pháp này giả định rằng các đơn vị meta – những đơn vị người chơi sử dụng thường xuyên nhất – xuất hiện thường xuyên hơn các đơn vị không phải meta, vì vậy nếu chúng ta sắp xếp theo số lượng đơn vị trung bình trên mỗi đội hình, các đơn vị meta sẽ nổi lên trên cùng. Đây là cách chúng ta có được “đội hình trung bình theo hero” xấp xỉ.
Điều quan trọng cần nhớ là đây vẫn chỉ là một xấp xỉ. Trong thực tế, meta có thể khác, nhưng đối với một cách tiếp cận đơn giản và dễ hiểu, việc xác định “đội hình trung bình có điều kiện theo hero” hoạt động đủ tốt cho lần đầu tiên.
Trực quan hóa đơn vị cốt lõi
Trong bước trước, chúng ta đã xác định đội hình cốt lõi cho mỗi hero. Tuy nhiên, trong game thực tế, hiệu suất không chỉ phụ thuộc vào việc đơn vị nào được sử dụng mà còn phụ thuộc vào vị trí chúng được đặt.
Vì mỗi đơn vị trong game có cơ chế tấn công và phòng thủ độc đáo, mỗi đơn vị thường có một vị trí lý tưởng trên chiến trường nơi nó có thể phát huy hết tiềm năng. Vì vậy, chúng ta cần chuyển đổi dữ liệu tổng hợp của mình trở lại thành bố cục lưới cụ thể như {Vị trí 1: Đơn vị A, ...}
. Một nhà thiết kế game quen thuộc với meta có thể làm điều này một cách thủ công, nhưng hãy thử tự làm, đặt các đơn vị theo thuật toán.
Chúng ta sẽ sử dụng phương pháp xác suất đặt các đơn vị như cách người chơi sẽ làm. Về cơ bản, chúng ta xem xét dữ liệu chiến đấu để xác định mô hình hành vi của người chơi.
Đầu tiên, chúng ta tìm xem mỗi đơn vị chiếm những ô nào thường xuyên nhất. Chúng ta có thể hiển thị dữ liệu này dưới dạng bản đồ nhiệt 7×7, trong đó mỗi ô hiển thị tỷ lệ của tất cả các trận đấu mà một đơn vị xuất hiện ở vị trí đó (tức là, đơn vị ở ô X bao nhiêu lần, chia cho số trận đấu mà đơn vị đó tham gia).
Chúng ta có được một thứ như thế này cho mỗi đơn vị:
Bên trái, chúng ta thấy Paladin, thường đi ở phía trước để buff các đơn vị xung quanh (và người chơi thường không đặt hai Paladin cạnh nhau). Bên phải, chúng ta có catapults (đơn vị gây sát thương lớn nhưng rất mỏng manh), thường được đặt ở hàng thứ tư hoặc thứ năm, được các đơn vị khác bảo vệ.
Tiếp theo, sử dụng các bản đồ nhiệt này, chúng ta có thể đặt các đơn vị từ “đội hình trung bình” của mình lên sân.

Nhưng có một vấn đề nếu hai đơn vị muốn cùng một ô. Chúng ta sẽ cần một cách nào đó để quyết định nơi đặt mỗi đơn vị. Cho việc đó, chúng ta có thể sử dụng thuật toán như thuật toán Hungarian.
Thuật toán này thường được sử dụng để phân công ‘người thực hiện’ cho ‘công việc’ theo cách giảm thiểu chi phí. Trong trường hợp của chúng ta, các đơn vị là người thực hiện, các ô là công việc, và chi phí là khoảng cách mỗi đơn vị được đặt từ vị trí ưa thích nhất của nó (như chỉ ra bởi bản đồ nhiệt của chúng ta).
Mặc dù thuật toán này làm tốt công việc tìm vị trí tối ưu, nó không tính đến khả năng dữ liệu bản đồ nhiệt trung bình của chúng ta không thực sự lý tưởng trong mọi kịch bản. Kết quả là, nó chỉ có thể xấp xỉ một đội hình thực tế.
Kết hợp tất cả các bước này, chúng ta có được quy trình sau đây để chuyển đổi dữ liệu đội hình người chơi thành biểu diễn ‘meta-build’.
Lưu ý: Trong gameplay thực tế, người chơi thường sắp xếp quân đội của họ một cách đối xứng hoặc theo một số mẫu nhất định, nhưng thuật toán không cố gắng làm điều đó. Vì vậy, bố cục cuối cùng có thể không trông rất đối xứng, nhưng nhìn chung, phương pháp này vẫn cung cấp một xấp xỉ hợp lý về cách người chơi có thể đặt đơn vị.
Tìm đội hình tương tự với meta-formation
Sau khi xác định các đội hình “trung bình” của mình, chúng ta muốn xem có bao nhiêu đội hình người chơi thực tế gần với meta-formation đó. Chuyển đổi mọi thứ thành vector cũng hữu ích ở đây. Nếu chúng ta ký hiệu một đội hình bằng [a, b, c, d, …], trong đó ‘a’ là có bao nhiêu Đơn vị A, ‘b’ là có bao nhiêu Đơn vị B, và tiếp tục, chúng ta có thể phân tích sự tương đồng bằng các phương pháp vector.
Chúng ta sẽ nhận được một thứ như [0,0,5,1,0,0,0,6,…], đây là một vector đa chiều có thể được xử lý bởi các mô hình vector.
Nếu chúng ta tưởng tượng một thiết lập 3 đơn vị đơn giản hơn, chúng ta sẽ có các vector 3D, mà chúng ta có thể hình dung dễ dàng hơn.
Khi chúng ta biểu diễn mỗi đội hình dưới dạng một vector, việc tìm đội hình “gần nhất” về cơ bản là tìm vector gần nhất. Để làm điều đó, chúng ta có thể sử dụng cosine similarity, cho chúng ta biết hai vector giống nhau như thế nào. Trong trường hợp của chúng ta, nó hữu ích để xác định sự tương đồng giữa các đội hình.
Cosine similarity có giá trị từ -1 đến 1, trong đó -1 chỉ ra các vector chỉ theo hướng hoàn toàn ngược lại, 0 có nghĩa là không có sự tương đồng, và 1 có nghĩa là chúng giống hệt nhau.
Chúng ta tính toán cosine similarity cho mỗi cặp đội hình của người chơi và mỗi meta-formation. Sau đó, bằng cách so sánh các giá trị này, chúng ta có thể tìm ra đội hình meta nào phù hợp nhất với một đội hình nhất định.
Chắc chắn, có những phương pháp khác có thể hiệu quả hơn hoặc mang lại kết quả chính xác hơn, nhưng do hạn chế về thời gian, tôi đã chọn cách tiếp cận này.

Như bạn có thể thấy, đội hình thực của người chơi khá gần với đội hình được chúng ta xấp xỉ. Vị trí của các đơn vị có thể khác nhau nhưng tập hợp đơn vị tổng thể rất giống nhau.
“Bằng cách phân tích có bao nhiêu đội hình người chơi tương tự với đội hình trung bình, tôi đã xác nhận một loạt giả thuyết về việc sử dụng đơn vị của người chơi.”
Bằng cách phân tích có bao nhiêu đội hình người chơi tương tự với đội hình trung bình, tôi đã xác nhận một loạt giả thuyết về việc sử dụng đơn vị của người chơi. Một trong những hiểu biết thú vị là đội quân của một hero rất khác với đội quân của hero khác. Các đơn vị được những người chơi này chọn đang phản meta hiện tại của sát thương AoE bằng catapults.
Sẽ rất thú vị khi theo dõi động lực của các meta builds và thấy sự thích nghi của luật chơi hiện tại và meta bởi người chơi.
Bổ sung: Phân cụm
Vì chúng ta đang đối phó với các vector, về mặt lý thuyết, chúng ta có thể sử dụng các phương pháp phân cụm như k-means hoặc các phương pháp khác để xác định meta-formations hoặc tìm các builds liên quan.
Tuy nhiên, trong không gian 36 chiều (một chiều cho mỗi đơn vị), rất khó để xác minh liệu các cụm đó có thực sự có ý nghĩa hay không. Trong không gian 2D hoặc 3D, chúng ta có thể trực quan hóa các cụm và đánh giá chúng dễ dàng hơn; với 36D, điều đó không thực tế.

Ngoài ra, việc gộp nhiều đội hình thành một cụm không nhất thiết đảm bảo chúng thực sự giống nhau một cách có ý nghĩa. Về mặt toán học, các vector có thể gần với tâm cụm, nhưng bản thân các đội hình có thể rất khác nhau.
Vì những lý do này – và để tránh bị mắc kẹt trong việc tinh chỉnh – tôi quyết định không sử dụng phân cụm trong dự án này.
Kết luận
- Phân tích đã cho thấy có một meta rõ ràng trong game. Người chơi tập trung mạnh vào một số đơn vị nhất định trong khi bỏ qua những đơn vị khác.
- Được trang bị những hiểu biết dựa trên dữ liệu về các đội hình chính của người chơi, chúng ta có thể điều chỉnh và cân bằng các đơn vị ít phổ biến hơn để game trở nên đa dạng hơn (và vui hơn).
- Chúng ta cũng có được một công cụ phân tích đội hình hữu ích cho phép chúng ta đi sâu hơn vào hành vi của người chơi.