# 2. Class macht ärger und einige Variablen



## assault (28. Mrz 2008)

Also folgendes es geht um die hier verlinkte Übung 9.1
http://www.java-wi.de/uebungen/U-09.pdf

Ich hab die jetzt hier verlinkt weil ich mir noch nicht mal wirklich sicher bin ob ich sie überhaupt
richtig verstanden habe.

Sollte ichs aber richtig verstanden haben, dann geht es darum das eich Glücksspiel proggen soll und das Hauptaugenmerk liegt wohl daran das ich in der Auf gabe eine Methoden aus der Main() "auslager" und in eine 2. Class packe 


```
public int geld;
	public int zgz1;
	public int zgz2;
	
public class Spieler 
{

	public int zahlGewinnzuege ( int zgz)
	{
		zgz = zgz +1;
		return zgz;
	}

	public boolean kannspielen (boolean a, double g) 
	{
		if (g >=0){a = true;}
		else {a =  false;}
		
		return a;
		
	}
}		

public class Spiel{
	public void main(String[]args)
	{
		Double g1 = IO.promptAndReadDouble("Bitte Kapital des ersten Spielers eingeben: ");
		Double g2 = IO.promptAndReadDouble("Bitte Kapital des zweiten Spielers eingeben: ");

		String a = IO.promptAndReadString("Bitte Namen des ersten Spielers eingeben: ");
		String b = IO.promptAndReadString("Bitte Namen des zweiten Spielers eingeben: ");

		Double p = IO.promptAndReadDouble("Bitte Wahrscheinlich keit eingeben (Zahl zwischen 0 und 1): ");

		while(g1 > 0 & g2 > 0)
		{
			double z = Math.random();
			if (z <= p){ g1 = g1 + 1; g2 = g2 - 1; zgz1 = Spieler.zahlGewinnzuege(zgz1); }
			else { g1 = g1 - 1; g2 = g2 + 1; zgz2 = Spieler.zahlGewinnzuege(zgz2); }
		}


		if (Spieler.kannspielen(g1) == true ){zgz2 = zgz2/zgz1*100; System.out.println 
		("Spieler" + a + "ist Pleite! Die gewinn " +
				"Quote des 2 Spilers liegt bei: " + zgz2 );}
		else {zgz1 = zgz1/zgz2*100; System.out.println 
		("Spieler" + b + "ist Pleite! Die gewinn " +
				"Quote des 1 Spilers liegt bei: " + zgz1 );}
	}
}
```


ich kenne zwar die Fehler mledungen weiß aber nicht wirklich was ich mit ihnen anfangen soll und ob ich überhaupt richtig "ausgelagert" habe.

einmal verlangt er von mir das ich den Part lösche 


```
public int geld;
	public int zgz1;
	public int zgz2;
```

dann mekert ermir noch was bei dem Part von wegen "method not applicable for the argumnets"


```
if (Spieler.kannspielen(g1) == true )
```

und bei jedem zgz1 und zgz2 
von wegen cannot be resolved


----------



## SlaterB (28. Mrz 2008)

warum verlinkst du die Aufgabe, wenn dir elementare Grundlagen fehlen 

> public int geld; 
>   public int zgz1; 
>   public int zgz2;

Variablendeklarationen dürften nicht wild in der Gegend stehen,
die gehören in eine Klasse

> Spieler.kannspielen(g1)

schau dir doch mal die Deklaration dieser Operation an,
da sind zwei Parameter gefordert, 2 != 1

vom Typ boolean statt Double mal ganz abgesehen..

der boolean-Parameter in der Operation kann sicherlich weg, 
um true oder fals zurückzugeben brauchst du kein a von außen

> zgz1 und zgz2 

die sind ja gar nicht richtig deklariert, und selbst wenn, dann doch wahrscheinlich in der Klasse Spieler,
wie willst du in Spiel in der main einfach so drauf zugreifen?


----------



## assault (28. Mrz 2008)

SlaterB hat gesagt.:
			
		

