# Cookie Clicker



## m.s (21. Feb 2014)

Hallo, ich würde gerne CookieClicker programmieren und komme bei dem Timer nicht weiter, wie jeder weiß, der CoockieClicker kennt, werden je nach Upgrade immer automatisch Cookies hinzugefügt und ich hab leider keine Ahnung wie ich das machen soll. Ich hab auch schon vieles ausprobiert.
Kann mir da jemand weiterhelfen?


MfG 


```
package CookieClicker;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.Timer;

public class Frame extends JFrame {
	
	Timer time;
	
	JButton click;
	JLabel display;
	JLabel cookie_rate_label;
	int cookies = 0;
	double cookie_rate = 0.0;
	
	JButton oma;
	int omas;
	int kosten_oma = 10;
	int kosten_oma_übrig;
	
	JButton farm;
	int farms;
	int kosten_farm = 30;
	int kosten_farm_übrig;
	
	public Frame(){
		super("Cookie Clicker");
		
		Icon cookie = new ImageIcon(getClass().getResource("cookie.png"));
		Font font = new Font("Arial",Font.BOLD, 20);
		
		
		click = new JButton(cookie);
		click.setBounds(173,150,250,250);
		click.addActionListener(new CookieHandler());
		add(click);
		
		
		cookie_rate_label = new JLabel("CookiesPerSecond: "+cookie_rate+" Cookies", JLabel.CENTER);
		cookie_rate_label.setBounds(100,50,400,50);
		cookie_rate_label.setFont(font);
		add(cookie_rate_label);
		
	
		display = new JLabel("Cookies: "+cookies, JLabel.CENTER);
		display.setBounds(100,0,400,50);
		display.setFont(font);
		add(display);
		
		oma = new JButton("Oma ("+kosten_oma+" Cookies)");
		oma.addActionListener(new CookieHandler());
		oma.setBounds(20,425,200,50);
		add(oma);
		
		farm = new JButton("Farm ("+kosten_farm+" Cookies)");
		farm.addActionListener(new CookieHandler());
		farm.setBounds(20,500,200,50);
		add(farm);
		
		
		
	}
	public class CookieHandler implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			if(e.getSource() == click){
			cookies++;
			display.setText("Cookies: "+cookies);
			}
			else if(e.getSource() == oma){
			
			if(cookies >= kosten_oma){
			cookies-=kosten_oma;
			cookie_rate+=0.3;
			kosten_oma*=1.2;
			display.setText("Cookies: "+cookies);
			cookie_rate_label.setText("CookiesPerSecond: "+cookie_rate+" Cookies");
			oma.setText("Oma ("+kosten_oma+" Cookies)");
			
			
			}
			else if(cookies < kosten_oma){
				kosten_oma_übrig = kosten_oma - cookies;
				JOptionPane.showMessageDialog(null, "Du benötigst noch " + kosten_oma_übrig + " Cookies, um eine Oma zu kaufen!");
			}
				
			}
			else if(e.getSource() == farm){
				
				if(cookies >= kosten_farm){
					cookies-=kosten_farm;
					cookie_rate+=0.5;
					kosten_farm*=1.2;
					display.setText("Cookies: "+cookies);
					cookie_rate_label.setText("CookiesPerSecond: "+cookie_rate+" Cookies");
					farm.setText("Farm ("+kosten_farm+" Cookies)");
					
				}
				else if(cookies < kosten_farm){
				kosten_farm_übrig = kosten_farm - cookies;
				JOptionPane.showMessageDialog(null, "Du benötigst noch " + kosten_farm_übrig + " Cookies, um eine Farm zu kaufen!");
				}
			}
		}
		
	}

}
```


----------



## Gucky (21. Feb 2014)

Bitte noch mal für Leute, die CookieClicker nicht kennen.


----------



## m.s (21. Feb 2014)

Gucky hat gesagt.:


> Bitte noch mal für Leute, die CookieClicker nicht kennen.



Ich möchte einfach, dass wenn jemand ein Upgrade kauft, dass dann automatisch 0.3 Cookies pro Sekunde zum Score dazugefügt werden, & wenn man nochmal ein Update kauft, dann werden 0.6 Cookies pro Sekunde dazugefügt usw


----------



## Gucky (21. Feb 2014)

Du machst eine Variable, die die Cookies speichert und einen Thread, der pro Sekunde den Wert, der in einer anderen Variable steht dazu addiert. Dieser Wert wird geändert, wenn ein Update gekauft wurde.


----------



## m.s (22. Feb 2014)

Ich kenn mich damit leider nicht aus.. :/


----------



## JavaMeister (22. Feb 2014)

Tja, dann brauchst Du wohl ein Buch oder sowas.

Oder sollen wir den Code für dein Spiel schreiben... Wieviel bezahlst Du dafür?


----------



## m.s (22. Feb 2014)

JavaMeister hat gesagt.:


> Tja, dann brauchst Du wohl ein Buch oder sowas.
> 
> Oder sollen wir den Code für dein Spiel schreiben... Wieviel bezahlst Du dafür?



Nicht gleich so nett. Ich hab das nicht erwartet


----------



