Come rilevare i risultati nei giochi?


10

Ho erroneamente pubblicato questo su StackOverflow e ora pubblicando qui sulla base di un suggerimento su quel sito ...

Questa è una domanda concettuale di altissimo livello. Di 'in un'applicazione software che ho 4 diverse azioni, ad esempio: Upload, Share, Comment e like

E voglio dare badge di successo agli utenti come:

  • Rookie: carica i tuoi primi 5 file
  • Carica drogato: carica 20 file in 1 giorno
  • Night Crawler: carica un file dopo mezzanotte
  • Share-a-holic: condividi 10 file diversi
  • Mi piace tutto: come 20 file diversi

hai avuto l'idea. Qual è il modo migliore per verificare e vedere se un utente ha raggiunto un determinato risultato senza dover compilare la logica per il raggiungimento nel mio codice? E .. - Mantieni la possibilità di aggiungere nuovi risultati dopo la compilazione (xml o db) - I risultati devono tenere traccia di azioni specifiche, numero di volte e criteri aggiuntivi (come l'ora del giorno) - Il rilevamento dovrebbe essere quasi in tempo reale, quindi l'utente ha notificato quasi istantaneamente quando un risultato è completato

La mia più grande domanda è: come posso rilevare questi risultati raggiunti? Devo:

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

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

Grazie


Hai già progettato o realizzato il sistema di risultati e vuoi solo sapere come usarlo nel gioco?
Harrison Brock,

Risposte:


6

Quello che fai generalmente è avere un sistema di "realizzazione". Ogni azione che accade chiama il sistema di realizzazione e dice "hey questa cosa è appena accaduta".

Il sistema di conseguimento è quindi di solito un insieme di regole, generalmente costituito da una semplice logica combinatoria e contatori per vari "eventi". È quindi responsabilità del sistema di risultati per l'allenamento, con l'aiuto delle regole e dei contatori, delle puntate avvenute e dei risultati da distribuire.

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 richiedono combinazioni di "cose" che possono accadere in sistemi / tempi / ecc. completamente diversi e diffondere la logica per questo intorno alla base di codice comporterebbe grandi quantità di complessità non necessaria.

Il modo in cui l'ho fatto in passato è usare un sistema di regole tramite script (dove script è un termine molto lento, di solito solo una sorta di comparatore basato sui dati). Quindi puoi dire qualcosa di simile a:

  • Quando "l'utente preme qualcosa" accade "incrementare" la variabile "premuto".

Quindi potresti avere un'altra regola che è

  • Quando la variabile "premuto" è "maggiore" di "un certo valore" distribuisci risultati "blah"

O forse

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

Al sistema dei risultati verrà inoltre assegnato il compito di mantenere lo stato di cui i risultati sono già stati distribuiti, in modo da non ottenere duplicati.


0

Un modo pulito per gestire questo potrebbe essere un modello di specifica. Avresti un manager di successo, che periodicamente interrogherebbe i tuoi utenti per quelli che corrispondono a una serie di specifiche. La tua classe di risultati dovrebbe quindi includere normalmente un nome, un logo, un punteggio, ecc. E anche una specifica che descriva un utente che ha ottenuto tale risultato. Ad esempio, in C #, il risultato "Condividi-un-holic" potrebbe apparire così:

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 poi, nel momento opportuno, il tuo manager 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 .Award()metodo del tuo responsabile 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 da poter attivare un controllo dopo eventi importanti per consentire agli utenti di ottenere immediatamente risultati.


Il partizionamento dei risultati diventa rapidamente importante, AchType ha bisogno di una proprietà 'sope' che possa aiutare DB.Users.Where () per evitare risultati non correlati, quando possibile. Quindi, se il risultato della condivisione file può essere assegnato solo in PvP, cerca solo PvP. Mentre qualcosa di generico come il saccheggio potrebbe essere fattibile a livello globale e non avrebbe un tale scopo.
hpavc,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.