# Programm Dorfeinwohner-Fortbildung



## Debus (16. Jun 2011)

Hallo,

Ich habe eine Source, die ich nicht ganz verstehe.

Folgendes soll geschehen (Schulaufgabe) In einem Dorf leben X Menschen.   Aufgeteilt in dumme, weise und kluge.

Die dummen sollen die Zahl 0 erhalten, die Weisen die 2 und die Klugen die 1.

Wenn sich nun die 0 und die 1 treffen wird die 0 zur 1.
Wenn sich die 1 und die 2 treffen, wird die 1 zur 2
Und auch umgekehrt.

Nun verstehe ich nicht, wo in der Source in dem Array dorf die Zuordnung auf 0,1,2 passiert. Vielleicht kann mir das mal einer erläutern.


Danke





```
package dumme;

import basis.*;

public class Dumme {
	private Fenster fenster;
	private Stift dummStift, klugStift, weiseStift;
	private BeschriftungsFeld titel;
	private Knopf kneu, kende;
	private ZahlenFeld eingabe;
	private int max, dummZahl, klugZahl, weiseZahl, a, b;
	private int[] dorf;
	private int[][] zahl;

	public Dumme() {
		fenster = new Fenster("Die Dummen sterben nicht aus", 400, 200);
		dummStift = new Stift();
		dummStift.setzeFarbe(Farbe.ROT);
		klugStift = new Stift();
		klugStift.setzeFarbe(Farbe.SCHWARZ);
		weiseStift = new Stift();
		weiseStift.setzeFarbe(Farbe.BLAU);
		titel = new BeschriftungsFeld("Die Dummen sterben nicht aus", 115, 20,
				300, 30);

		kende = new Knopf("Ende", 50, 160, 60, 30);
		kneu = new Knopf("Neu", 290, 160, 60, 30);
		eingabe = new ZahlenFeld(160, 160, 90, 30);
		eingabe.setzeSchriftGroesse(20);

		max = 100;
		this.anfangsWerte();
	} // Ende Konstruktor

	private void anfangsWerte() {
		fenster.löscheAlles();
		klugStift.bewegeBis(50, 50);
		klugStift.zeichneRechteck(300, 100);
		dummStift.bewegeBis(50, 150);
		klugStift.bewegeBis(50, 150);
		weiseStift.bewegeBis(50, 150);

		dorf = new int[max];
		zahl = new int[2][10000];
		for (int i = 0; i < max; i++) {
			dorf[i] = 0;
		}
		dorf[Hilfe.zufall(0, max - 1)] = 1;
		dummZahl = weiseZahl = 0;
		klugZahl = 1;
		
	}

	private void ausgabe() {
		if (dummStift.hPosition() < 350) {
			dummStift.bewegeBis(dummStift.hPosition() + 1,
					150 - (dummZahl * 100 / max));
			dummStift.zeichneKreis(1);
			klugStift.bewegeBis(klugStift.hPosition() + 1,
					150 - (klugZahl * 100 / max));
			klugStift.zeichneKreis(1);
			weiseStift.bewegeBis(weiseStift.hPosition() + 1,
					150 - (weiseZahl * 100 / max));
			weiseStift.zeichneKreis(1);
		}
	} // Ende ausgabe

	private void neuStart() {
		max = eingabe.ganzZahl();
		this.anfangsWerte();
	}

	private void treffen() {
		int Zufall1, Zufall2, erster, zweiter;

		Zufall1 = Hilfe.zufall(0, max - 1);
		Zufall2 = Hilfe.zufall(0, max - 1);
		while (Zufall1 == Zufall2) {
			Zufall1 = Hilfe.zufall(0, max - 1);
			}
		erster = dorf[Zufall1];
		zweiter = dorf[Zufall2];
		

		if (erster == 0 && zweiter == 1) {
			erster = 1;
		} else if (erster == 1 && zweiter == 0) {
			zweiter = 1;
		} else if (erster == 2 && zweiter == 1) {
			zweiter = 2;
		} else if (erster == 1 && zweiter == 2) {
			erster = 2;
		} else if (erster == 1 && zweiter == 1) {
			erster = 2;
			zweiter = 2;
		}
		dorf[Zufall1] = erster;
		dorf[Zufall2] = zweiter;
		
		

	} // Ende treffen

	private void zähle() {
		dummZahl = klugZahl = weiseZahl = 0;
		for (int i = 0; i < max; i++) {
			if (dorf[i] == 0) {
				dummZahl = dummZahl + 1;
			} else if (dorf[i] == 1) {
				klugZahl = klugZahl + 1;
			} else if (dorf[i] == 2) {
				weiseZahl = weiseZahl + 1;
				//System.out.println(dummZahl);
				
			}
		}
	} // Ende zähle

	public void gibFrei() {
		fenster.gibFrei();
		dummStift.gibFrei();
		klugStift.gibFrei();
		weiseStift.gibFrei();
		titel.gibFrei();
		kneu.gibFrei();
		kende.gibFrei();
		eingabe.gibFrei();
	} // Ende Destruktor

	public void fuehreAus() {
		int zähler;
		zähler = 0;
		while (!kende.wurdeGedrueckt()) {
			Hilfe.kurzePause();
			this.treffen();
			if (zähler > 50) {
				this.zähle();
				this.ausgabe();
				zähler = 0;
			}
			zähler++;
			if (kneu.wurdeGedrueckt()) {
				neuStart();
			}
		}
		this.gibFrei();
	} // Ende fuehreAus

	public static void main(String[] args) {
		Dumme dumme;
		dumme = new Dumme();
		dumme.fuehreAus();

	}

}
```

