# Aktien-Spiel ohne GUI



## MrBig (17. Aug 2011)

Hey Leute,

ich möchte ein sehr kleines Aktien-Spiel realisieren, welches ich nach und nach erweitern möchte.
Zu erst soll es nur die Grundfunktionen können, sprich:
Ich habe einen Anfangsbetrag (Kontostand) mit dem ich dann Aktien kaufen kann. (Wie im wahren Leben) :lol:
Mein Aktienkurs Startet vorerst mal bei 30 und wird dann über eine Zufallszahl aktualisiert.
Aktienindex = aktuellerAktienkurs + Zufallszahl
Hier ist schon mein erstes Problem, denn jedes mal nimmt er den Startet beim errechnen des neuen Indexes. ;(

Und beim kaufen bzw. verkaufen fliegt mir dann das Programm letztendlich um die Ohren :-((
Vielleicht kann mir ja jemand Tips geben, bitte keine Komplettlösungen!!!!! Ich möchte schliesslich verstehen was ich falsch mache, bzw. lernen wie es richtig geht.

Wäre also super, wenn jemand bisschen Lust und Zeit hat mir zu helfen.

In weiter Ferne möchte ich dann das ganze in eine Datei schreieben (Logfile bzw. Spielstände).
Und wenn es gehen sollte noch irgendwie Server Client Verbindung mit einbringen, wie und für was weis ich noch nicht.

Vielen Dank schonmal fürs durchlesen! :rtfm: 





```
import java.io.BufferedReader;
import java.io.IOException;

public class Aktien {
	static int aktuellerKontostand = 10000;
	static int aktuelleAktienanteile = 0;
	int depotWert;
	static int alterKurs = 30;
	static int aktuellerKurs;
	static BufferedReader reader = null;

	/**
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		System.out.println(aktienWachstum());
		System.out.println(aktienIndex());
		if (aktuellerKontostand >= aktuellerKurs) {
			kaufen();
		} else {
			verkaufen();
		}
	}

	private static int aktienIndex() {
		// TODO Auto-generated method stub
		aktuellerKurs = (alterKurs + aktienWachstum());
		return aktuellerKurs;
	}

	private static int aktienWachstum() {
		// TODO Auto-generated method stub
		int min = -10;
		int max = 10;
		int wachstumsrate = (int) (min + Math
				.round(Math.random() * (max - min)));
		return wachstumsrate;
	}

	private static void kaufen() throws IOException {

		boolean inputOk = false;
		int number = 0;
		String input = null;
		while (!inputOk) {
			try {

				System.out.println("Wie viele Anteile möchten Sie kaufen? ");
				input = reader.readLine();
				number = Integer.parseInt(input);
				if (number >= 1) {
					inputOk = true;
					int kosten = (number * aktuellerKurs);
					System.out.println(number + " Aktienanteile kosten"
							+ kosten + "€");
					System.out.println("Jetzt" + number + "Aktienanteile für"
							+ kosten + "kaufen? J/N");
					if (input.equalsIgnoreCase("j")) {
						inputOk = true;
						aktuellerKontostand = (aktuellerKontostand - kosten);
						aktuelleAktienanteile = (aktuelleAktienanteile + number);
						System.out.println("Es wurden" + number
								+ "Aktienanteile für" + kosten + "gekauft!");
					} else if (input.equalsIgnoreCase("no")) {
						inputOk = true;
						System.out
								.println("Es wurden keine Aktienanteile gekauft!");
					} else {
						System.out
								.println("Ihre Eingabe konnte nicht erkannt werden.");
					}
				} else {
					System.out
							.println("Sie können keine negativen Aktienanteile kaufen!");
				}
			} catch (NumberFormatException e) {
				System.out.println("Ihre Eingabe konnte nicht erkannt werden.");
			}
			reader.close();
		}
	}

	private static void verkaufen() throws IOException {

		boolean inputOk = false;
		int number = 0;
		String input = null;
		while (!inputOk) {
			try {

				System.out.println("Wie viele Anteile möchten Sie verkaufen? ");
				input = reader.readLine();
				number = Integer.parseInt(input);
				if (number >= 1) {
					inputOk = true;
					int kosten = (number * aktuellerKurs);
					System.out.println(number + " Aktienanteile bringen"
							+ kosten + "€");
					System.out.println("Jetzt" + number + "Aktienanteile für"
							+ kosten + "verkaufen? J/N");
					if (input.equalsIgnoreCase("j")) {
						inputOk = true;
						aktuellerKontostand = (aktuellerKontostand + kosten);
						aktuelleAktienanteile = (aktuelleAktienanteile - number);
						System.out.println("Es wurden" + number
								+ "Aktienanteile für" + kosten + "verkauft!");
					} else if (input.equalsIgnoreCase("no")) {
						inputOk = true;
						System.out
								.println("Es wurden keine Aktienanteile verkauft!");
					} else {
						System.out
								.println("Ihre Eingabe konnte nicht erkannt werden.");
					}
				} else {
					System.out
							.println("Sie können keine negativen Aktienanteile verkaufen!");
				}
			} catch (NumberFormatException e) {
				System.out.println("Ihre Eingabe konnte nicht erkannt werden.");
			}
			reader.close();
		}
	}

}
```


----------



## Gast2 (17. Aug 2011)

Das nächste mal dann bitte auch die Fehlermeldung posten 


```
static BufferedReader reader = null;
```
dein reader ist null und wird nirgends erstellt, dann bekommst du eine NullPointerException


----------



## c_sidi90 (17. Aug 2011)

UIIIII ein Aktienspiel ???:L meinste denn es lohnt sich da soviel Zeit reinzustecken oder dienst es hauptsächlich dem Übungszweck? Ich kann nur für mich sprechen, aber als wir damals in der Schule ein solches Spiel in RL simuliert hatten, war es schnell langweilig. Vielleicht gelingt es dir ja aus so einem trockenen Titel etwas spaßiges zu erschaffen. 

Ich denke aber, du solltest erstmal anfangen, und dich an uns bzw das Forum wenden, sobald du konkrete Fragen zu deinem Source hast. So ist A der Lerneffekt für dich größer, als wenn du gleich mit mehreren Leuten rumschnipselst und B ist das ja nicht die Hire-Section 

Lg


----------



## MiDniGG (18. Aug 2011)

Außerdem musst Du jedes Mal, wenn Du eine neue Eingabe erwartest die Eingabe wieder lesen.
Mit 
	
	
	
	





```
input = reader.readLine();
```
.

Das ganze static gedöns würde ich nicht machen.
Besser in der main-Methode eine neue Instanz der Klasse erstellen und damit dann arbeiten. Dort würde ich auch den reader initialiseren. Als Hinweise. Du musst irgendwie an die Konsoleneingabe rankommen. Stichwort: System.in

Das reicht denke ich erst mal.


----------



## MrBig (21. Aug 2011)

Cool, schonmal besten Dank für die vielen Tipps.
Womit ich aber immernoch zu kämpfen habe, ist, dass mein Aktienkurs nicht auf dem letzten Kurs aufbaut, sondern immer vom Ausgangswert 30 errechnet wird, dabei soll das z.B. so aussehen:
30-33-39-35-40-42-36-33-31-28-34-38-44- usw. 
und nicht 30-32 30-33 30-28 usw. aussehen.


----------



## Maximix (21. Aug 2011)

Versuch mal die Wachstumsrate mit der variable alter kurs in verbindung zu bringen 
Habe den Code nur schnell überflogen aber irgendwo sollte doch noch ein

```
alterkurs = alterkurs + wachstumsrate
```
o.ä rein.


----------



## MrBig (22. Aug 2011)

Maximix hat gesagt.:


> Versuch mal die Wachstumsrate mit der variable alter kurs in verbindung zu bringen
> Habe den Code nur schnell überflogen aber irgendwo sollte doch noch ein
> 
> ```
> ...



In zeile 28 Habe ich das eigentlich schon drin ???:L


----------



## Fu3L (22. Aug 2011)

Du müsstest aber auch den altenKurs = aktuellenKurs setzen irgendwann 
Denn in Zeile 28 ist es der aktuelleKurs der verändert wird 

```
aktuellerKurs = (alterKurs + aktienWachstum());
```


----------



## tuttle64 (24. Aug 2011)

c_sidi90 hat gesagt.:


> UIIIII ein Aktienspiel ???:L meinste denn es lohnt sich da soviel Zeit reinzustecken oder dienst es hauptsächlich dem Übungszweck? Ich kann nur für mich sprechen, aber als wir damals in der Schule ein solches Spiel in RL simuliert hatten, war es schnell langweilig. Vielleicht gelingt es dir ja aus so einem trockenen Titel etwas spaßiges zu erschaffen.




Es kommt darauf an, wie ein solches Spiel konzipiert wird. Ich habe einmal an einem Unternehmensplanspiel als Simulation teilgenommen und es war irre interessant (und lustig). Ein Börsenspiel könnte analog gestaltet sein: Das Spiel dauert mehrere Tage (Runden), ein Trainer regelt die Einflussfaktoren des Spiels (Konjunktur, Geldmenge, Trends usw.), mehrere Teams spielen gegeneinander etc. Wer mehr über Unternehmensplanspiele erfahren möchte, kann hier weiterlesen: Unternehmensplanspiel ? Wikipedia


----------



## Tomate_Salat (24. Aug 2011)

c_sidi90 hat gesagt.:


> UIIIII ein Aktienspiel ???:L meinste denn es lohnt sich da soviel Zeit reinzustecken


Ja, definitiv! Programmieren lernt man durch Programmieren und der TO steht wohl noch recht weit am Anfang. In diesem Stadium dreht sich alles noch rein um den Lerneffekt. Das Ziel, ein Spiel für die breiten Massen zu entwickeln, ist viel zu hoch gesteckt und eher demotivierend. 



> Ich denke aber, du solltest erstmal anfangen, und dich an uns bzw das Forum wenden, sobald du konkrete Fragen zu deinem Source hast.


Prinzipiell stimme ich dir hier zu. Fragen sollten im Forum möglichst konkret gestellt werden, ansonsten fallen die Antworten meist sehr Allgemein aus. Allerdings ist es auch nicht verkehrt, seinen Source zu posten und die Community darum zu bitten, einmal darüber zu schauen (auch gerade, wenn man [noch] nicht selbst fähig ist, manche Fehler zu entdecken).

@TO: Ich habe das ganze jz nur überflogen, aber dein Programm scheint nach einem durchlauf (kauf oder verkauf) beendet zu sein. Danach startest du es neu und die Werte werden zurückgesetzt. Entweder solltest du die Daten in einer Datei ablegen oder eine Spielschleife einbauen.


----------



## tuttle64 (24. Aug 2011)

Tomate_Salat hat gesagt.:


> ... oder eine Spielschleife einbauen.



richtig. Mit einer kleinen Menueführung wie

1 Kaufen
2 Verkaufen
3 Depotauszug
4 Beenden

wo der Aktionär  selber entscheiden kann, wann er das Spiel beenden will. Vor jedem Kaufen bzw. Verkaufen kann der Simulator aufgerufen werden.


----------



## Logaff (24. Aug 2011)

was evtl lustig wär ne finanz simulation drauss zu machen und zb die Ponzi-Pyramide umzusetzen


----------



## Dit_ (24. Aug 2011)

So kannst du echte AktienKurse downloaden -> Yahoo data download


----------



## MrBig (24. Aug 2011)

So hatte leider die letzten Tage nicht so viel zeit zu schreiben aber ich bin schon ein gutes Stück weiter gekommen. Ich muss jetzt nur noch Fehler abfangen, so dass ich keinen negativen Kontostand und auch keinen negativen Depotwert bekomme. Aber das sollte eigentlich einfach sein.

PS Die Ideen die oben geäussert wurden finde ich sehr interessant und bin am überlegen wie ich das umsetzen kann.!:toll:


hier mal der überarbeitete Code:

```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Aktien {
	static int aktuellerKontostand = 10000;
	static int aktuelleAktienanteile = 0;
	int depotWert;
	static int aktuellerKurs;
	static BufferedReader reader = null;

	/**
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		aktuellerKurs = 30; // Startkurs wird gesetzt
		System.out.println(aktuellerKurs); // Startkurs ausgeben

		int Durchgang = 0;
		while (Durchgang < 20) {

			String eingabe = null;
			BufferedReader bin = new BufferedReader(new InputStreamReader(
					System.in));
			System.out.println("Möchten Sie kaufen(1) oder verkaufen(2)?");
			eingabe = bin.readLine();
			int anzahl = Integer.parseInt(eingabe);
			if (anzahl == 1 && aktuellerKontostand > 0) {
				kaufen();
			}
			if (anzahl == 2 && aktuelleAktienanteile > 0) {
				verkaufen();
			} else {
				if (aktuellerKontostand <= 0) {
					System.out.println("Sie haben leider nicht genügend Geld!");
				}
				if (aktuelleAktienanteile <= 0) {
					System.out
							.println("Sie haben besitzen leider keine Aktien!");
				}
			}
			System.out.println("Durchgang: " + Durchgang);
			System.out.println("Neuer Kurs: " + aktienIndex());
			Durchgang++;
		}
		System.out.println("Spiel beendet!");
	}

	private static int aktienIndex() {
		// TODO Aktueller Aktienkurs wird erneuert
		aktuellerKurs = (aktuellerKurs + aktienWachstum());
		while (aktuellerKurs < 0) {
			aktuellerKurs = 0;
		}
		return aktuellerKurs;
	}

	private static int aktienWachstum() {
		// TODO Aktienwachstum wird berechnet
		int min = -10;
		int max = 10;
		int wachstumsrate = (int) (min + Math
				.round(Math.random() * (max - min)));
		return wachstumsrate;
	}

	private static void kaufen() throws IOException {
		// TODO kaufen von Aktien
		BufferedReader bin = new BufferedReader(
				new InputStreamReader(System.in));
		System.out.println("Wieviele Aktien möchten Sie kaufen?");
		String eingabe = bin.readLine();
		int anzahl = Integer.parseInt(eingabe);
		System.out.println("Sie haben " + anzahl + " Aktien gekauft!");
		aktuelleAktienanteile = (aktuelleAktienanteile + anzahl);
		aktuellerKontostand = (aktuellerKontostand - (anzahl * aktuellerKurs));
		System.out.println("Aktueller Aktienanteil: " + aktuelleAktienanteile);
		System.out.println("Aktueller Kontostand: " + aktuellerKontostand);
	}

	private static void verkaufen() throws IOException {
		// TODO kaufen von Aktien
		BufferedReader bin = new BufferedReader(
				new InputStreamReader(System.in));
		System.out.println("Wieviele Aktien möchten Sie verkaufen?");
		String eingabe = bin.readLine();
		int anzahl = Integer.parseInt(eingabe);
		System.out.println("Sie haben " + anzahl + " Aktien verkauft!");
		aktuelleAktienanteile = (aktuelleAktienanteile - anzahl);
		aktuellerKontostand = (aktuellerKontostand + (anzahl * aktuellerKurs));
		System.out.println("Aktueller Aktienanteil: " + aktuelleAktienanteile);
		System.out.println("Aktueller Kontostand: " + aktuellerKontostand);
	}

}
```


----------



## MrBig (24. Aug 2011)

tuttle64 hat gesagt.:


> richtig. Mit einer kleinen Menueführung wie
> 
> 1 Kaufen
> 2 Verkaufen
> ...




Ich habe es mal auf zwanzig Durchgänge beschränkt.
Hab mich mit Sprungmarken noch nicht so beschäftigt, aber das sind glaub ich dann eher die kleinen Feinheiten, will erstmal dass das Ding was macht und vorallem auch ein bisschen "SWING" :rtfm: reinbekommen. Als nächstes will ich mir den Aktienkursverlauf aufzeichnen lassen und über kaufen und verkaufen Buttens agieren.:autsch:


----------



## tuttle64 (1. Sep 2011)

MrBig hat gesagt.:


> Als nächstes will ich mir den Aktienkursverlauf aufzeichnen lassen und über kaufen und verkaufen Buttens agieren.:autsch:



Soll dieser Aktienkursverlauf auch einen Einfluss auf den künftigen Kurs haben? Falls ja, welchen?


----------



## MrBig (2. Sep 2011)

tuttle64 hat gesagt.:


> Soll dieser Aktienkursverlauf auch einen Einfluss auf den künftigen Kurs haben? Falls ja, welchen?



Also bin jetzt hab ich mir keine Gedanken über eine Abhängigkeit gemacht.
Denke auch, dass das erst dann interessant wird, wenn man es über Netzwerk spielt,
sprich Kauf und Verkaufverhalten Einfluss auf den Aktienindex haben.
Wenn viele Kaufen könnte dann der Aktienkurs steigen und andersrum. :rtfm:


----------



## tuttle64 (2. Sep 2011)

MrBig hat gesagt.:


> Also bin jetzt hab ich mir keine Gedanken über eine Abhängigkeit gemacht.
> Denke auch, dass das erst dann interessant wird, wenn man es über Netzwerk spielt,
> sprich Kauf und Verkaufverhalten Einfluss auf den Aktienindex haben.
> Wenn viele Kaufen könnte dann der Aktienkurs steigen und andersrum. :rtfm:



Hier würde sich ein Auftragsbuch oder auch Orderbook anbieten. Darin werden alle Aufträge gesammelt und der Preis vereinfacht dort festgelegt, wo am meisten Umsatz generiert wird. Hat es also mehr Verkäufer als Käufer sollte der Kurs sinken und umgekehrt steigen. 

Langsam wird es anspruchsvoll und es ist an der Zeit, sich über z.B. das Klassendesign einige Gedanken zu machen.


----------



## MrBig (2. Sep 2011)

tuttle64 hat gesagt.:


> Hier würde sich ein Auftragsbuch oder auch Orderbook anbieten. Darin werden alle Aufträge gesammelt und der Preis vereinfacht dort festgelegt, wo am meisten Umsatz generiert wird. Hat es also mehr Verkäufer als Käufer sollte der Kurs sinken und umgekehrt steigen.
> 
> Langsam wird es anspruchsvoll und es ist an der Zeit, sich über z.B. das Klassendesign einige Gedanken zu machen.




Ich werde jetzt am Wochenende mal bisschen dran feilen und das dann auch ein bisschen aufwerten.
Beim Klassendesign habe ich mit gedacht dass ich -Spieler -Bank -Hilfsmittel und das -Spiel brauche.


----------



## tuttle64 (2. Sep 2011)

MrBig hat gesagt.:


> Ich werde jetzt am Wochenende mal bisschen dran feilen und das dann auch ein bisschen aufwerten.
> Beim Klassendesign habe ich mit gedacht dass ich -Spieler -Bank -Hilfsmittel und das -Spiel brauche.




Sehr gut. Falls Du Unterstützung für ein GUI benötigst, bin ich gerne bereit mitzuhelfen.


----------



## MrBig (16. Sep 2011)

Sorry dass ich mich so lange nicht mehr gemeldet habe, aber ich hatte die letzte Woche meine letzten Klausuren.

Ich würde gerne wissen wie ich ein vortlaufendes Chart zeichenen lassen kann. 
Also sowas in der Art:


----------



## Tomate_Salat (16. Sep 2011)

schau dir mal JFreeChart an


----------



## MrBig (19. Okt 2011)

Hab jetzt mal noch eine andere Frage, wie speicher ich am besten Spielstände in einer Datei?

Ich will z.B. _Spieler-Spielstand1-Spielstand2-Datum_ speichern so in etwa: "Tom-200-10-24.12.2011-22:31:01"
Das reinschreiben in eine Datei klappt, nur wenn ich anderen Spielstand hinzufühen will überschreibt er immer den Letzten.

Und dann hab ich Probleme die Spielstände wieder auszulesen und ims Spiel zu initialisieren.
ich will dem Spieler "Tom" den Kontostand 200 und den Aktienstand 10 zuweisen.
Das Datum will ich als Prüfsumme nutzen um zu prüfen ob der aktuelle Spielstand gesichert wurde. 

Kann mir wer helfen, bitte?

speichern:

```
import java.io.*;

public class SpielstandSichern{

  public static void main (String[] args) throws IOException{
    String text = "Tom-200-10-24.12.2011";
    String dateiName = "Spielstand.txt";
    FileOutputStream schreibeStrom = 
                     new FileOutputStream(dateiName);
    for (int i=0; i < text.length(); i++){
      schreibeStrom.write((byte)text.charAt(i));
    }
    schreibeStrom.close();
    System.out.println("Spielstand gesichert!");
  }
}
```

laden:

```
import java.io.*;

public class SpielstandLaden{

  public static void main (String[] args) throws IOException{
     byte zeichen;
     char buchstabe;
     String text = "";
     String dateiName = "Spielstand.txt";
     FileInputStream leseStrom = new FileInputStream(dateiName);
     do{
       zeichen = (byte)leseStrom.read();
       System.out.print(zeichen+" ");
       text += (char)zeichen;
     } while (zeichen !=-1);
     leseStrom.close();
     System.out.println();
     System.out.println(text);
  }
}
```

der Ursprung meines Codes kommt von edu-online - pohlig


----------



## Tomate_Salat (19. Okt 2011)

mit

```
new FileOutputStream(dateiName,true);
```
schreibt der Stream ans Ende der Datei, ohne irgendetwas zu ersetzen. Schwierig wird es hier, wenn du etwas updaten möchtest. Wäre zwar möglich, aber ich würde dann doch eher zu einer Datenbank greifen. Als Datenbank würde ich H2 nehmen. Kann man schön embedded verwenden.


----------



## MrBig (19. Okt 2011)

Tomate_Salat hat gesagt.:


> mit
> 
> ```
> new FileOutputStream(dateiName,true);
> ...



Macht eine Datenbank das Programm nicht unnötig schwer und komplex????:L


----------



## Gast2 (19. Okt 2011)

Die komplexität wird eher abnehmen als zunehmen. Das ganze Parsing der Files kannst du dir mit ner Datenbank ja sparen.
Und das jar File der H2 DB ist ~1MB groß, also alles im Rahmen.


----------



## MrBig (19. Okt 2011)

EikeB hat gesagt.:


> Die komplexität wird eher abnehmen als zunehmen. Das ganze Parsing der Files kannst du dir mit ner Datenbank ja sparen.
> Und das jar File der H2 DB ist ~1MB groß, also alles im Rahmen.



Ich würde das ganze gerne über ein Hashtable lösen, kann ich das auch?:rtfm:


----------



## Tomate_Salat (19. Okt 2011)

MrBig hat gesagt.:


> Macht eine Datenbank das Programm nicht unnötig schwer und komplex????:L



kurz antwort:nö
lange antwort:
wenn du noch nie mit Datenbanken gearbeitet hast, musst du dich halt da reinarbeiten. Aber letztendlich bietet sie dir genau das, was du wahrscheinlich brauchen wirst: Spielstände hinzufügen, Spielstände updaten, Spielstände Löschen.



MrBig hat gesagt.:


> Ich würde das ganze gerne über ein Hashtable lösen, kann ich das auch?:rtfm:


Das momentane Problem ist ja die persistente Datenhaltung. Wie du das intern händelst ist wieder eine andere Sache.


----------



## MrBig (19. Okt 2011)

Tomate_Salat hat gesagt.:


> Das momentane Problem ist ja die persistente Datenhaltung. Wie du das intern händelst ist wieder eine andere Sache.



Mit SQL habe ich schon gearbeitet, würde mich halt interessieren ob und wie man das auch über eine Hashtabelle lösen könnte.

Vielleicht hat ja jemand einen Ansatz wie ich das angehen könnte.
Hab leider noch nicht mit Hashtabellen gearbeitet, aber denke dass das ein Anfang wäre.

Die Datenbanklösung ist perfekt, wenn ich das dann über Internet Server/Client aufrollen will.
Denn dann können die Verschiedenen Spieler ihre Werte online ablegen.:toll:


----------

