Bagaimana cara mendeteksi prestasi dalam bermain game?

10

Saya keliru memposting ini ke stackoverflow dan sekarang memposting di sini berdasarkan saran di situs itu ...

Ini adalah pertanyaan konseptual tingkat yang sangat tinggi. Katakan dalam aplikasi perangkat lunak, saya memiliki 4 tindakan berbeda, misalnya: Unggah, Bagikan, Komentar, dan sukai

Dan saya ingin memberikan lencana pencapaian kepada pengguna seperti:

  • Pemula - Unggah 5 file pertama Anda
  • Unggah Junkie - Unggah 20 file dalam 1 hari
  • Night Crawler - Unggah file setelah tengah malam
  • Share-a-holic - Bagikan 10 file berbeda
  • Likes-everything - Suka 20 file berbeda

Anda mendapatkan idenya. Apa cara terbaik untuk memeriksa dan melihat apakah pengguna telah mencapai prestasi tertentu tanpa harus menyusun logika pencapaian ke dalam kode saya? Dan .. - Pertahankan kemampuan untuk Menambahkan kompilasi posting pencapaian baru (xml atau db) - Prestasi harus melacak tindakan spesifik, jumlah kali, dan kriteria tambahan (seperti waktu dalam sehari) - Deteksi harus mendekati waktu-nyata sehingga pengguna memberi tahu hampir seketika saat sebuah pencapaian selesai

Pertanyaan terbesar saya adalah, bagaimana cara saya mendeteksi pencapaian ini? Apakah saya:

1) Periksa setelah setiap tindakan untuk melihat apakah ... (Paling real time) 2) Apakah program lain memeriksa DB setiap saat terhadap serangkaian aturan? (Termudah)

Apakah ada paradigma lain yang saya lewatkan? Saya merasa pasti ada karena di banyak game (seperti jetpack untuk iOS misalnya), saya diberitahu tentang pencapaian yang saya buka secara instan di mana saya membuka kunci yang menurut saya cukup mengesankan.

Terima kasih

Tan Rezaei
sumber
Sudahkah Anda merancang atau membuat sistem pencapaian dan hanya ingin tahu cara menggunakannya dalam game?
Harrison Brock

Jawaban:

6

Apa yang biasanya Anda lakukan adalah memiliki sistem "prestasi". Setiap tindakan yang terjadi memanggil sistem pencapaian dan mengatakan "hei hal ini terjadi begitu saja".

Sistem pencapaian kemudian biasanya seperangkat aturan, biasanya terdiri dari logika kombinasi sederhana dan penghitung untuk berbagai "peristiwa". Kemudian tanggung jawab sistem pencapaian untuk bekerja, dengan bantuan aturan dan penghitung, terjadi apa yang terjadi, dan prestasi apa yang diberikan.

Alasan Anda melakukan ini ada dua.

  • Anda tidak ingin menyebarkan logika negara Anda ke seluruh basis kode Anda.

  • terkadang pencapaian akan membutuhkan kombinasi "barang" yang dapat terjadi di sistem yang sama sekali berbeda / waktu / dll dan menyebarkan logika untuk ini di sekitar basis kode Anda akan menghasilkan sejumlah besar kompleksitas yang tidak perlu.

Cara saya melakukannya di masa lalu adalah dengan menggunakan sistem aturan skrip (di mana skrip adalah istilah yang sangat longgar, biasanya hanya semacam pembanding data didorong). Jadi Anda bisa mengatakan sesuatu yang mirip dengan:

  • Ketika "pengguna menekan sesuatu" terjadi "kenaikan" variabel "ditekan".

Maka Anda bisa memiliki aturan lain yaitu

  • Ketika variabel "yang ditekan" lebih besar dari "beberapa nilai", bagikan prestasi "bla"

Atau mungkin

  • Ketika "pengguna membunuh bos" terjadi "bagikan" prestasi "bla".

Sistem pencapaian juga akan ditugaskan untuk mempertahankan status pencapaian yang telah dibagikan, sehingga Anda tidak mendapatkan duplikat.

Matt D
sumber
0

Cara yang rapi untuk menangani ini mungkin merupakan pola spesifikasi. Anda akan memiliki manajer prestasi, yang secara berkala akan meminta pengguna Anda untuk mereka yang cocok dengan salah satu dari serangkaian spesifikasi. Kelas prestasi Anda karena itu akan mencakup nama, logo, skor poin dll sebagai normal, dan juga spesifikasi yang menggambarkan pengguna yang telah memperoleh prestasi itu. Misalnya, dalam C #, pencapaian "Share-a-holic" mungkin terlihat seperti ini:

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

AchievementManager.AddAchievementType(ShareAHolic);

dan kemudian pada titik yang sesuai, manajer pencapaian Anda dapat melakukan sesuatu seperti ini:

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()Metode manajer prestasi Anda juga dapat dipanggil langsung pada titik yang tepat jika suatu prestasi dapat dideteksi dengan segera. Anda mungkin juga ingin menambahkan metode untuk menjalankan pemeriksaan ini pada pengguna tertentu, sehingga Anda dapat memicu pemeriksaan setelah peristiwa penting untuk memungkinkan pengguna mendapatkan prestasi dengan segera.

anaximander
sumber
Mempartisi pencapaian menjadi penting dengan cepat, AchType membutuhkan properti 'sope' yang dapat membantu DB.Pengguna. Di mana () untuk menghindari pencapaian yang tidak terkait, jika memungkinkan. Jadi jika pencapaian berbagi file hanya dapat diberikan dalam PvP, hanya cari PvP. Sementara sesuatu yang generik seperti penjarahan mungkin layak secara global dan tidak akan memiliki cakupan seperti itu.
hpavc