www.r-krell.de |
Webangebot für Schule und Unterricht, Software, Fotovoltaik und mehr |
Willkommen/Übersicht > Informatik > Informatik mit Java, Teil b) > Java-Aufzug-Simulation
Simulation eines Aufzugs
Bedienungsanleitung:
Der Aufzug kann mit den Zifferntasten [0] bis
[6] oder
durch Mausklick auf einen Knopf zu einer Etage gerufen
werden.
Mit der Taste [N] wird der Aufzug(schacht) neu gezeichnet.
Bitte speichern Sie zunächst die
Programmdatei
Aufzug(r-krell.de).jar (45 kB) |
auf Ihrem Computer und starten ("öffnen")
Sie dann die herunter geladene Datei durch Anklicken.
Am besten schieben Sie danach das geöffnete Programmfenster
nach oben links,
sodass Sie gleichzeitig diese Seite lesen können.
Mehr zum Start von Java-Programmen als Application (und nicht mehr als Applet) auf meiner Extraseite Übersicht über meine Java-Programme - Appletprobleme und Downloads (öffnet sich in neuem Browser-Tab).
Nachfolgend Hinweise zu meinem Programm, dessen Java-Quelltext und weiterführende Aufgaben:
Vom Schüler Alessandro Conte gibt's übrigens noch eine optisch viel ansprechendere Fahrstuhl-Version auf einer Extraseite
zum Inhaltsverzeichnis (oben) / zum Seitenende
Aufgabenstellung, Schwierigkeiten und Struktogramm
Die Idee zu diesem Programm kam mir, als ich im Urlaub im Hotel einen Aufzug fand, der - wenn man vom Erdgeschoss in den dritten Stock wollte - gelegentlich an der dritten Etage vorbei zuerst in die fünfte fuhr, nur weil dort offenbar jemand vor mir auf den Knopf gedrückt hatte, während ich noch im Erdgeschoss eingestiegen war und bevor ich im Aufzug die „3" drücken konnte. Mit dem Gast aus dem fünften Stock fuhr der Fahrstuhl dann zur dritten Etage, bevor dessen Wunsch ausgeführt wurde.
Zum Glück arbeiten die meisten Aufzüge besser und halten unterwegs an, auch wenn der entsprechende Haltewunsch erst später als der ursprüngliche Zielwunsch geäußert wurde. Im Informatik-Leistungskurs der Stufe 11 (Bildungsgang 1) sollte deshalb ein „guter" Aufzug simuliert werden. Tatsächlich zeigte sich, dass viele Schüler schon Probleme hatten, das Verhalten eines solchen Aufzugs in der Umgangssprache ordentlich zu formulieren. Es dauerte lange, bis klar wurde, dass es sinnvoll ist, aufwärts immer bis zum obersten gedrückten Stockwerk hoch zu fahren, bevor man einen Richtungswechsel erlaubt.
Auch dann konnte das Struktogramm eines entsprechenden Algorithmus nur mit Mühe entwickelt werden: Lange blieb strittig, wo am besten notiert wird, dass der Aufzug auch dann hält, wenn auf der aktuellen Etage nochmal der Knopf gedrückt wird. Außerdem war fraglich, ob neben den Fahrtrichtungen aufwärts und abwärts noch eine dritte Möglichkeit eingeräumt werden muss für den Fall, dass der Aufzug alle Wünsche abgearbeitet hat und keinen weiteren Rufe auszuführen muss, sondern in der letzten angesteuerten Etage ruhig wartet. Man mache sich klar, dass beim nachstehenden Struktogramm während eines solchen Ruhezustand ständig die Fahrtrichtung gewechselt wird, ohne dass der Aufzug fährt!
Schließlich war noch eine geeignete Datenstruktur für das Verwalten der Wünsche zu finden. Weil im Unterricht gerade Reihungen (arrays) behandelt worden waren, lag eine solche Struktur nahe. Die Reihung boolean[] gewünscht hat für jedes Stockwerk 0 bis 6 eine Komponente, die true ist, falls der Aufzug die entsprechende Etage anfahren soll (sonst false). Mit Schleifen wird diese Reihung in geeigneten Methoden nach dem höchsten bzw. niedrigsten gerade gedrückten Stockwerk durchsucht. Es bedurfte des Nachdenkens um einzusehen, dass ohne jeden Wunsch als höchstes Stockwerk besser eine niedrige Zahl (-1) bzw. als niedrigstes gewünschtes Stockwerk eine große Nummer (7) ausgegeben werden musste, um den Algorithmus so einfach zu halten, d.h. zusätzliche Abfragen zu vermeiden. Das Geheimnis eleganter Struktogramme sind auch hier volle Papierkörbe mit vorläufigen, hier nicht dargestellten Entwürfen! Weitere Details sind dem nachfolgenden Quelltext zu entnehmen.
zum Inhaltsverzeichnis (oben) / zum Seitenende
Erste Java-Datei: „AufzugGrafik.java" -- Bauplan für Schacht und Aufzug
//Teil
1/3 der Bewegung eines Aufzugs
//Java ab 1.1 -- R. Krell -- 19.5.03
import
stiftUndCo.*;
public
class AufzugGrafik
{
Bildschirm fenster;
BuntStift stift, rotStift, blauStift;
Maus maus;
Tastatur taste;
final
int xLi = 30,
xRe = 60,
xLa = 80;
final
int etagenHöhe = 50;
int
etagenZahl = 0;
int
y0;
public
AufzugGrafik (int
stockwerke)
{
if
(stockwerke < 3
||
stockwerke > 10)
{stockwerke = 7;}
etagenZahl = stockwerke;
y0 = (int)
etagenZahl*etagenHöhe + 20;
fenster = new
Bildschirm (120,
etagenZahl*etagenHöhe+40,
"Aufzug");
stift = new
BuntStift();
rotStift = new
BuntStift();
rotStift.setzeFarbe(Farbe.ROT);
rotStift.setzeFuellMuster(1);
blauStift = new
BuntStift();
blauStift.setzeFarbe(Farbe.BLAU);
maus = new
Maus();
taste = new
Tastatur();
zeichneSchacht();
}
private
void zeichneSchacht()
{
stift.zeichneLinie (xLi-5,
20,
xLi-5,
y0);
stift.zeichneLinie (xRe+5,
20,
xRe+5,
y0);
for
(int
stock = 0;
stock < etagenZahl; stock++)
{
stift.zeichneLinie (xRe+5,
y0-stock*etagenHöhe, xLa, y0-stock*etagenHöhe);
stift.bewegeBis (xLa-5,
y0-stock*etagenHöhe-25);
stift.schreibe (""+stock);
lampeAus (stock);
}
stift.bewegeBis (10,y0+15);
stift.schreibe ("Tastatur
o. Maus");
}
public
void lampeAn (int
stock)
{
rotStift.normal();
rotStift.bewegeBis (xLa+15,
y0-stock*etagenHöhe-30);
rotStift.zeichneKreis (5);
stift.bewegeBis (xLa+15,
y0-stock*etagenHöhe-30);
stift.zeichneKreis (5);
}
public
void lampeAus (int
stock)
{
rotStift.radiere();
rotStift.bewegeBis (xLa+15,
y0-stock*etagenHöhe-30);
rotStift.zeichneKreis (5);
stift.bewegeBis (xLa+15,
y0-stock*etagenHöhe-30);
stift.zeichneKreis (5);
}
private
void zeichneAufzug (double
y, boolean
sichtbar)
{
if
(sichtbar)
{
blauStift.normal();
}
else
{
blauStift.radiere();
}
blauStift.bewegeBis (xLi, y);
blauStift.zeichneRechteck
(xRe-xLi+1,
etagenHöhe-10);
}
public
void zehntelHoch (double
start)
{
double
y = y0-start*etagenHöhe-40;
for
(int
dy = 0;
dy<etagenHöhe/10.0;
dy++)
{
zeichneAufzug (y-dy, true);
Hilfe.warte (20);
zeichneAufzug (y-dy, false);
}
}
public
void zehntelRunter (double
start)
{
double
y = y0-start*etagenHöhe-40;
for
(int
dy = 0;
dy<etagenHöhe/10.0;
dy++)
{
zeichneAufzug (y+dy, true);
Hilfe.warte (20);
zeichneAufzug (y+dy, false);
}
}
public
void halte (int
stock)
{
double
y = y0-stock*etagenHöhe-40;
zeichneAufzug (y, true);
stift.bewegeBis (xLi+6,
y+15);
stift.schreibe ("Tür");
Hilfe.warte (40);
stift.radiere(); stift.bewegeBis
(xLi+6,
y+15);
stift.schreibe ("Tür");
stift.normal();
}
public
int liesWunsch()
{
int
stock = -1;
if
(taste.wurdeGedrueckt())
{
char
bst = taste.zeichen();
int nr =
(int)bst
- (int)'0';
if
(nr>=0
&&
nr<etagenZahl)
{
stock = nr;
}
}
if
(maus.istGedrückt())
{
int
x = maus.hPosition();
int
y = maus.vPosition();
if
(x >= xLa+10
&& x <=
xLa+20)
{
for
(int
i=0;
i<etagenZahl; i++)
{
if
(y <= y0-i*etagenHöhe-25
&& y >=
y0-i*etagenHöhe-35)
{
stock = i;
}
}
}
}
return
(stock);
}
}
zum Inhaltsverzeichnis (oben) / zum Seitenende
Zweite Java-Datei: „AufzugSteuerung.java" -- Bauplan für die Aufzug-Bewegung
//Teil
2/3 der Bewegung eines Aufzugs
//Java ab 1.1 -- R. Krell -- 19.5.03
public
class AufzugSteuerung
{
final
int etagenZahl = 7;
boolean[]
gewünscht = new
boolean [etagenZahl];
AufzugGrafik aufzug = new
AufzugGrafik (etagenZahl);
boolean
aufwärts = true;
int
etage = 0;
public
void steuere()
{
anhalten();
for
(int
i=0;
i<etagenZahl; i++)
{
gewünscht[i] = false;
}
while
(true)
{
erkenneWunsch();
while
(gewünscht[etage])
{
anhalten();
}
if
(etage < höchsterWunsch() && aufwärts)
{
hoch();
}
else
{
aufwärts = false;
}
if
(etage > tiefsterWunsch() && !aufwärts)
{
runter();
}
else
{
aufwärts = true;
}
}
}
private
void erkenneWunsch ()
{
int
stock = aufzug.liesWunsch();
if
(stock >= 0)
{
gewünscht[stock] = true;
aufzug.lampeAn (stock);
}
}
private
void anhalten ()
{
for
(int
i=0;
i<6;
i++)
{
aufzug.halte (etage);
erkenneWunsch();
}
gewünscht[etage] = false;
aufzug.lampeAus (etage);
for
(int
i=0;
i<6;
i++)
{
aufzug.halte (etage);
erkenneWunsch();
}
}
private
void hoch ()
{
for
(double
y=etage; y<etage+0.91;
y=y+0.1)
{
aufzug.zehntelHoch(y);
erkenneWunsch();
}
etage++;
}
private
void runter ()
{
for
(double
y=etage; y>etage-0.91;
y=y-0.1)
{
aufzug.zehntelRunter(y);
erkenneWunsch();
}
etage--;
}
private
int höchsterWunsch ()
{
for
(int
i=etagenZahl-1;
i>=0;
i--)
{
if
(gewünscht[i])
{
return
(i);
}
}
return
(-1);
}
private
int tiefsterWunsch ()
{
for
(int
i=0;
i<etagenZahl; i++)
{
if
(gewünscht[i])
{
return
(i);
}
}
return
(etagenZahl);
}
}
zum Inhaltsverzeichnis (oben) / zum Seitenende
Dritte Java-Datei: „AufzugStart.java" -- Startdatei
//Teil
3/3 der Bewegung eines Aufzugs
//Java ab 1.1 -- R. Krell -- 19.5.03
class
AufzugStart
{
public static
void main(String[] s)
{
AufzugSteuerung lift = new
AufzugSteuerung();
lift.steuere();
}
}
Diese Startdatei startet den Aufzug als Application. Für den nicht mehr erlaubten Start als Applet aus einer Webseite heraus finden Sie alles Wichtige bei meinem Autorennen!
zum Inhaltsverzeichnis (oben) / zum Seitenende
Weiterführende
Aufgaben
zurück zur
Seite „Informatik mit Java, Teil b)"