> warum verlinkst du die Aufgabe, wenn dir elementare Grundlagen fehlen
> 
> > public int geld;
> >   public int zgz1;
> ...




Hi wegen den Variablen, dass stand ja so in der Aufgabe ich soll in der "Class Spieler" die Variablen deklarieren 
(oder ich habs falsch verstanden, da bin ich mir nicht ganz sicher...) und in der main drauf zugreifen. Als es von der Main aus nicht ging dachte ich, ich mache es so wie ich es aus VB her kenne und deklariere sie einfach global ausserhalb jeglicher class .... wusste jetzt nicht das es bei java nicht geht bzw. das es da keine möglichkeit gibt die ausserhalb der class zu deklarieren...

hab jetzt versucht den code nochmal anzupassen
aber jetzt mekert er das ich die "class Spiel" "must be defined in its own file"



```
public class Spieler 
{
	
	public int zahlGewinnzuege ( int zgz)
	{
		zgz = zgz +1;
		return zgz;
	}

	public boolean kannspielen (double g) 
	{
		if (g >=0){return true;}
		else {return false;}
		
		
		
	}
}		

public class Spiel{
	public void main(String[]args)
	{
		public int geld;
		public int zgz1;
		public int zgz2;
		
		
		Double g1 = IO.promptAndReadDouble("Bitte Kapital des ersten Spielers eingeben: ");
		Double g2 = IO.promptAndReadDouble("Bitte Kapital des zweiten Spielers eingeben: ");

		String a = IO.promptAndReadString("Bitte Namen des ersten Spielers eingeben: ");
		String b = IO.promptAndReadString("Bitte Namen des zweiten Spielers eingeben: ");

		Double p = IO.promptAndReadDouble("Bitte Wahrscheinlich keit eingeben (Zahl zwischen 0 und 1): ");

		while(g1 > 0 & g2 > 0)
		{
			double z = Math.random();
			if (z <= p){ g1 = g1 + 1; g2 = g2 - 1; zgz1 = Spieler.zahlGewinnzuege(zgz1); }
			else { g1 = g1 - 1; g2 = g2 + 1; zgz2 = Spieler.zahlGewinnzuege(zgz2); }
		}


		if (Spieler.kannspielen(g1) == true ){zgz2 = zgz2/zgz1*100; System.out.println 
		("Spieler" + a + "ist Pleite! Die gewinn " +
				"Quote des 2 Spilers liegt bei: " + zgz2 );}
		else {zgz1 = zgz1/zgz2*100; System.out.println 
		("Spieler" + b + "ist Pleite! Die gewinn " +
				"Quote des 1 Spilers liegt bei: " + zgz1 );}
	}
}
```


----------



## SlaterB (28. Mrz 2008)

auch das ist eine Java-Grundlage, genau eine public Klasse pro Datei,
am einfachsten immer für jede Klasse eine neue Datei

>  und in der main drauf zugreifen

nun ja, dein Programm hapert an vielen Ecken, da kann man nicht alles erklären, aber zumindest dazu noch:

es ist in der Aufgabe nicht die Rede davon, dass du in der main mit irgendwelchen zgz/1/2 Variablen hantierst,
sondern

> Beim Sieger wird auserdem die Zahl der Gewinnzüge hochgezählt.

->
sieger.duHastEinmalGewonnen(); 
// intern wird dort die Anzahl der Gewinne erhöht,
// die main muss die Variable überhaupt nicht kennen


> Es wird das Verhältnis der Zahl der Gewinnzüge von A zur Zahl der Gewinnzüge von B berechnet und auf zwei Kommastellen ge-rundet ausgegeben.

double quote = a.getAnzahl()/ (double) b.getAnzahl();
// auch hier nie zgz oder ähnliches benötigt


----------



## assault (28. Mrz 2008)

SlaterB hat gesagt.:
			
		

> > Beim Sieger wird auserdem die Zahl der Gewinnzüge hochgezählt.
> 
> ->
> sieger.duHastEinmalGewonnen();
> ...



