Programm Dorfeinwohner-Fortbildung

Debus

Mitglied
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




Java:
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
 

Anhänge

  • basis140806.zip
    80,4 KB · Aufrufe: 4
Zuletzt bearbeitet von einem Moderator:

njans

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

SlaterB

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

Plastagen

Mitglied
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.

Java:
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.
 
Zuletzt bearbeitet:

Debus

Mitglied
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

Top Contributor
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

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

Java:
dummZahl = weiseZahl = 0;
klugZahl = 1;

oder:

Java:
dummZahl = 0;
weiseZahl = 2;
klugZahl = 1;

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

beastofchaos

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

Java:
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 :p 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

Top Contributor
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 :eek:
 

beastofchaos

Bekanntes Mitglied
haha - ja stimmt. da ist wohl ein Programmfehler :D

(eigentlich richtig:
Java:
dummZahl = max - 1;
weiseZahl = 0;
klugZahl = 1;
)
 

Neue Themen


Oben