Come rilevare i risultati nei giochi?

10

Per sbaglio ho postato questo messaggio su StackOverflow e ora sto postando qui in base a un suggerimento su quel sito ...

Questa è una domanda concettuale di altissimo livello. Per esempio, in un'applicazione software ho 4 azioni diverse, ad esempio: caricamento, condivisione, commento e simili

E voglio dare badge di successo a utenti come:

  • Rookie - Carica i tuoi primi 5 file
  • Carica Junkie: carica 20 file in 1 giorno
  • Night Crawler: carica un file dopo la mezzanotte
  • Condividi-a-holic - Condividi 10 file diversi
  • Mi piace-tutto - Come 20 file diversi

ti viene l'idea. Qual è il modo migliore per verificare se un utente ha raggiunto un risultato particolare senza dover compilare la logica per il raggiungimento del mio codice? E ... - Conserva la capacità di aggiungere nuovi obiettivi post-compilazione (xml o db) - Gli obiettivi devono tenere traccia di azioni specifiche, numero di volte e criteri aggiuntivi (come l'ora del giorno) - Il rilevamento dovrebbe essere vicino in tempo reale così l'utente ha quasi istantaneamente quando un risultato è completato

Le mie più grandi domande sono: come posso rilevare che questi risultati sono stati raggiunti? Io:

1) Controlla dopo ogni azione per vedere se ... (Più tempo reale) 2) Avere un altro programma controlla il DB in ogni momento contro un insieme di regole? (Più semplice)

C'è un altro paradigma che mi manca? Sento che c'è sicuramente perché in molti giochi (come jetpack per iOS, ad esempio), mi viene notificato il risultato che ho sbloccato nell'istante in cui lo sblocco che ho trovato piuttosto impressionante.

Grazie

    
posta Tan Rezaei 19.06.2013 - 02:42
fonte

2 risposte

6

Ciò che generalmente fai è avere un sistema di "raggiungimento". Qualsiasi azione che succede chiama il sistema di risultati e dice "hey questa cosa è appena successo".

Il sistema dei risultati è quindi solitamente un insieme di regole, di solito costituite da una semplice logica combinatoria e da contatori per vari "eventi". È quindi la responsabilità del sistema di conseguimento di allenarsi, con l'aiuto delle regole e dei contatori, degli scoppi e degli obiettivi da conseguire.

Il motivo per cui lo fai è duplice.

  • Non vuoi diffondere la tua logica di stato su tutta la tua base di codice.

  • a volte i risultati richiederanno combinazioni di "cose" che potrebbero verificarsi in sistemi / tempi / ecc completamente diversi e diffondere la logica per questo attorno al tuo codice base comporterebbe grandi quantità di complessità non necessaria.

Il modo in cui l'ho fatto in passato consiste nell'utilizzare un sistema di regole scriptable (dove lo script è un termine molto lento, di solito solo una sorta di comparatore guidato dai dati). Quindi puoi dire qualcosa di simile a:

  • Quando "l'utente preme qualcosa" accade "incrementa" la variabile "pressata".

Quindi potresti avere un'altra regola che è

  • Quando la variabile "pressata" è "maggiore" di "qualche valore", consegna il successo "blah"

O forse

  • Quando "l'utente uccide il boss" accade "consegna" realizzazione "blah".

Il sistema dei risultati sarà anche incaricato di mantenere lo stato di cui sono già stati ottenuti i risultati, in modo da non ottenere duplicati.

    
risposta data 19.06.2013 - 02:57
fonte
0

Un modo pulito per gestire questo potrebbe essere un modello di specifica. Avresti un manager dei risultati, che periodicamente interrogherà i tuoi utenti per quelli che corrispondono a una serie di specifiche. La tua classe di conseguimento includerebbe quindi un nome, un logo, un punteggio ecc. Come al solito, e anche una specifica che descriva un utente che ha ottenuto tale risultato. Ad esempio, in C #, il risultato "Share-a-holic" potrebbe essere simile a questo:

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

AchievementManager.AddAchievementType(ShareAHolic);

e quindi nel punto appropriato, il tuo manager dei risultati può fare qualcosa del genere:

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);
    }
}

Il metodo .Award() del manager dei risultati può anche essere chiamato direttamente nel punto appropriato se un risultato può essere rilevato immediatamente. Potresti anche voler aggiungere un metodo per eseguire questi controlli su un utente specifico, in modo che tu possa attivare un controllo dopo eventi importanti per consentire agli utenti di ottenere risultati immediati.

    
risposta data 19.06.2013 - 10:43
fonte

Leggi altre domande sui tag