Hallo Leute,
ich hänge schon seit über 5 Std an dieser Aufgabe und schaffe es einfach nicht den Kompletten Ampelzyklus zu programmieren. Im Konstruktor steht die Ampel zunächst auf (gruen=true, gelb=false, rot=false). Durch Anwendung der Methode schalteWeiter() muss nun vom grünen in den gelben Zustannd gewechselt werden, danach in den roten, rot / gelben und wieder zurück auf den grünen. Für einen Zyklus muss die Methode folglich 4x angewendet werden.
Das Problem: man darf nur boolsche Ausdrücke verwenden!
Ich habe das Gefühl, dass ich die boolschen Operatoren “!=”, “==”, “^” nicht verwenden kann.
Hier ist meine bisherige Lösung, die von grün auf gelb auf rot kommt.
/**
* Eine Zmpel besteht aus drei Lampen in den Farben rot, gelb und gruen.
* Sie durchlaeuft periodisch vier Phasen: gruen, gelb, rot, rot/gelb.
* In den ersten drei Phasen leuchtet also nur jeweils eine Lampe,
* waehrend in der vierten Phase zwei Lampen gleichzeitig leuchten.
* Der Zustand der einzelnen Lampen kann abgefragt werden,
* und die Zmpel kann in die naechste Phase geschaltet werden.
* Die Schaltung geschieht explizit durch einen Methodenaufruf
* (und nicht etwa durch einen automatischen Timer).
*
*/
class Zmpel
{
private boolean _rot;
private boolean _gelb;
private boolean _gruen;
/**
* Initialisiert eine neue Zmpel auf die erste Phase (gruen).
*/
public Zmpel()
{
_rot = false;
_gelb = false;
_gruen = true;
}
/**
* Gibt an, ob die rote Lampe leuchtet.
*/
public boolean leuchtetRot()
{
return _rot;
}
/**
* Gibt an, ob die gelbe Lampe leuchtet.
*/
public boolean leuchtetGelb()
{
return _gelb;
}
/**
* Gibt an, ob die gruene Lampe leuchtet.
*/
public boolean leuchtetGruen()
{
return _gruen;
}
/**
* Schaltet die Zmpel in die naechste Phase (gruen -> gelb -> rot -> rot/gelb -> gruen).
*/
public void schalteWeiter()
{
_rot = (_gelb && !_gruen) || (_gelb == _gruen);
_gelb = (_gruen && !_rot) || (_rot == _gruen);
_gruen = (_rot && _gelb);
}
}
Wenn jemand die Aufgabe testen will ist die Ampel GUI praktisch Hier ist ihr Code:
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
* Stellt eine Ampel graphisch dar und ermoeglicht das Weiterschalten per Knopfdruck.
*
*/
class ZmpelGUI
{
private Zmpel _ampel;
private JFrame _frame;
private JButton _roteLampe;
private JButton _gelbeLampe;
private JButton _grueneLampe;
/**
* Erzeugt eine neue Ampel und stellt diese anschliessend dar.
*/
public ZmpelGUI()
{
this(new Zmpel());
}
/**
* Initialisiert eine neue Ampeldarstellung mit einer gegebenen Ampel.
*
* @param ampel die darzustellende Ampel
*/
private ZmpelGUI(Zmpel ampel)
{
_ampel = ampel;
initialisiereFrame();
initialisiereLampen();
initialisiereWeiter();
aktualisiereLampen();
macheGUIsichtbar();
}
/**
* Konfiguriert den Fenstertitel und das Layout.
*/
private void initialisiereFrame()
{
_frame = new JFrame("Z");
_frame.setLayout(new BoxLayout(_frame.getContentPane(), BoxLayout.PAGE_AXIS));
}
/**
* Erzeugt fuer jede Lampe einen Button.
*/
private void initialisiereLampen()
{
_roteLampe = neueLampe();
_gelbeLampe = neueLampe();
_grueneLampe = neueLampe();
}
/**
* Erzeugt einen LampenButton.
*/
private JButton neueLampe()
{
JButton lampe = new JButton("\u25c9");
lampe.setFont(font);
lampe.setBackground(Color.LIGHT_GRAY);
lampe.setForeground(Color.BLACK);
_frame.add(lampe);
return lampe;
}
private static final Font font = new Font(Font.MONOSPACED, Font.PLAIN, 50);
/**
* Erzeugt den Weiter-Button und fueuegt einen ActionListener hinzu,
* der die Ampel weiterschaltet, wenn der Button gedrueckt wird.
*/
private void initialisiereWeiter()
{
JButton weiter = new JButton("weiter");
weiter.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
_ampel.schalteWeiter();
aktualisiereLampen();
}
});
_frame.add(weiter);
}
/**
* Setzt die Farben der LampenButtons entsprechend der Phase der verwendetet Ampel.
*/
private void aktualisiereLampen()
{
_roteLampe.setForeground(_ampel.leuchtetRot() ? Color.RED : Color.BLACK);
_gelbeLampe.setForeground(_ampel.leuchtetGelb() ? Color.YELLOW : Color.BLACK);
_grueneLampe.setForeground(_ampel.leuchtetGruen() ? Color.GREEN : Color.BLACK);
}
/**
* Setzt die DefaultCloseOperation, packt das Frame auf die richtige Groesse und macht es
* sichtbar.
*/
private void macheGUIsichtbar()
{
_frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
_frame.pack();
_frame.setVisible(true);
}
}
Ich denke, dass das Ergebnis entweder super einfach für jemanden, der den passenden Befehl kennt, oder auch für fortgeschrittene Programmierer nicht ganz offensichtlich sein wird.
Danke im Voraus.
Viele Grüße
skonline90