## JavaMeister (22. Feb 2014)

Ja und was hast du erwartet?

Gucky hat die korrekte Antwort bereits genannt. 

Da du dich damit nicht auskennst, bringt dir das nix. Was sollen wir machen?


----------



## Gucky (22. Feb 2014)

Du sagtest DAMIT. Da ich zwei Dinge genannt habe und die für einen Neuling relativ kompliziert verknüpft habe wissen wir nicht, was du meinst.

Sag, womit du dich nicht auskennst und wir verschaffen dir Hilfe zur Selbsthilfe. Um einen guten Sprich zu zitieren: "Wir werden dir kein Brot geben. Aber wir werden dir zeigen, wie man Getreide anbaut", sofern du es dir nicht selbst beibringen kannst.


----------



## m.s (22. Feb 2014)

Gucky hat gesagt.:


> Du sagtest DAMIT. Da ich zwei Dinge genannt habe und die für einen Neuling relativ kompliziert verknüpft habe wissen wir nicht, was du meinst.
> 
> Sag, womit du dich nicht auskennst und wir verschaffen dir Hilfe zur Selbsthilfe. Um einen guten Sprich zu zitieren: "Wir werden dir kein Brot geben. Aber wir werden dir zeigen, wie man Getreide anbaut", sofern du es dir nicht selbst beibringen kannst.


Ich würde gerne wissen wie ich in den Code, den ich oben genannt habe, einen Thread einbaue damit, je nach Upgrade die Cookies(ein Long-Wert) erhöht werden, also wenn ich mir eine "Oma" kaufe die 0.25 Cookies pro Sekunde macht sollen auch 0.25 Cookies pro Sekunde dazugezählt werden, wenn ich mir noch eine Oma kaufe dann sollen nochmal 0.25 Cookies dazugezählt werden, sodass am Ende 0.5 pro Sekunde dem User gegeben werden. Und ja das ist eigentlich zurzeit mein Hauptproblem in diesem Projekt :/.


----------



## Gucky (22. Feb 2014)

Du machst eine Variable float cookPerSek = 0. Diese Variable wird mit jedem Kauf von irgendwas entsprechend hochgesetzt. Z. B. in einer Methode kaufeOma().

Der Thread wird als private Klasse innerhalb der Hauptklasse implementiert. Er hat nichts besseres zu tun, als einmal pro Sekunde den Wert, der in cookPerSek steht auf die FLOAT Variable aktAmOfCook zu addieren. Zusätzlich berechnet er die Zeit, die er schlafen muss, um genau auf diese Sekunde zu kommen. Dazu gibt es hier Infos.


----------



## m.s (22. Feb 2014)

```
package CookieClicker;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;


public class Frame extends JFrame implements Runnable {
	


	JButton click;
	JLabel display;
	JLabel cookie_rate_label;
	float cookies = 0;
	double cookie_rate = 0.0;
	float cookPerSek = 0;
	long l = 0;
	
	JButton oma;
	int omas = 0;
	int kosten_oma = 10;
	int kosten_oma_übrig;
	double ertrag_oma = 0;
	
	JButton farm;
	int farms;
	int kosten_farm = 30;
	int kosten_farm_übrig;
	double ertrag_farm = 0;
	
	public Frame(){
		super("Cookie Clicker");
		

		
		Icon cookie = new ImageIcon(getClass().getResource("cookie.png"));
		Font font = new Font("Arial",Font.BOLD, 20);
	
		
		
		click = new JButton(cookie);
		click.setBounds(173,150,250,250);
		click.addActionListener(new CookieHandler());
		add(click);
		
		
		cookie_rate_label = new JLabel(cookie_rate+" per Second", JLabel.CENTER);
		cookie_rate_label.setBounds(100,50,400,50);
		cookie_rate_label.setFont(font);
		add(cookie_rate_label);
		
	
		display = new JLabel("Cookies: "+cookies, JLabel.CENTER);
		display.setBounds(100,0,400,50);
		display.setFont(font);
		add(display);
		
		oma = new JButton("Oma ("+kosten_oma+" Cookies)");
		oma.addActionListener(new CookieHandler());
		oma.setBounds(20,425,200,50);
		oma.setToolTipText("Omas: "+omas+" ; Ertrag: "+ertrag_oma);
		add(oma);
		
		farm = new JButton("Farm ("+kosten_farm+" Cookies)");
		farm.addActionListener(new CookieHandler());
		farm.setToolTipText("Farmen: "+farms+" ; Ertrag: "+ertrag_farm);
		farm.setBounds(20,500,200,50);
		add(farm);
		

		
	}

	
	public class CookieHandler implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			if(e.getSource() == click){
			cookies++;
			display.setText("Cookies: "+cookies);

			}
			else if(e.getSource() == oma){
			
			if(cookies >= kosten_oma){
			cookies-=kosten_oma;
			cookie_rate+=0.25;
			ertrag_oma+=0.25;
			kosten_oma*=1.2;
			omas++;
			display.setText("Cookies: "+cookies);
			oma.setToolTipText("Omas: "+omas+" ; Ertrag: "+ertrag_oma);
			cookie_rate_label.setText(cookie_rate+" per Second");
			oma.setText("Oma ("+kosten_oma+" Cookies)");
			
			
			
			}
			else if(cookies < kosten_oma){
				kosten_oma_übrig = (int) (kosten_oma - cookies);
				JOptionPane.showMessageDialog(null, "Du benötigst noch " + kosten_oma_übrig + " Cookies, um eine Oma zu kaufen!");
			}
				
			}
			else if(e.getSource() == farm){
				
				if(cookies >= kosten_farm){
					cookies-=kosten_farm;
					cookie_rate+=0.5;
					cookPerSek+=0.25;
					ertrag_farm+=0.5;
					kosten_farm*=1.2;
					farms++;
					display.setText("Cookies: "+cookies);
					cookie_rate_label.setText(cookie_rate+" per Second");
					farm.setToolTipText("Farmen: "+farms+" ; Ertrag: "+ertrag_farm);
					farm.setText("Farm ("+kosten_farm+" Cookies)");
					
				}
				else if(cookies < kosten_farm){
				kosten_farm_übrig = (int) (kosten_farm - cookies);
				JOptionPane.showMessageDialog(null, "Du benötigst noch " + kosten_farm_übrig + " Cookies, um eine Farm zu kaufen!");
				}
			}
		}
		
	}


	@Override
	public void run() {
		
		
	}


}
```
So das ist mein Code und unten ist meine run()-Methode. Aber ich weiß leider nicht wie ich den Code schreibe.. Sorry :/
Die Seite hat mir leider nur wenig weitergeholfen, und auf Google/Youtube hab ich auch nichts gefunden