Hi danke erstmal für den Tip mit der Public, sind sofort paar Fehler weniger. Wusste gar nicht das es nur einmal in der datei geht.
Zum Thema hochzählen, da wüsste ich aber nicht genau wie ich das realisieren soll, weil die gewinnen ja nicht am stück, ich hätte das problem das einfach alle Siege zusammen gezählt werden würden wenn ich nur mit einer Variable hantiere. So wie du mir das erklärt hast (und ich  es verstanden habe) müsste ich dann nicht wenigstens in der mthode in der gezählt wird 2 variablen haben und dort iber ne if anweisung iergendwie differenzieren wer gwonnen hat?


----------



## SlaterB (28. Mrz 2008)

tja, die Antwort daraus ergibt sich aus einem zentralen Konzept der Aufgabe, das du noch nicht berücksichtigt hast:

> Es werden die zwei Spieler-Objekte A und B erzeugt.

zwei Spieler, jeder zählt für sich sich seine Erfolge

> iber ne if anweisung iergendwie differenzieren wer gwonnen hat?

das if muss in der main stehen, um den Spieler auszuwählen, der gewonnen hat


----------



## assault (1. Apr 2008)

bekomms irgendwie nicht hin das es anstendig (/überhaupt) läuft,... und versuch jetzt einfach mal die nächste aufgabe step für step (in der Hoffnung das die leichter ist und ichs hinbekomme, dass sie dann tatsächlich läuft...)


bin jetzt soweit das ich eine methode erstellen soll die mir den wert des bruches ausgiebt aber der makert an der stelle schon das "z (bzw. n) can not be resolved", was mache ich heir schon wieder falsch...???

```
class bruch{
	public int zaehler;
	public int nenner;
		
	
		public bruch(){
			this (1,1);
		}
		public bruch(int z, int n){
			z = zaehler;
			n = nenner;
			
		}
		public void show(double bruchwert){
			bruchwert = z/n;
		}
}
```

Edit:
Ich weiss, die z&n Variablen sind oben nicht deklariert, aber mache ich nicht genau deshalb diese "public bruch" um die Variablen daraus zu übernehemen?

Edit:
Glaube habe die Lösung schon selber gefunden


```
class bruch{
	public int zaehler;
	public int nenner;
		
	
		public bruch(){
			this (1,1);
		}
		public bruch(int z, int n){
			zaehler = z;
			 nenner = n;
			
		}
		public void show(double bruchwert){
			bruchwert = zaehler/nenner;
```

müsste doch jetzt laut aufgabe richtig sein oder?


----------



## SlaterB (1. Apr 2008)

gewöhn dir für alle Zeiten an:
wenn du eine Java-Operation mit einem Parameter wie bruchwert hast,
dann solltest du dem normalerweise nix zuweisen, das bringt doch nix,
vor allem wie soll jemand von außen show aufrufen?

in der Aufgabenstellung steht was von ausgeben, nix von double Variable, strenggenommen kann man da nicht wirklich von richtig sprechen,

int/ int ist übrigens nicht so dolle, teste mal was bei 2/5 rauskommt..


----------



## assault (2. Apr 2008)

SlaterB hat gesagt.:
			
		

> gewöhn dir für alle Zeiten an:
> wenn du eine Java-Operation mit einem Parameter wie bruchwert hast,
> dann solltest du dem normalerweise nix zuweisen, das bringt doch nix,
> vor allem wie soll jemand von außen show aufrufen?
> ...



wegen int stimmt, sehe auch gerade, dass es nicht gehen kann (zumindest werden die ergebnisse nicht stimmen).
wegen der show funktion, müsste ich das dann so ändern?:


```
public void show(){
			double bruchwert;
			bruchwert = zaehler/nenner;
		}
```

normalerweise würrde ich sagen gehört da noch ein "return bruchwert" hin damit ich die Asugabe des wertes hinbekomme, aber ist ja oben ein void drin deshalb meine frage, ginge das trotz des void???


----------



## Quaxli (2. Apr 2008)

Was ist denn dabei rausgekommen als Du es ausprobiert hasst?


----------