Die Basisbibliotheken habe ich mal angehängt.



Sebastian


----------



## njans (16. Jun 2011)

Magst du das vielleicht in einen Java Block schreiben ? 
Bei deinem schließenden JAVA Tag ist am Ende ein e, anstelle eines a's.


----------



## SlaterB (16. Jun 2011)

offensichtlich in Zeile 45-48, wobei am Anfang die meisten nicht so schlau zu sein scheinen


----------



## Plastagen (16. Jun 2011)

Wie SlaterB schon sagt, findet die Zuweisung in zeile 45-48 statt.

Allerdings ist mir auch aufgefallen, dass die dummeZahl mit 0 initialisiert wird, wobei sie jedoch offensichtlich "max-1" beträgt.


```
for (int i = 0; i < max; i++) {
      dorf[i] = 0;
}
dorf[Hilfe.zufall(0, max - 1)] = 1;
```

Hier wird erst initial das gesamte Array mit 0 initialisiert. 
Anschließend wird noch ein zufälliger Index auf 1 gesetzt.


----------



## Debus (16. Jun 2011)

Danke erstmal für die schnellen Antworten,

Leider ist mir immer noch nicht ganz klar wie in dem Array den Zufallszahlen zugeorndet wird, ob Sie 0,1 oder 2 sind

Sebastian


----------



## njans (16. Jun 2011)

Am Anfang ist das ganze Dorf dumm, bis auf einen zufällig ausgewählten.

Wenn treffen() aufgerufen wird, dann werden 2 zufällige Personen genommen und es wird mit denen so verfahren, wie du es am Anfang beschrieben hattest


----------



## Debus (16. Jun 2011)

Okay, das verstehe ich.
Hab aber was ausprobiert und es macht keinen Unterschied, ob ich nun schreibe:


```
dummZahl = weiseZahl = 0;
klugZahl = 1;
```

oder:


```
dummZahl = 0;
weiseZahl = 2;
klugZahl = 1;
```

Oder werden dort die 0en, 1en und 2en nicht festgelegt?


----------



## SlaterB (16. Jun 2011)

diese Variablen werden zur Zählung der Bürgerklassen verwendet..


----------



## beastofchaos (16. Jun 2011)

Auch wenn sie nur in "anfangsWerte()" und "treffen()" benutzt werden, würde ich diese Wissenstandszahlen zu Konstanten machen. Also: 


```
private final int DUMM = 0;
private final int KLUG = 1;
private final int WEISE = 2;
```

So, würde du auch schnell die Zuweisung und die Veränderung sehen  Aber du sollst die Klasse ja warsch. nicht verändern, sondern nur verstehen, oder?

Und SlaterB hat schon recht, dass das nur zum Zählen, der unterschiedlichen Menschen benutzt wird (siehe "zähle()", wo das aus dem Array ausgelesen wird) - durch deine Änderung ist dann 1 Kluger mehr da bzw. 1 Kluger und 2 Weise 

Gruß, Thomas


----------



## njans (16. Jun 2011)

Der Code ist recht komisch:
dummZahl, weiseZahl, klugZahl sind nur Zähler, die angeben, wie viele Personen des jeweiligen Bildungsgrades existieren.
Mitgezählt wird aber nicht. Stattdessen wird bei zaehlen() bei jeder Person geschaut und dementsprechend der wert einer, der drei Variablen erhöht. Zeile  49 und 50 sind sinnlos


----------



## SlaterB (16. Jun 2011)

njans hat gesagt.:


> Zeile  49 und 50 sind sinnlos


nicht unbedingt, das ist das korrekte Zählergebnis für die Anfangssituation  , 
wirklich nachgezählt wird erst später, vorher anscheinend schon benötigt


----------



## njans (16. Jun 2011)

Eigentlich ist das nicht korrekt, denn die Anzahl an dummenLeuten ist ja nicht null sondern max-1


----------



## beastofchaos (16. Jun 2011)

haha - ja stimmt. da ist wohl ein Programmfehler 

(eigentlich richtig:

```
dummZahl = max - 1;
weiseZahl = 0;
klugZahl = 1;
```
)


----------



## Debus (16. Jun 2011)

Danke, werde den Lehrer nochmal drauf ansprechen

Sebastian


----------



## beastofchaos (17. Jun 2011)

Kriegste ne gute Note


----------