Tut mir leid, kannst du mir vllt bitte helfen


----------



## Gucky (22. Feb 2014)

Ich werde dir kein Brot geben. 

Du machst erst eine private Klasse INNERHALB der Klasse Frame (, die du ganz dringend umbenennen solltest. Eigene Klassen so benennen, wie Klassen aus der API ist nicht gut. Nenn die mal lieber Hauptframe o.ä.).

Diese Klasse nennst du irgendwie extends Thread implements Runnable.

In dieser Klasse tust du das, was ein Thread zum Laufen braucht und was er machen soll. Dazu --> Google --> Threads Java.


----------



## m.s (22. Feb 2014)

Find ich gut dass du mir kein Brot geben willst 
Also hier bin ich stehn geblieben:


```
private class ProSekunde extends Thread implements Runnable{

	@Override
	public void run() {
		for(long i = 0; i < x; i++){
			//...

		}
		
		
	}
	
}
```

Was soll ich für x einsetzten und wo soll ich die Methode run() aufrufen?


----------



## JavaMeister (22. Feb 2014)

Dir fehlen elementare Grundlagen der Java-Sprache.

Vielleicht solltest Du diese erst aneignen?


----------



## m.s (22. Feb 2014)

Ja weil ich Anfänger bin und mir diese Grundlagen durch Programme aneignen möchte


----------



## Gucky (22. Feb 2014)

Warum eine for-Schleife?

Ich mache das immer mit

```
while (!isInterrupted()){
   tuWas();
   tuWasAnderes();
   try{
      sleep(ZAHL);
   } catch(InterruptedException e){
      //tuNix();
   }
}
```

Starten eines Threads gibt es bei Google. Ein Tipp: Es ist so einfach, dass man nicht drauf kommt.


----------



## JavaMeister (22. Feb 2014)

m.s hat gesagt.:


> Ja weil ich Anfänger bin und mir diese Grundlagen durch Programme aneignen möchte



unmöglich.


----------



## m.s (22. Feb 2014)

Ok dann gib mir Tipps


----------



## JavaMeister (22. Feb 2014)

Dir fehlen elementare Grundlagen der Java-Sprache.

Vielleicht solltest Du diese erst aneignen? 

Nimm dir ein Buch und lies.

Schau dir die Grundlagen von threads an. 

Grundlagen von Spielen.

Grundlagen Interprozess Kommunikation.


----------



## m.s (22. Feb 2014)

Ok werd ich machen aber könntest du mir bitte bei meinem derzeitigen Problem weiterhelfen?


----------



## Gucky (22. Feb 2014)

Programmieren lernt man nur durch Programmieren. Du kannst zehn Bücher durchlesen und dann sitzt du davor und kriegst nicht eine Zeile hin. Deshalb sollte man Programme schreiben. Am Besten kleine Programme, in die man schrittweise immer mehr einbauen kann.

Zum Beispiel ein Programm, das die Wurzel einer Zahl berechnet. Da kannst du schon mal mehrere Klassen einbauen. Dann Multithreading, EventHandling, Rekursion, Exceptions usw.

CookieClicker ist vielleicht erst mal zu groß für dich. Oder du versuchst es weiter. Deine Entscheidung.


Guck dir einmal meinen letzten Post an.


----------



## huhn3k (8. Feb 2018)

Ich weiß es ist schon ein bisschen her seit du dein Problem hattest, aber falls du immer noch Interesse daran haben solltest Cookie Clicker zu programmieren, dann schau dir doch einfach mal diese Playlist an.

Schöne Grüße


----------

