Thuật toán ngẫu nhiên trong GameplayKit (Phần 1)

I. Thuật toán ngẫu nhiên trong GameplayKit:

Đối với những trò chơi mà xác suất và cơ hội đóng vai trò chính thì thuật toán ngẫu nhiên chính là cốt lõi của cả trò chơi. Khi bạn chơi một trò chơi trên những bàn cờ (board games) thì những điểm của xúc xắc quyết định số nước đi của người chơi hay việc xào bài trong một trò chơi bài bạc như xí dzách, tiến lên. Những điều bất ngờ trong game tạo ra những điểm hấp dẫn dành cho game và thay đổi toàn bộ cách chơi nếu bạn thay đổi xác xuất trong game. Tính ngẫu nhiên có vẻ đơn giản nhưng thực sự để có được sự ngẫu nhiên tốt trong 1 game nó không dễ dàng chút nào.

Việc tạo ra tính ngẫu nhiên trong 1 game kích thích người chơi cố gắng hơn trong việc tiến tới mục tiêu. Việc có được viên kim cương với tỉ lệ 10 % sẽ rất hảo hứng vì nó cho người chơi một mục tiêu cụ thể hơn cho việc hạ gục một con boss trong trò chơi so với việc không biết gì về khả năng có thể có được viên kim cương đó. Tuy nhiên việc đánh hơn 50 lần vẫn không thể có được sẽ làm cho người chơi không còn niềm tin vào tỉ lệ này.

Chính từ những điểm này mà ta cần phải tập trung vào những điểm quan trọng trong việc tạo ra các ngẫu nhiên trong trò chơi.

+ Tính ngẫu nhiên: Một con số hay tỉ lệ ngẫu nhiên nghĩa là bạn không thể đoán ra được (dĩ nhiên là không phải trong tình trạng tỉ lệ 100 %). Tuy nhiên, một thuật toán ngẫu nhiên tốt là gì? Dĩ nhiên là nó khó đoán trước nhưng đó không phải là tất cả những gì có thể có của 1 thuật toán ngẫu nhiên tốt. Thuật toán ngẫu nhiên tốt phải bao gồm cả việc cân bẳng trong giới hạn của nó. Khi bạn ngẫu nhiên 10.000 số trong giới hạn 1-100 thì việc ra các số này phải có tỉ lệ tương đồng với nhau và không có số nào là không xuất hiện. Chu kỳ lặp lại của nó cũng cần phải khó đoán, trong 100 số thì không có sự lặp lại của những khối số.

+ Hiệu suất: Việc tạo ra một đoạn mã thực thi phức tạp để tạo ra tính ngẫu nhiên tốt nhất dĩ nhiên là tốt, tuy nhiên, nó phải đi kèm với hiệu suất tốt. Bạn không thể cho chạy một thuật toán phức tạp chỉ để cho ra 1 số trên mặt xúc xắc trong khi có hàng ngàn thứ khác đang cần xử lý.

+ Định luận: Một trò chơi chất lượng đòi hỏi cần phải được kiểm tra đầy đủ (Test), tuy nhiên với các thuật toán ngẫu nhiên thì việc điểm định hết tất cả các trường hợp trong game gần như là không thể. Một thuật toán ngẫu nhiên tốt sẽ duy trì những tình huống bất ngờ trong game dành cho người chơi. Thêm vào đó, nó cần được quan tâm đúng mức để có thể mở rộng ra khi cần thiết.

+ Tính độc lập: Những con số hay nguồn ngẫu nhiên phải độc lập so với kết quả gần nhất.

+ Tính ngẫu nhiên tương đồng: Những gì được ngẫu nhiên cần phải tương đồng với tất cả các kết quả được đưa ra.

  • Cách sử dụng Randomization trong game:

Toàn bộ những lớp ngẫu nhiên, tính ngẫu nhiên hoá trong GameplayKit đều thông qua giao thức GKRandom. Nó sử dụng thông qua các mô thức tối thiểu trong các giao diện. Chính vì vậy việc đầu tiên bạn cần là chọn ra cách thức ngẫu nhiên phù hợp với game của bạn, tất cả những gì còn lại hãy để cho GameplayKit làm dùm:

+ Trong hầu hết các trường hợp, bạn sẽ cần một con số ngẫu nhiên đồng nhất trong 1 khoản giới hạn. Ví dụ như bạn cần 1 số nằm trong khoản giữa 1 tới 100. Như vậy thứ bạn cần là GKRandomDistribution.

+  Để tuỳ chính tính ngẫu nhiên nhưng vẫn mang tính đồng nhất giữa chúng, bạn có thể chọn những lớp phụ nằm trong GKRandomSource

+ Để có thể tuỳ chỉnh tính ngẫu nhiên (không còn đồng nhất) thì bạn cần phải dùng đến các lớp GKGaussianDistribution hay GKShuffledDistribution

+ Nếu bạn không cần sử dụng đến thuật toán ngẫu nhiên trong một khoảng hay một giới hạn nào đó thì bạn chỉ việc sử dụng trực tiếp GKRandomSource

+ Bạn chỉ việc sử dụng GKRandomSource để ngẫu nhiên một mảng (array) như ngẫu nhiên xào bài.

+ Bạn chỉ việc đưa mảng vào  arrayByShuffelingObjectsInArray:

+ Lệnh sẽ trả về một nhân bản với thứ tự ngẫu nhiên.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: