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

Nach dem Webstart erscheint links oben ein Extra-Fenster mit dem Aufzug:

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.

Wenn die Java-JRE installiert ist, können Sie das Programm jetzt sofort ausführen:

Hier klicken zum Webstart des Aufzugs

Danach Öffnen von Aufzug.jnlp [mit Java(TM) Webstart Launcher (Standard)] wählen/bestätigen
und bei evtl. Sicherheitswarnung vor der Ausführung von AufzugStart das Risiko akzeptieren und OK drücken.

Wenn Sie außerdem gefragt werden, ob Sie eine Desktop- und eine Startmenüverknüpfung anlegen wollen,
sollten Sie zustimmen, wenn Sie die Aufzugsimulation auch nach Verlassen dieser Webseite nochmal ausprobieren wollen.

Wird nach dem Klick Aufzug.jnlp herunter geladen oder werden Sie gefragt, womit Sie Aufzug.jnlp öffnen wollen oder ob/wohin Sie die Datei
speichern wollen, haben Sie entweder kein Java installiert oder ihr Browser (z.B. Opera) unterstützt keinen Webstart.
Im letzten Fall empfiehlt sich nachfolgend der Download der .jar-Datei:

Sie können den Aufzug auch als ausführbare Java-Datei Aufzug(r-krell.de).jar (45 kB) herunter laden und später lokal auf Ihrem Rechner starten (Java-Umgebung JRE vorausgesetzt). Die Ausführung als Applet im Browser wird von mir hingegen nicht mehr angeboten: Gründe, Abhilfe und alle Downloads (in neuem 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 Start als Applet aus einer Webseite heraus finden Sie alles Wichtige bei meinem Autorennen!


zum Inhaltsverzeichnis (oben) / zum Seitenende

Weiterführende Aufgaben

  1. Kommentieren Sie den vorstehenden Quelltext!

  2. Schreiben Sie ein Aufzugprogramm, das drei Aufzüge in drei nebeneinander verlaufenden Schächten steuert. Auf jeder Etage gibt es zwei Knöpfe: einen Aufwärtspfeil, wenn man nach oben will, und einen Abwärtspfeil, wenn man nach unten möchte. Im Aufzug gibt's die üblichen Nummern. Wird im Aufzug eine „3" gedrückt, so muss natürlich genau dieser Aufzug in der dritten Etage anhalten. Wird aber im dritten Stock der Aufwärtspfeil gedrückt, so muss irgendein Aufzug dort halten und den Fahrgast mitnehmen! Wieder soll die Aufzugsteuerung möglichst optimal verlaufen!

  3. Im Sommer und Herbst 2003 bewarb die Firma Thyssen-Krupp in Zeitungsanzeigen und Fernsehspots ihre Innovationskraft. Kinder erzählten von den Neuerungen, die ihre Eltern in der Firma entwarfen. Eine Anzeige lautete: „Der Vater von Tobias hat ein innovatives Aufzugssystem mitentwickelt. Erstmals ist es möglich, zwei Kabinen unabhängig voneinander in einem Schacht zu betreiben." Überlegen Sie, welchen Vorteil ein solches System haben könnte, und programmieren Sie es (mit einem Aufzugschacht) in Java!
    (Hinweis: Thyssen-Krupp empfiehlt das System erst in Hochhäusern mit mindestens drei parallelen Aufzugschächten. In einem Schacht muss ein einzelner Aufzug bleiben, damit man auch von ganz unten nach ganz oben fahren kann. Auf jeder Etage muss man beim Ruf schon angeben, wohin man fahren will).

  4. Vom Schüler Alessandro Conte gibt's eine optisch viel ansprechendere Fahrstuhl-Version als mein einfaches Modell - auch nur unter Benutzung der Stift&Co-Bibliothek in Java programmiert! Verwenden Sie diese Version als Anregung für eigene (grafische) Verbesserungen.


zurück zur Seite „Informatik mit Java, Teil b)"




zum Anfang dieser Seite
Willkommen/Übersicht   -   Was ist neu?   -   Software   -   Mathematik   -   Physik   -   Informatik   -   Schule: Lessing-Gymnasium und -Berufskolleg   -   Fotovoltaik   -   & mehr   -   Kontakt: e-Mail,  News-Abo, Gästebuch, Impressum   -   Grußkarten, site map, Download und Suche

Diese Seite ist Teil des Webangebots http://www.r-krell.de. Sie können diese Seite per e-Mail weiter empfehlen (tell a friend).