Oyundaki başarılar nasıl tespit edilir?


10

Yanlışlıkla stackoverflow için bu yayınlanmıştır ve şimdi burada bu sitede bir öneri dayalı gönderme ...

Bu çok üst düzey bir kavramsal sorudur. Bir yazılım uygulamasında 4 farklı eylemim olduğunu söyleyin, örneğin: Yükle, Paylaş, Yorum Yap ve benzeri

Ve aşağıdaki gibi kullanıcılara başarı rozetleri vermek istiyorum:

  • Çaylak - İlk 5 dosyanızı yükleyin
  • Junkie Yükle - 1 günde 20 dosya yükle
  • Night Crawler - Gece yarısından sonra dosya yükle
  • Paylaşım - 10 farklı dosya paylaşın
  • Likes-everything - 20 farklı dosya gibi

kaptın bu işi. Bir kullanıcının mantığımı kodumda derlemek zorunda kalmadan belirli bir başarıyı elde edip etmediğini kontrol etmenin ve görmenin en iyi yolu nedir? Ve .. - Derleme sonrası yeni başarılar ekleme yeteneğini koru (xml veya db) - Başarılar belirli eylemleri, kaç kez ve ek kriterleri (günün saati gibi) takip etmelidir - Tespit gerçek zamanlıya yakın olmalıdır. neredeyse bir başarı tamamlandığında

En büyük sorum, bu başarıların nasıl elde edildiğini nasıl tespit edebilirim? Ben:

1) Her eylemden sonra şunları kontrol edin ... (En gerçek zamanlı) 2) Başka bir program DB'yi her zaman bir dizi kurala göre kontrol ettiniz mi? (En kolay)

Kaçırdığım başka bir paradigma var mı? Kesinlikle olduğunu hissediyorum çünkü birçok oyunda (örneğin iOS için jetpack gibi), oldukça etkileyici bulduğum kilidini açtığım anda açtığım başarıdan haberdar oldum.

teşekkür ederim


Başarı sistemini henüz tasarladınız veya yaptınız ve sadece oyunda nasıl kullanılacağını bilmek mi istiyorsunuz?
Harrison Brock

Yanıtlar:


6

Genel olarak yaptığınız şey bir "başarı" sistemine sahip olmaktır. Gerçekleşen herhangi bir eylem, başarı sistemini çağırır ve "hey bu şey oldu" der.

Bu durumda, başarı sistemi genellikle basit bir kombinatoryal mantık ve çeşitli "olaylar" için sayaçlardan oluşan bir dizi kuraldır. O zaman, başarı sisteminin, kurallar ve sayaçlar, uyandırmalar ve hangi başarıların verileceği yardımıyla çalışmaktan sorumludur.

Bunu yapmanın nedeni iki yönlüdür.

  • Durum mantığınızı kod tabanınızın her tarafına yaymak istemezsiniz.

  • bazen başarılar tamamen farklı sistemlerde / zamanlarda / vb. meydana gelebilecek "malzeme" kombinasyonlarını gerektirir ve bunun için mantığın kod tabanınıza yayılması büyük miktarda gereksiz karmaşıklığa neden olur.

Geçmişte bunu yapmanın yolu, bir komut dosyası komut sistemi kullanmaktır (komut dosyalarının çok gevşek bir terim olduğu, genellikle sadece bir tür veri odaklı karşılaştırıcı). Böylece aşağıdakine benzer bir şey söyleyebilirsiniz:

  • "Kullanıcı bir şeye bastığında" "artmış" olur "basılı" değişken.

Sonra başka bir kural olabilir

  • "Basılı" değişken, "bazı değer" den "başarı" den daha büyük olduğunda

Ya da belki

  • "Kullanıcı patron öldürürse" olur "başarı" teslim "blah".

Başarı sistemi, hangi başarıların daha önce dağıtıldığı durumunu korumakla da görevlendirilir, böylece kopyalar almazsınız.


0

Bunu ele almanın düzgün bir yolu bir şartname deseni olabilir. Kullanıcılarınızdan düzenli olarak bir dizi spesifikasyonla eşleşenleri sorgulayan bir başarı yöneticiniz olur. Bu nedenle başarı sınıfınız normal olarak bir ad, logo, puan puanı vb. Ve aynı zamanda bu başarıyı kazanan bir kullanıcıyı tanımlayan bir belirtimi içerir. Örneğin, C # 'da, "Paylaşım paylaş" başarısı şöyle görünebilir:

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

AchievementManager.AddAchievementType(ShareAHolic);

ve sonra uygun noktada, başarı yöneticiniz şöyle bir şey yapabilir:

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()Bir başarı hemen tespit edilebilirse, başarı yöneticinizin yöntemi doğrudan uygun noktadan çağrılabilir. Ayrıca, bu kontrolleri belirli bir kullanıcı üzerinde çalıştırmak için bir yöntem eklemek isteyebilirsiniz, böylece kullanıcıların hemen başarı elde etmesini sağlamak için önemli olaylardan sonra bir kontrolü tetikleyebilirsiniz.


Bölümleme başarıları hızlı bir şekilde önemli hale gelir, AchType, mümkünse ilgisiz başarılardan kaçınmak için DB.Users.Where () öğesine yardımcı olabilecek bir 'sope' özelliğine ihtiyaç duyar. Dolayısıyla, dosya paylaşımı başarısı yalnızca PvP'de verilebiliyorsa, yalnızca PvP'yi arayın. Yağma gibi genel bir şey küresel olarak uygulanabilir olsa da ve böyle bir kapsamı yoktur.
hpavc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.