Apps für Android programmieren leicht gemacht!
täglicher bonus

Täglicher Bonus

Als erstes sollte ich an dieser Stelle einmal aufklären worum es sich hierbei handeln soll.
Ich denke mal dieser Titel könnte unter Umständen für ein wenig Verwirrung gesorgt haben oder sorgen.

Deshalb:
Ich möchte euch in diesem Artikel gerne die Chance geben einen sogenannten „Täglichen Bonus“ in eure Spiele einzubauen.
In vielen Spielen findet man bereits jetzt einen Hinweis wie „Täglicher Bonus“ oder ähnliches, um den Spieler dazu zu ermuntern häufiger mal in einem Spiel vorbeizuschauen.

Wir wollen uns in diesem Artikel damit beschäftigen, wie wir einen solchen täglichen Bonus umsetzen können. So schwer scheint es ja immerhin nicht zu sein, oder doch?

Grundüberlegung:

Nachdem wir uns nun mit der Materie und dem Sinn hinter einem Bonus beschäftigt haben sollten wir uns überlegen wie wir eben diesen umsetzen möchten.
Dabei gibt es im Grundprinzip zwei einfache Vorgehensweisen.
Die erste wäre, dass der tägliche Bonus immer ab 0 Uhr einmalig zu holen ist (Variante A) oder eben dass man nach dem Abholen des Bonus 24 Stunden warten muss (Variante B).
Hat man nach dem zweiten Prinzip also am 15. um 10 Uhr seinen Bonus abgeholt, dann kann man seinen nächsten Bonus erst am 16. um 10 Uhr abholen  (Variante A).
Nach dem ersten Prinzip reicht der 16. als Tag selber (Variante B).

Wir werden im Sinne dieses Artikels einfach beide Varianten einmal programmieren.

Variante A:

Variante A ist etwas leichter zu programmieren. Wir gehen dabei davon aus, dass ein Spieler sich seinen Bonus jeden Tag ab 0 Uhr abholen kann, ohne zu berücksichtigen wann dieser seinen Bonus am vergangenen Tage abgeholt hatte.
In dieser Variante müssen wir uns also lediglich einen Tag speichern, an dem der letzte Bonus eingeholt wurde und prüfen ob wir uns in einem anderen Tag befinden.

Um zu speichern an welchem Tag der letzte Bonus vergeben wurde nutzen wir die Klasse SharedPreferences, die wir bereits in einem anderen Artikel angesprochen hatten und werden nun nicht mehr genauer darauf eingehen.

Um zu beginnen benötigen wir eine Funktion, die einen täglichen Bonus vergibt oder eben nicht. Wir nennen sie Bonus.

//Wird beim Start der App automatisch ausgeführt
public void onCreate(){
   Bonus(); //vergebe den Bonus bei jedem Start der App
}

//Die eigentliche Funktion
public void Bonus(){
   //Hier wird berechnet, ob ein Bonus vergeben wird
}

 

Wie bereits angekündigt nutzen wir SharedPreferences, um zu speichern, wann der Bonus das letzte mal vergeben wurde.
Das würde wie folgt aussehen:

//zum speichern des Bonus
SharedPreferences pref;
SharedPreferences.Editor editor;

//Wird beim Start der App automatisch ausgeführt
public void onCreate(){

    //shared data vorbereiten
    pref = getSharedPreferences("DerNameEurerApp", 0);
    editor = pref.edit();

   Bonus(); //vergebe den Bonus bei jedem Start der App
}

//Die eigentliche Funktion
public void Bonus(){
   //Hier wird berechnet, ob ein Bonus vergeben wird
}

