Làm thế nào để phát hiện thành tích trong chơi game?


10

Tôi đã đăng nhầm sang stackoverflow và bây giờ đăng ở đây dựa trên một gợi ý trên trang web đó ...

Đây là một câu hỏi khái niệm cấp độ rất cao. Nói trong một ứng dụng phần mềm Tôi có 4 hành động khác nhau, ví dụ: Tải lên, Chia sẻ, Nhận xét và thích

Và tôi muốn trao huy hiệu thành tích cho người dùng như:

  • Rookie - Tải lên 5 tệp đầu tiên của bạn
  • Tải lên Junkie - Tải lên 20 tệp trong 1 ngày
  • Night Crawler - Tải tệp lên sau nửa đêm
  • Share-a-holic - Chia sẻ 10 tệp khác nhau
  • Thích-mọi thứ - Thích 20 tệp khác nhau

bạn có được ý tưởng Cách tốt nhất để kiểm tra và xem liệu người dùng có đạt được một thành tích cụ thể nào mà không phải biên dịch logic để đạt được thành mã của tôi không? Và .. - Giữ lại khả năng Thêm biên dịch bài đăng thành tích mới (xml hoặc db) - Thành tích phải theo dõi các hành động cụ thể, số lần và tiêu chí bổ sung (như thời gian trong ngày) - Phát hiện phải ở gần thời gian thực để người dùng thông báo gần như ngay lập tức khi một thành tích được hoàn thành

Câu hỏi lớn nhất của tôi là, làm thế nào để tôi phát hiện những thành tựu này đang đạt được? Tôi có

1) Kiểm tra sau mỗi hành động để xem liệu ... (Hầu hết thời gian thực) 2) Có chương trình nào khác kiểm tra DB mọi lúc theo một bộ quy tắc không? (Dễ nhất)

Có một mô hình khác mà tôi đang thiếu? Tôi cảm thấy chắc chắn là vì trong nhiều trò chơi (ví dụ như jetpack cho iOS), tôi đã được thông báo về thành tích mà tôi đã mở khóa ngay khi tôi mở khóa mà tôi thấy khá ấn tượng.

Cảm ơn bạn


Bạn đã thiết kế hoặc tạo ra hệ thống thành tích chưa và chỉ muốn biết cách sử dụng nó trong trò chơi?
Harrison Brock

Câu trả lời:


6

Những gì bạn thường làm là có một hệ thống "thành tích". Bất kỳ hành động nào xảy ra đều gọi hệ thống thành tích và nói "hey điều này vừa xảy ra".

Hệ thống thành tích sau đó thường là một bộ quy tắc, thường được tạo thành từ logic tổ hợp đơn giản và bộ đếm cho các "sự kiện" khác nhau. Sau đó, trách nhiệm của hệ thống thành tích là làm việc, với sự trợ giúp của các quy tắc và bộ đếm, các trận đòn đã xảy ra, và những thành tựu cần đưa ra.

Lý do bạn làm điều này là gấp đôi.

  • Bạn không muốn truyền bá logic trạng thái của mình trên khắp cơ sở mã của bạn.

  • đôi khi thành tích sẽ yêu cầu kết hợp các "công cụ" có thể xảy ra trong các hệ thống / thời gian hoàn toàn khác nhau và việc truyền bá logic cho điều này xung quanh cơ sở mã của bạn sẽ dẫn đến một lượng lớn phức tạp không cần thiết.

Cách mà tôi đã làm trong quá khứ là sử dụng một hệ thống quy tắc có thể viết được (trong đó scriptable là một thuật ngữ rất lỏng lẻo, thường chỉ là một loại so sánh hướng dữ liệu). Vì vậy, bạn có thể nói điều gì đó giống như:

  • Khi "người dùng nhấn một cái gì đó" xảy ra "tăng" biến "nhấn".

Sau đó, bạn có thể có một quy tắc khác đó là

  • Khi biến "ép" là "lớn hơn", một số giá trị "đưa ra thành tích" blah "

Hoặc có lẽ

  • Khi "người dùng giết ông chủ" xảy ra "ra tay" thành tích "blah".

Hệ thống thành tích cũng sẽ được giao nhiệm vụ duy trì trạng thái mà các thành tích đã được trao, vì vậy bạn không nhận được các bản sao.


0

Một cách gọn gàng để xử lý điều này có thể là một mẫu đặc tả. Bạn sẽ có một trình quản lý thành tích, định kỳ sẽ truy vấn người dùng của bạn để biết những người phù hợp với bất kỳ thông số kỹ thuật nào. Do đó, lớp thành tích của bạn sẽ bao gồm tên, logo, điểm số, v.v. như bình thường và cũng là một đặc điểm kỹ thuật mô tả người dùng đã đạt được thành tích đó. Ví dụ: trong C #, thành tích "Chia sẻ chung" có thể giống như thế này:

AchievementType ShareAHolic = new AchievementType
{
    Name = "Share-a-holic",
    Description = "Shared 10 files",
    Score = 25,
    Specification = (user => user.SharedFiles.Distinct().Count() > 10)
};

AchievementManager.AddAchievementType(ShareAHolic);

và sau đó tại thời điểm thích hợp, người quản lý thành tích của bạn có thể làm một việc như thế này:

foreach (AchievementType achievement in AchievementTypes)
{
    var users = DB.Users.Where(achievement.Specification && !(user.Achievements.Contains(achievement)));
    foreach (User u in shareaholics)
    {
        AchievementManager.Award(u, achievement);
    }
}

.Award()Phương pháp của người quản lý thành tích của bạn cũng có thể được gọi trực tiếp tại điểm thích hợp nếu có thể phát hiện thành tích ngay lập tức. Bạn cũng có thể muốn thêm một phương thức để chạy các kiểm tra này trên một người dùng cụ thể, để bạn có thể kích hoạt kiểm tra sau các sự kiện quan trọng để cho phép người dùng nhận được thành tích ngay lập tức.


Phân vùng thành tích trở nên nhanh chóng quan trọng, AchType cần một thuộc tính 'sope' có thể hỗ trợ DB.Users.Where () để tránh các thành tích không liên quan, khi có thể. Vì vậy, nếu thành tích chia sẻ tệp chỉ có thể được trao trong PvP, chỉ tìm kiếm PvP. Trong khi một cái gì đó chung chung như cướp bóc có thể khả thi trên toàn cầu và sẽ không có phạm vi như vậy.
hpavc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.