Як виявити досягнення в іграх?


10

Я помилково опублікував це в stackoverflow і тепер розміщую тут на основі пропозиції на цьому сайті ...

Це концептуальне питання дуже високого рівня. Скажімо, у програмному застосуванні у мене є 4 різні дії, наприклад: Завантажити, Поділитися, Коментувати тощо

І я хочу надати значки досягнень таким користувачам, як:

  • Новачок - завантажте свої перші 5 файлів
  • Завантажити Junkie - Завантажте 20 файлів за 1 день
  • Нічний сканер - Завантажте файл після півночі
  • Share-a-holic - Поділіться 10 різними файлами
  • Подобається - все - як 20 різних файлів

ви отримуєте ідею. Який він найкращий спосіб перевірити і побачити, чи досяг користувач певного досягнення, не вкладаючи логіку досягнення в мій код? .. майже миттєво, коли досягнення завершено

Мої найбільші запитання - як я визнаю досягнуті ці досягнення? Чи повинен я:

1) Перевіряйте після кожної дії, щоб побачити, чи ... (Найчастіше в реальному часі) 2) Чи інша програма постійно перевіряє БД на набір правил? (Найпростіше)

Чи є інша парадигма, якої я пропускаю? Я відчуваю, що це безумовно, тому що в багатьох іграх (наприклад, jetpack для iOS, наприклад) я отримую повідомлення про досягнення, які я розблокував в ту мить, в якій я його розблокував, і що мені здалося досить вражаючим.

Дякую


Ви ще розробили або зробили систему досягнень і просто хочете знати, як її використовувати в грі?
Гаррісон Брок

Відповіді:


6

Що ти зазвичай робиш - це система "досягнення". Будь-яка дія, що трапляється, закликає систему досягнень і каже: "Ей, ця річ щойно відбулася".

Система досягнень тоді зазвичай є набором правил, що зазвичай складається з простої комбінаторної логіки та лічильників для різних "подій". Тоді відповідальність системи досягнень за розробку, за допомогою правил та лічильників, випадків виникнення, і які досягнення слід видати.

Причина, що ви робите це, є двоякою.

  • Ви не хочете поширювати свою логіку стану по всій своїй кодовій базі.

  • Іноді для досягнення потрібні комбінації "речей", які можуть траплятися в абсолютно різних системах / часах / і т.д.

Так, як я це робив у минулому, - це використовувати правила правил написання сценарію (де сценарій є дуже вільним терміном, як правило, це лише якийсь компаратор, керований даними). Тож ви можете сказати щось подібне:

  • Коли "користувач щось натиснув", відбувається "збільшення" змінної "натиснутої".

Тоді ви можете мати інше правило, яке є

  • Коли змінна "натиснута" є "більшою", ніж "деяка цінність", передайте досягнення "бла"

А може, й

  • Коли "користувач вбиває боса", трапляється "роздавай" досягнення "бла".

Система досягнень також матиме завдання підтримувати стан, досягнення якого вже передано, тому дублікатів ви не отримаєте.


0

Акуратним способом впоратися з цим може бути модель специфікації. У вас є менеджер досягнень, який періодично запитуватиме користувачів щодо тих, хто відповідає будь-якому з наборів специфікацій. Отже, ваш клас досягнень включатиме ім'я, логотип, бальну оцінку тощо як звичайне, а також специфікацію, що описує користувача, який здобув це досягнення. Наприклад, у C #, досягнення "Share-a-holic" може виглядати так:

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

AchievementManager.AddAchievementType(ShareAHolic);

а потім у відповідний момент ваш менеджер із досягнень може зробити щось подібне:

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()Метод менеджера ваших досягнень також може бути викликаний безпосередньо у відповідній точці, якщо досягнення можна негайно виявити. Ви також можете додати метод для запуску цих перевірок для конкретного користувача, щоб ви могли запустити перевірку після важливих подій, щоб користувачі могли негайно отримувати досягнення.


Досягнення розділення стає швидко важливим, AchType потребує властивості "sope", яке може допомогти DB.Users.Where (), щоб уникнути непов'язаних досягнень, коли це можливо. Отже, якщо досягнення спільного доступу до файлів можна присудити лише у PvP, шукайте лише PvP. Хоча щось загальне на кшталт розкрадання може бути здійснене в усьому світі та не має такого масштабу.
hpavc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.