Modellierung einer virtuellen Stadt

Für die folgenden Programmbeispiele wird BlueJ benutzt. BlueJ ist eine integrierte Entwicklungsumgebung für Java, die speziell für Ausbildungszwecke konzipiert wurde. Insbesondere das Vermitteln von Zusammenhängen in der objektorientierten Programmierung steht im Mittelpunkt des Systems. Nach der Installation des Programmes benötigen wir noch die Basisbibliothek basisSwing130203UTF8.jar. Diese befindet sich in dem Programmpaket, dass im Link angegeben ist. In den entpakten Dateien befinden sich alle Materialien, die in der EF im Unterricht benötigt werden. Als Programm kommt hier jedoch der JavaEditor zum Einsatz. Ich weiche zum Teil von den Beispielen ab und greife auch auf das Material aus "Von Stiften und Mäusen" zurück. Letztere benutzt eine etwas andere Klassenbibliothek.

 

Die Klasse Fenster

Mit Hilfe der Klasse Fenster können Ausgaben auf dem Computerbildschirm angezeigt werden. Die Größe des Fensters ist frei wählbar und wird nur durch die Anzeigekapazität des vorhandenen Monitors begrenzt. Auf ihm kann mit
Stiften gezeichnet werden. Zu diesem Zweck ist die Zeichenebene auf dem Bildschirm mit einem Koordinatensystem versehen, dessen Ursprung sich in der oberen linken Ecke der Zeichenebene befindet und dessen Achsen horizontal nach rechts und vertikal nach unten gerichtet sind. Die Einheit ist ein Pixel.

Die zur Basisklasse gehörende Dokumentation gibt Auskunft darüber, mit welcher Befehlsfolge die Konstruktoren und Methoden aufgerufen werden. Da ich nicht auf alle Programmierdetails eingehe, empfehle ich, sich die beiden oben genannten Dokumentationen auszudrucken.

Beginnen wir mit einem einfachen Beispiel. Auf dem Monitor soll ein Fenster der Breite 400 und der Höhe 200, welches einigermaßen mittig auf dem Computerdisplay  dargestellt wird, mit blauer Hintergrundfarbe erzeugt werden.

import basis.*;

public class aufgabe
{
// Instanzvariablen
Fenster Bildschirm;

//Konstruktor für Objekte der Klasse Fenster
public aufgabe()
{
// Instanzvariable initialisieren
Bildschirm = new Fenster(600,400);
}

//Methoden
public void fuehreAus() {
// tragen Sie hier den Code ein
Bildschirm.setzePosition(690,400);
Bildschirm.setzeHintergrundFarbe(Farbe.BLAU);
}
}

Die Klasse Farbe stellt folgende Farben zur Verfügung (bitte auf die Gr0ßschreibung achten!): BLAU, CYAN,DUNKELGRAU,DURCHSICHTIG, GELB, GRAU, GRUEN, GRÜN, HELLGRAU, MAGENTA, ORANGE, PINK, ROT, SCHWARZ und WEISS. Andere Farben lassen sich über den Farbbefehl Farbe.rgb(r,g,b) auswählen. r, g und b können Werte zwischen 0 und 255 annehmen.

Die Klasse Stift

