Apps für Android programmieren leicht gemacht!
4.3 Kaffee Clicker

4.3 Kaffee Clicker

Weiter geht es mit unserer Artikelreihe „Mit Anleitungen und Open Source zur eigenen Android App“.
Dieses mal beschäftigen wir uns mit dem dritten Artikel unserer ersten eigenen App, welche wir feierlich „Kaffee Clicker“ getauft haben. In Anlehnung an die vielen Kaffee, die bei unserem ersten Projekt getrunken werden.

Im letzten Artikel (4.2 Kaffee Clicker) haben wir ja bereits die ersten Grundfunktionen zu unserer App hinzugefügt.
Wie ihr euch erinnern könnt, können wir nun auf den Kaffeebecher klicken, um Kaffee zu verkaufen und unserem Geldbeutel etwas von dem Gewinn hinzu zu fügen.
In diesem Artikel möchten wir uns gerne der weiteren Spielmechanik frönen und die weiteren ungenutzten Bilder mit Leben füllen.

 

Shops:

Ich habe mir gedacht, dass wir als erstes damit beginnen könnten neue Shops kaufbar zu machen.
Konkret stelle ich mir unter den Shops vor, dass wir für jeden neu gekauften Shop auch um so mehr Kaffee verkaufen. Besitzen wir also nun 3 Shops verkaufen wir pro Klick auf den Kaffeebecher gleich 4 Kaffee. Einen Kaffee für jeden Klick + 3 verkaufte Kaffee in unseren weiteren Shops.

Dazu müssen wir zu Beginn damit anfangen wieder einmal zu programmieren, dass wir auf Klicks reagieren können. Diesen Vorgang habe ich bereits im vorigen Kapitel 4.2 erläutert.
Wir schreiben also unter unseren bestehenden onClickListener, aber innerhalb von „onCreate“:

shopsBild.setOnClickListener(new View.OnClickListener() {
    //Wird aufgerufen, wenn wir das ImageView anklicken
    @Override
    public void onClick(View view) {
        //Wird aufgerufen, wenn "onClick" aufgerufen wird.
        kaufeShop();
    }
});

Schon ist es uns möglich auf den Klick vom Shop-Bild zu reagieren.
Bisher fehlt jedoch noch die Methode „kaufeShop()“, welche beim Klick ausgeführt wird und die Spielmechanik des Kaufens enthält.

Wir müssen diese Methode also schreiben.
Dabei hatten wir bereits in Kapitel 4. Erste App geklärt, dass der Kauf von Shops immer teurer werden soll, je nachdem wie viele Shops wir bereits besitzen.
Also müssen wir auslesen wie viele Shops bereits in unserem Besitz sind, den Preis für den neuen Shop berechnen und prüfen, ob man genug Geld besitzt.
Falls wir nicht genug Geld besitzen sollte idealerweise eine Meldung ausgegeben werden.

Ich dachte mir ein Shop kostet anfangs 1000€, anschließend 2000€, danach 4000€, usw.
Eine geeignete Berechnung wäre 2(Anzahl der Shops) * 1000.

Als Beispiel:
1.    2⁰ * 1000 = 1000
2.    2¹ * 1000 = 2000
3.    2² * 1000 = 4000

Die zugehörige Java Funktion lautet „Math.pow([Erste Zahl],[Zweite Zahl])“.
Hier die Grundmethode „kaufeShop()“:

public void kaufeShop(){
    //Preis für einen Shop berechnen
    int preis = (int) Math.pow(2, shops) * 1000;
    
    //Prüfen, ob der Spieler genug Geld besitzt
    if(geld >= preis){
        //Der Spieler besitzt mehr oder genau so viel Geld, wie benötigt
        
    }else{
        //Der Spieler besitzt weniger Geld, als benötigt
        
    }
}

 

Nun gilt es den Shop zu kaufen, die Geldbörse zu erleichtern und die Geldanzeige zu verändern, andernfalls allerdings eine Fehlermeldung auszugeben.
Mit folgendem Code verringern wir unser Geld, erhöhen die Anzahl der Shops um +1 und ändern die Geldanzeige:

//Unser neues Geld besteht aus unserem Geld - dem Preis für einen neuen Shop
geld = geld - preis;

//Anzahl der Shops um 1 erhöhen
shops++;
            
//Ändere die Textausgabe
geldAnzeige.setText("Geld: " + geld + "€");

Letztendlich bedarf es noch einem Code, für die Meldung, dass der Spieler über nicht ausreichende finanzielle Mittel verfügt.
Dazu bedienen wir uns einer Funktion von Android. Dem Toast.
Nein, dass ist nicht unser Frühstück 😛
Ich denke mal jeder kennt die kleine Meldung am unteren Bildschirmrand, wenn sich das Smartphone mit einem WLAN-Netzwerk verbindet? – Hierbei handelt es sich um ein Toast.

//Meldug mittels Toast ausgeben
Toast.makeText(this, preis + "€ sind nötig.", Toast.LENGTH_SHORT).show();

 

 

Recycling:

Mit Hilfe des Shop-Bildes können wir uns neue Shops kaufen, um pro Klick mehr Kaffee verkaufen zu können.
Unter dem Recycling-Bild habe ich mir vorgestellt, dass wir nicht die Anzahl der Verkäufe pro Klick ändern, sondern den Gewinn pro verkauftem Kaffee.
Sei es durch das Verkaufen vom Altpapier der benutzen Kaffeebecher oder ähnlichem. Ist ja auch egal – Wir verdienen einfach mehr pro Klick 😉

Da das Entwickeln von neuen Recyclingmethode aber weniger kostet als einen neuen Shop zu kaufen benötigen wir lediglich 50€ für die erste Stufe, 100€ für die zweite, 200€ für die dritte, usw.

Ich schreibe nun den Code in Gänze, da wir Analog zu den Shops vorgehen.
Unterhalb unserer bestehenden onClickListener, aber innerhalb von „onCreate“:

recyclingBild.setOnClickListener(new View.OnClickListener() {
    //Wird aufgerufen, wenn wir das ImageView anklicken
    @Override
    public void onClick(View view) {
        //Wird aufgerufen, wenn "onClick" aufgerufen wird.
        kaufeRecycling();
    }
});
public void kaufeRecycling(){
    //Preis für eine neue Recyclingstufe berechnen
    int preis = (int) Math.pow(2, recycling) * 50;

    //Prüfen, ob der Spieler genug Geld besitzt
    if(geld >= preis){
        //Der Spieler besitzt mehr oder genau so viel Geld, wie benötigt
        //Unser neues Geld besteht aus unserem Geld - dem Preis für eine neue Stufe
        geld = geld - preis;

        //Anzahl der Shops um 1 erhöhen
        recycling++;

        //Ändere die Textausgabe
        geldAnzeige.setText("Geld: " + geld + "€");
    }else{
        //Der Spieler besitzt weniger Geld, als benötigt

        //Meldug mittels Toast ausgeben
        Toast.makeText(this, preis + "€ sind nötig.", Toast.LENGTH_SHORT).show();
    }
}

 

 

Rabatt:

Ähnlich gehen wir hier vor.
Mit Hilfe des Rabatts können wir die Verkaufszahlen pro Kaffee erhöhen, aber senken ein wenig den Preis pro verkauftem Kaffee.
Wir ändern den Preis aber nur so stark, dass wir weiterhin mehr Gewinn machen.
Am besten gewähren wir pro Stufe 1% Rabatt, aber zwingen unsere Kunden pro Stufe 1 Kaffee mehr zu kaufen.
Bevor wir jedoch den Kauf einer neuen Rabattstufe zustimmen, wird geprüft, wie viele Rabatte bereits genehmigt wurden.
Wenn wir nämlich 100 mal einen Rabatt von 1% genehmigen würden, dann würden wir unseren Kaffee verschenken. Wir deckeln also auf 10% Rabatt.

Unterhalb unserer bestehenden onClickListener, aber innerhalb von „onCreate“:

rabattBild.setOnClickListener(new View.OnClickListener() {
    //Wird aufgerufen, wenn wir das ImageView anklicken
    @Override
    public void onClick(View view) {
        //Wird aufgerufen, wenn "onClick" aufgerufen wird.
        kaufeRabatt();
    }
});
public void kaufeRabatt(){

    //Prüfen, wie oft der Rabatt bereits gekauft wurde
    if(10 >= rabatt) {
        //Es wurden bisher weniger als 10% Rabatt erteilt

        //Preis für eine Rabattstufe berechnen
        int preis = (int) Math.pow(2, rabatt) * 10;

        //Prüfen, ob der Spieler genug Geld besitzt
        if (geld >= preis) {
            //Der Spieler besitzt mehr oder genau so viel Geld, wie benötigt
            //Unser neues Geld besteht aus unserem Geld - dem Preis für eine neue Stufe
            geld = geld - preis;

            //Anzahl der Shops um 1 erhöhen
            rabatt++;

            //Ändere die Textausgabe
            geldAnzeige.setText("Geld: " + geld + "€");
        } else {
            //Der Spieler besitzt weniger Geld, als benötigt

            //Meldug mittels Toast ausgeben
            Toast.makeText(this, preis + "€ sind nötig.", Toast.LENGTH_SHORT).show();
        }
    }else{
        //Es wurden bereits 10% Rabatt erteilt

        //Meldug mittels Toast ausgeben
        Toast.makeText(this, "Es wurden bereits 10% Rabatt erteilt.", Toast.LENGTH_SHORT).show();
    }
}

 

 

verkaufeKaffee() ändern:

Uff, da haben wir ja schon so Einiges geschafft in diesem Artikel. Leider sind wir noch nicht fertig, warum wirst du dich sicherlich fragen.
Für die Antwort müssen wir etwas zurückblicken.
Wir haben es bisher ganz gut gemeistert neue Verbesserungen für unsere App kaufen zu können. Wir können nun auf alle nötigen Klicks reagieren, wir können den Preis für eine Verbesserung berechnen, wir können Meldungen ausgeben und letztendlich können wir auch mit Käufen umgehen.
Was bis dato fehlt, ist die Einbindung der Verbesserungen in die Berechnung des Gewinns. Wenn ihr die App nun nämlich compilieren und auf eurem Smartphone ausführen würdet, dann würden wir pro Klick nach wie vor nur 0,1€ verdienen.

Schade eigentlich, nach unserer ganzen Arbeit.
Aus diesem Grund habe ich hier nachfolgend ein paar Änderungen an der Methode „verkaufeKaffee()“ vorgenommen:

public void verkaufeKaffee(){
    //Übernehme die globale Variable "gewinn" als lokale Variable, um kurzzeitig Berechnungen durchführen zu können, ohne die Variable "gewinn" für die gesamte App ändern zu müssen
    float gewinn = this.gewinn;
    
    //Maximiere den Gewinn, durch die Stufe des Recyclings (0,001€ mehr Gewinn pro Stufe)
    gewinn = gewinn + (recycling * 0.001F);
    
    //Verkaufe mehr, durch die Genehmigung von Rabatten, sofern es überhaupt Rabatt gibt (pro Rabattstufe einen verkauften Kaffee mehr, aber auch 1% pro Rabattstufe) (einfache Prozentrechnung)
    if(rabatt > 1) {
        gewinn = (gewinn * (rabatt + 1)) * (1 - (rabatt * 0.01F));
    }
    
    //Verkaufe mehr, durch die Anzahl der erworbenen Shops (1 verkaufter Kaffee + Anzahl der Shops)
    gewinn = gewinn + (gewinn * shops);
    
    //Unser neues Geld besteht aus unserem Geld + unserem Gewinn pro Kaffee
    geld = geld + gewinn;
    
    //Ändere die Textausgabe
    geldAnzeige.setText("Geld: " + geld + "€");
}

 

Und schon passt sich unser Gewinn pro Klick und pro jeweiliger Verbesserungsstufe dynamisch an.
Klasse oder ? – Probiert es einfach aus und tüftelt was das Zeug hält.
Ich werde übrigens am Ende des 4. Kapitels den kompletten Source Code der App zum Download anbieten, bis dahin viel Erfolg.

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