Anschießend müssen wir nun noch einen Wert für den letzten vergebenen Bonus setzten.
Ich bevorzuge es einfach den Tag und den Monat des letzten Bonusses zu speichern. Dies hat den Vorteil, dass die App nicht nur zwischen verschiedenen Tagen, sondern auch zwischen verschiedenen Monaten unterscheiden kann.
Im Klartext heißt das: Wenn wir nur den Tag speichern und darauf prüfen könnte ein Nutzer am 1. Januar einen Bonus bekommen, wenn er als nächstes aber am 1. Februar spielt bekommt er keinen Bonus, da wir nur die „1“ des Tages speichern. Somit speichern wir Tag und Monat, dass der Spieler genau am gleichen Tag ein Jahr später wieder weiterspielt ist unwahrscheinlich.

Der fertige Code sieht dann wie folgt aus:

//zum speichern des Bonus
SharedPreferences pref;
SharedPreferences.Editor editor;

//Wird beim Start der App automatisch ausgeführt
public void onCreate(){

    //shared data vorbereiten
    pref = getSharedPreferences("DerNameEurerApp", 0);
    editor = pref.edit();

   Bonus(); //vergebe den Bonus bei jedem Start der App
}

//Die eigentliche Funktion
public void Bonus(){

   //calender wird benötigt, um den Monat und den Tag bestimmen zu können
   Calendar calender = Calendar.getInstance();
   int Tag = calender.get(Calendar.DAY_OF_MONTH);
   int Monat = calender.get(Calendar. MONTH);
   String TagUndMonat = Tag + "." + Monat;

   if(pref.getString("LetzterBonus", "KeinWertGesetzt").equals(TagUndMonat)){
      //Der letzte Bonus ist heute gewesen
   }else{
      //Es kann ein Bonus vergeben werden
   }
   
   //Momentanen Tag und Monat setzten
   editor.putString("LetzterBonus", TagUndMonat);
   editor.commit();
}

 

Variante B:

Die Variante B hat es etwas mehr in sich, aber auch nur etwas.
Auch dieser Algorithmus stellt für uns keinen Hals und Beinbruch dar.
Dieses mal speichern wir eine sogenannte UNIX Zeit. Diese UNIX ist die Zeit in Sekunden seit dem 1. Januar 1970 00:00 Uhr UTC. Damit können wir ohne Probleme feststellen ob die Zeit in Sekunden um einen Tag fortgeschritten ist oder eben nicht.

Ein Tag hat ganze 86400 Sekunden, da:
60 Sekunden * 60 Minuten * 24 Stunden = 86400

Ist der letzte Bonus also in der Schlussfolgerung länger als 86400 Sekunden her, ist ein Tag vergangen und ein weiterer Bonus kann vergeben werden.
Gespeichert wird weiterhin mit der Klasse SharedPreferences.

Wie folgt wurde diese Überlegung von mir implementiert:

//zum speichern des Bonus
SharedPreferences pref;
SharedPreferences.Editor editor;

//Wird beim Start der App automatisch ausgeführt
public void onCreate(){

    //shared data vorbereiten
    pref = getSharedPreferences("DerNameEurerApp", 0);
    editor = pref.edit();

   Bonus(); //vergebe den Bonus bei jedem Start der App
}

//Die eigentliche Funktion
public void Bonus(){

   //Dies ist die UNIX Zeit. Wir teilen sie durch Tausend, da wir Millisekunden vom System bekommen und Sekunden haben möchten.
   int Unix = (int) (System.currentTimeMillis() / 1000L);

   if(pref.getInt("LetzterBonus", 0) + 86400 > Unix){
      //Der letzte Bonus ist heute gewesen
   }else{
      //Es kann ein Bonus vergeben werden
   }
   
   //Momentanen Unix setzten
   editor.putInt("LetzterBonus", Unix);
   editor.commit();
}

Marvin

Ich bin 23 Jahre jung und studiere zurzeit Wirtschaftsinformatik an der Georg-August-Universität in Göttingen. Ich bin ein Mensch, der sich neben der Programmierung noch für tausend andere Dinge interessiert, die mal mehr und mal weniger verrückt sind. Vor allem aber bin ich Feuer und Flamme mit der Programmierung von eigenen kleinen Apps und Programmen, die mein Leben bereichern.

Kommentar hinzufügen

*Pflichtfeld