Der Stift ist ein Werkzeug, das sich auf dem Bildschirm bewegen kann. Er befindet sich stets auf einer genau definierten Position des Bildschirms, die durch Zeichenkoordinaten (horizontal nach rechts, vertikal nach unten) angegeben wird, und zeigt in eine Richtung, die durch Winkel beschrieben wird (0° entspricht der Richtung nach rechts, Drehsinn ist mathematisch positiv). Der Stift kennt zwei Zustände: Ist der Stift abgesenkt (runter) und bewegt er sich über den Bildschirm, so hinterlässt er eine Spur, die von einem Zeichenmodus abhängig ist. Ist der Stift angehoben (hoch hinterlässt er keine Spur. Beim Zeichnen kennt der Stift drei Modi:
- Normal: der Stift zeichnet eine Linie in der Stiftfarbe;
- Wechseln: der Stift zeichnet eine Linie, wobei die Untergrundfarbe in die Stiftfarbe und die Stiftfarbe in die Untergrundfarbe geändert wird;
- Radieren: der Stift zeichnet eine Linie in der Farbe des Untergrunds.

Beispiel 1

c

import basis.*;

public class Aufgabe2
{
// Instanzvariablen - ersetzen Sie das folgende Beispiel mit Ihren Variablen
private Fenster bi;
private Stift st;


public Aufgabe2()
{
// Instanzvariable initialisieren
bi = new Fenster(500,200);
st = new Stift();
}


public void fuehreAus()
{
// tragen Sie hier den Code ein
st.bewegeBis(10,90);
st.schreibeText("Dreieck");
st.bewegeBis(10,70);
st.runter();
st.bewegeBis(40,70);
st.bewegeBis(25,10);
st.bewegeBis(10,70);
st.hoch();

st.bewegeBis(100,120);
st.schreibeText("Fünfeck");
st.bewegeBis(100,100);
st.runter();
st.bewegeUm(50);
st.dreheUm(72);
st.bewegeUm(50);
st.dreheUm(72);
st.bewegeUm(50);
st.dreheUm(72);
st.bewegeUm(50);
st.dreheUm(72);
st.bewegeUm(50);
st.dreheUm(72);
st.hoch();

st.bewegeBis(180,120);
st.schreibeText("Rechteckbreite: ");
st.schreibeZahl(60);
st.bewegeBis(200,80);
st.zeichneRechteck(60,20);

st.bewegeBis(300,110);
st.schreibeText("Kreisradius: ");
st.schreibeZahl(40);
st.bewegeBis(330,50);
st.zeichneKreis(40);

st.bewegeBis(410,105);
st.schreibeText("Stern");
st.bewegeBis(400,70);
st.runter();
st.bewegeUm(50);
st.dreheUm(144);
st.bewegeUm(50);
st.dreheUm(144);
st.bewegeUm(50);
st.dreheUm(144);
st.bewegeUm(50);
st.dreheUm(144);
st.bewegeUm(50);
st.dreheUm(144);
st.hoch();

// Aufraeumen
//st.gibFrei();
//bi.gibFrei();
}
}

Beispiel 2

Es soll ein Haus gezeichnet werden. xPos und yPos sollen die Koordinaten der  linken oberen Ecke des Hauses sein. Höhe und Breite sind gleich, dafür soll die Variable breite genutzt werden. Fenster und Tür sollen jeweils 1/5 der Breite und 2/5 bzw. 1/5 der Höhe einnehmen. Der Abstand zwischen den Fenstern und der Tür beträgt 1/5 der Breite bzw. der Höhe.

fd

Der Quelltext dazu lautet:

import basis.*;

public class Aufgabe3
{
// Instanzvariablen - ersetzen Sie das folgende Beispiel mit Ihren Variablen
private double breite,xPos, yPos;
private Stift st;
private Fenster bi;


public Aufgabe3()
{
// Instanzvariable initialisieren

bi = new Fenster(500,300);
st = new Stift();
}


public void zeichneDich()
{
// tragen Sie hier den Code ein
xPos=100;
yPos=100;
breite=100;
st.rechteck(xPos,yPos,breite,breite);
st.rechteck(xPos+breite/5,yPos+breite/5,breite/5,breite/5);
st.rechteck(xPos+breite/5,yPos+3*breite/5,breite/5,2*breite/5);
st.rechteck(xPos+3*breite/5,yPos+breite/5,breite/5,breite/5);
st.rechteck(xPos+3*breite/5,yPos+3*breite/5,breite/5,breite/5);
st.hoch();
st.bewegeBis(xPos-breite/5,yPos+breite/5);
st.runter();
st.bewegeBis(xPos+breite/2,yPos-breite/2);
st.bewegeBis(xPos+breite+breite/5,yPos+breite/5);
}
}

Prozeduren mit Parametern

Wir ändern das Programm jetzt etwas um:

import basis.*;

public class Aufgabe3
{
// Instanzvariablen - ersetzen Sie das folgende Beispiel mit Ihren Variablen
private Stift st;
private Fenster bi;


public Aufgabe3()
{
// Instanzvariable initialisieren
bi = new Fenster(500,300);
st = new Stift();
}

public void fuehreAus()
{
zeichneHaus(100,100,100);
}

public void zeichneHasu(double xPos, double yPos, double breite)
{
st.rechteck(xPos,yPos,breite,breite);
st.rechteck(xPos+breite/5,yPos+breite/5,breite/5,breite/5);
st.rechteck(xPos+breite/5,yPos+3*breite/5,breite/5,2*breite/5);
st.rechteck(xPos+3*breite/5,yPos+breite/5,breite/5,breite/5);
st.rechteck(xPos+3*breite/5,yPos+3*breite/5,breite/5,breite/5);
st.hoch();
st.bewegeBis(xPos-breite/5,yPos+breite/5);
st.runter();
st.bewegeBis(xPos+breite/2,yPos-breite/2);
st.bewegeBis(xPos+breite+breite/5,yPos+breite/5);
}
}

Die Instanzenvariablen xPos, yPos und breite wurden entfernt. Sie wurden in den Methodenaufruf zeichneHaus verlagert. Wir haben jetzt eine Methode mit Parametern. Sie wird in einem anderen programmteil (void fuehreAus) aufgerufen. In diesem Aufruf werden die gewünschten Werte auf die Methode übertragen. Worin liegt jetzt der Vorteil? Dazu fügen wir in die Methode void fuehreAus() mehrmals den Befehl zeichneHaus() ein. Allerdings verwenden wir unterschiedliche Parameter.

public void fuehreAus()
{
zeichneHaus(100,100,100);
zeichneHaus(250,120,80);
zeichneHaus(350,150,50);
zeichneHaus(100,100,10);
}

Ein und dieselbe Prozedur erlaubt uns, verschiedene Größen eines Hauses zu zeichnen ohne jeweils für jedes Haus eine neue Methode zu deklarieren