Ampel implementieren

ThommyTom

Aktives Mitglied
Hi,
ich möchte eine Ampel implementieren und habe folgendes:
Java:
class Ampel
{
    private boolean rot;
    private boolean gelb;
    private boolean gruen;

    public Zmpel()
    {
        rot = false;
        gelb = false;
        gruen = true;
    }
    
    public void schalteWeiter()
    {
        gruen = rot && gelb;
        rot = gelb || rot; 
        gelb = gruen || rot;
    }
}

Soll heißen: Die nächste Phase leuchtet grün, wenn zuvor rot und gelb lechten.
In der nächsten Phase leuchtet rot, wenn zuvor orange oder rot leuchtet.
In der nächsten Phase leuchtet gelb, wenn zuvor grün oder rot leuchtet.

Das Programm funktioniert so aber natürlich noch nicht.
Beim ersten Durchlauf bekommt gruen den Wert false und gelb und rot auch. Wie kann ich das richtig implementieren?

Ich hoffe, ihr versteht was ich meine bzw. mein Problem.
Danke!
Ich bin übrigens totaler Anfänger, also bitte nur mit den einfachsten Mitteln kommen :)
Danke! :)
Lieben Gruß,
Thomas
 

Phash

Top Contributor
Schreib dir erst mal alle möglichen Kombinationen aus,
Schreib alle Abläufe auf.

Überlege dir, welches Ereignis die Ampel umschalten soll.

Dann überlege die, wie du den Zustand einer Ampel beschreiben kannst - das hat du ja schon mit den 3 bools gewünscht, aber wie könntest du heraus finden, in welcher phase Du bist?
 

ThommyTom

Aktives Mitglied
Ich habe mir schon alles einmal aufgeschrieben. Das Problem ist, dass ich glaube ich kein neues Feld, wie z.B. "phase" setzen darf. Es soll alleine damit gehen.
Auch soetwas wie eine switch-Anweisung soll vermieden werden.

Wäre das alles erlaubt, hätte ich kein Problem mit der Aufgabe.

Damit geht es aber:
Java:
public void schalteWeiter()
    {
        _phase = (_phase + 1) % 4;

        switch(_phase)
        {
            case 0: _gruen = _gelb && _rot;
                    _gelb = false;
                    _rot = false;
                    break;
            
            case 1: _gelb = _gruen || _rot;
                    _gruen = false;
                    break;
        
            case 2: _rot = _gelb || _rot;
                    _gelb = false;
                    break;
       
            case 3: _gelb = _gruen || _rot;
                    break;
       }
    }

Aber wie gesagt, darf ich nicht so machen.
Hast du eine alternative Idee?
 

geqoo

Bekanntes Mitglied
Mit der Konstellation ohne Phase kann man nur schwer heraus finden, in welcher man sich gerade befindet.

Java:
public void schalteWeiter()
{
  if (gruen) {
    gruen = false;
    gelb = true;
    rot = false;
  }
  else if (gelb && !rot) {
    gruen = false;
    gelb = false;
    rot = true;
  }
  else if (rot && !gelb) {
    gruen = false;
    gelb = true;
    rot = true;
  }
  else if (rot && gelb) {
    gruen = true;
    gelb = false;
    rot = false;
  }
}
 

Phash

Top Contributor
Ohne if?
Dann ist es eben sehr dumm, aber du brauchst dann ja nur alle phasen durchgehen und weiter von vorn anfangen.
 

Phash

Top Contributor
eine schleife, die einfach alle ampelphasen der Reihe nach durchschaltet...
und dann wieder von vorn anfängt
 

ThommyTom

Aktives Mitglied
Schleifen sind auch tabu :D
Ich lass das jetzt einfach so. Wenn die mit dem switch unzufrieden sind, bin ich mal gespannt, wie sie es haben wollte ...

Danke dir! :)
 

redJava99

Bekanntes Mitglied
Der ursprüngliche Ansatz war doch gar nicht schlecht, nur nicht ganz zuende gedacht.

Das Problem ist, dass nach der ersten Veränderung in Z. 16
Code:
gruen = rot && gelb;
bereits der neue grün-Wert für die anderen Signale herangezogen wird, da die Befehle sequenziell abgearbeitet werden und nicht parallel.

Eine Möglichkeit wäre daher, die vohrigen Werte zu speichern und damit zu arbeiten.

Analytischer wäre es, wenn man sich überlegt, welches Signal von welchem abhängt:
Gelb ändert z.B. bei jedem umschalten seinen Zustand, hängt also nur von sich selbst ab.

Es folgt:

Code:
gelb = !gelb;

Grün ist einfach: Es leuchtet nur, wenn vorher rot und gelb leuchten.

Code:
gruen= rot && gelb;

Es ist zu beachten, dass hier der alte Zustand von gelb gebraucht wird. Daher muss grün vor gelb berechnet werden:

Code:
gruen= rot && gelb
gelb = !gelb;

Zum Schluss fehlt noch rot, was immer nach "nur gelb" und nach "nur rot" leuchten muss, also:
Code:
rot = (!rot && gelb) || (rot && !gelb);
... oder kurz mit dem XOR-Operator:
Code:
rot = rot^gelb;

Achtung: Wieder so zwischen die anderen Befehle einbauen, dass der alte Wert von gelb betrachtet wird.

Es folgt insgesamt:

Code:
    public void schalteWeiter()
    {
        gruen = rot && gelb;
        rot = rot^gelb;
        gelb=!gelb;
    }

hope that helps =)
 

klauskarambulut

Bekanntes Mitglied
Wenn man auf if und switch verzichten möchte und Schleifen etc. tabu sind dann kann man auch ganz einfach Java verwenden.

Eine typische Standard-4-Phasen-Ampel sieht dann so aus
Java:
public class Ampel {
    enum Phase {
	GRUEN(false,false,true) {
	    public Phase schalteWeiter() {
		return GELB;
	    } 
	},GELB(false,true,false) {
	    public Phase schalteWeiter() {
		return ROT;
	    }
	},ROT(true,false,false) {	
	    public Phase schalteWeiter() {
		return ROT_GELB;
	    }
	},ROT_GELB(true,true,false){
	    public Phase schalteWeiter() {
		return GRUEN;
	    }
	};
	private final boolean rot;
	private final boolean gelb;
	private final boolean gruen;
	public abstract Phase schalteWeiter();
	
	private Phase(boolean rot,boolean gelb,boolean gruen) {
	    this.rot = rot;
	    this.gelb = gelb;
	    this.gruen = gruen;
	}
	public boolean rot() {
	     	    return rot;   
	}	     
	public boolean gelb(){
	    return gelb;	
	}
	public boolean gruen(){
	    return gruen;
	}
    };
    
    private Phase aktuell = Phase.GRUEN;
    
    public void schalteWeiter(){
       	      aktuell = aktuell.schalteWeiter();
    }

    public void zeigeAn(){
	System.out.printf("Rot %s, Gelb %s, Grün %s%n",aktuell.rot(),aktuell.gelb(),aktuell.gruen());
    }

    public static void main(String[] args) {
	Ampel ampel = new Ampel();
	for(int i = 0; i<10; i++){
	    ampel.schalteWeiter();
	    ampel.zeigeAn();
	}
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P9cman Ampel in Java implementieren Java Basics - Anfänger-Themen 3
D Ampel Programmieren die jede 10 sekunden ihre farbe wechselt Java Basics - Anfänger-Themen 6
D Ampel für Mitarbeiter zum An-/Abwesend zeigen Java Basics - Anfänger-Themen 28
S Ampel Programmieren Java Basics - Anfänger-Themen 5
Y Ampel Java Basics - Anfänger-Themen 11
L Ampel-Simulation Java Basics - Anfänger-Themen 20
M Ampel Symbole Java Basics - Anfänger-Themen 4
B Ampel (mitBlueJ) Java Basics - Anfänger-Themen 6
M Ampel Java Basics - Anfänger-Themen 14
B Erste Schritte handgeschaltete Ampel programieren Java Basics - Anfänger-Themen 8
Z Ampel Java Basics - Anfänger-Themen 19
D Ampel Programmieren Java Basics - Anfänger-Themen 5
G Ampel automatisch umschalten Java Basics - Anfänger-Themen 18
I Ampel mit Verzögerung Java Basics - Anfänger-Themen 2
V Grafische Auswertung (Ampel-System) Java Basics - Anfänger-Themen 12
Maxq Klassen Actionen in Button implementieren Java Basics - Anfänger-Themen 6
A LinkedList implementieren Java Basics - Anfänger-Themen 32
_so_far_away_ Inventarisierungssystem brauche switch Cases und weiß nicht, wie ich e implementieren muss Java Basics - Anfänger-Themen 5
new_to_coding Rekursive Reihe implementieren Java Basics - Anfänger-Themen 1
HolyFUT Javax Websocket API implementieren Java Basics - Anfänger-Themen 14
J Interface Interface korrekt implementieren Java Basics - Anfänger-Themen 5
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
districon Generics implementieren Java Basics - Anfänger-Themen 2
W UML Diagramm implementieren Java Basics - Anfänger-Themen 2
tony241188 Implementieren Sie die Klasse Hersteller, welche die folgenden Elektrogeräte produziert Java Basics - Anfänger-Themen 3
R Taxistand Implementieren Java Basics - Anfänger-Themen 1
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
Gaudimagspam BMI in Java implementieren Java Basics - Anfänger-Themen 38
T Methode implementieren Java Basics - Anfänger-Themen 21
R Implementieren einer iterativen und rekursiven Klassenmethode. Java Basics - Anfänger-Themen 1
L Methode implementieren, Parameter die übergeben werden sind final Java Basics - Anfänger-Themen 4
J alternierendes Probing-Verfahren für Hash-Tabellen implementieren Java Basics - Anfänger-Themen 0
B UML-Klassendiagram get und set implementieren Java Basics - Anfänger-Themen 2
M Implementieren einer Datenstruktur, welche nur 5 Objekte speichert Java Basics - Anfänger-Themen 3
U Hashmap Iterator selbst implementieren Java Basics - Anfänger-Themen 10
E Klassen implementieren Java Basics - Anfänger-Themen 94
S Tokenizer selbst implementieren Java Basics - Anfänger-Themen 1
C Telefonliste mit interface implementieren Java Basics - Anfänger-Themen 30
L Klassen Kann eine Unterklasse einer abstrakten Klasse ein Interface implementieren? Java Basics - Anfänger-Themen 2
B Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 8
M WindowStateListener selbst implementieren Java Basics - Anfänger-Themen 8
J Algorithmus für eine Reihe implementieren Java Basics - Anfänger-Themen 2
F Kindklassen sollen Ihre Methoden selbst implementieren Java Basics - Anfänger-Themen 5
pkm Interface Funktionales Interface lässt sich nicht implementieren. Java Basics - Anfänger-Themen 2
N Verkettete Liste implementieren Java Basics - Anfänger-Themen 5
N Stacks und Queues Implementieren Java Basics - Anfänger-Themen 2
R Listen richtig implementieren Java Basics - Anfänger-Themen 3
Shizmo Methoden Formel besser implementieren Java Basics - Anfänger-Themen 8
X Polynome implementieren Java Basics - Anfänger-Themen 3
O Methoden implementieren, Sichtbarkeiten, Brüche Java Basics - Anfänger-Themen 104
D Erste Schritte Weitere Befehle implementieren Java Basics - Anfänger-Themen 27
D Erste Schritte Befehl back implementieren Java Basics - Anfänger-Themen 18
B Formel in Java implementieren Java Basics - Anfänger-Themen 4
M Suchbaum implementieren Java Basics - Anfänger-Themen 8
S Implementieren zweier Klassen Java Basics - Anfänger-Themen 5
Hacer Interfaces implementieren Java Basics - Anfänger-Themen 7
C Zyklisch verkette Liste - Pop() methode implementieren Java Basics - Anfänger-Themen 2
N Eigene Stream Methoden implementieren Java Basics - Anfänger-Themen 3
L LinkedList Comparable < > MEHRFACH implementieren? Java Basics - Anfänger-Themen 3
K Klassen implementieren Java Basics - Anfänger-Themen 7
W Neue Klassenmethode implementieren.. Java Basics - Anfänger-Themen 6
U Datentypen Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 13
C UML Diagramm in Java implementieren-Korrektur Java Basics - Anfänger-Themen 8
T Equal Methode implementieren Java Basics - Anfänger-Themen 22
C ZahlenMuster implementieren Java Basics - Anfänger-Themen 1
C Alte Klausuraufgabe - UML in Java implementieren Java Basics - Anfänger-Themen 1
D Erste Schritte spielfeld als Datenspeicher implementieren Java Basics - Anfänger-Themen 1
D spielfeld als Datenspeicher implementieren Java Basics - Anfänger-Themen 5
J Builder Pattern implementieren Java Basics - Anfänger-Themen 3
B Sortierte Liste implementieren Java Basics - Anfänger-Themen 3
L Liste mittels Stack implementieren Java Basics - Anfänger-Themen 0
K Iterator-Interface implementieren mit Exception Handlung Java Basics - Anfänger-Themen 1
D Weihnachtsbaum implementieren gescheitert. Java Basics - Anfänger-Themen 2
D Tannenbaum implementieren gescheitert Java Basics - Anfänger-Themen 1
D Interface Interfaces und abstrakte Klassen implementieren Java Basics - Anfänger-Themen 4
F ArrayListen auf anderer Klasse implementieren Java Basics - Anfänger-Themen 4
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
D Methoden Implementieren von einer Zoomfunktion innerhalb eines JPanels mit null-Layoutmanager Java Basics - Anfänger-Themen 1
G Erbklasse verpflichten Methode zu implementieren Java Basics - Anfänger-Themen 3
D Algorithmus zu gegebener Laufzeit implementieren Java Basics - Anfänger-Themen 1
G einfache Leet-Übersetzung implementieren und benutzen Java Basics - Anfänger-Themen 14
B Binärbaum mit java implementieren! Java Basics - Anfänger-Themen 5
C Klassendesign / Wann Interface implementieren und wann Klassen vererben? Java Basics - Anfänger-Themen 3
D Exception selbst Implementieren Java Basics - Anfänger-Themen 1
T QuickSort implementieren Java Basics - Anfänger-Themen 5
J Konstruktor implementieren, zahl 0 repräsentieren Java Basics - Anfänger-Themen 4
C Frage zum Kartenspiel implementieren Java Basics - Anfänger-Themen 9
shiroX OOP Java Funktion implementieren Java Basics - Anfänger-Themen 3
S Interface Implementieren von Methoden aus einer Klasse in eine GUI Java Basics - Anfänger-Themen 6
H Methoden Implementieren "Drücken Sie eine beliebige Taste" Java Basics - Anfänger-Themen 5
G ActionListener implementieren Java Basics - Anfänger-Themen 12
G Szenario implementieren Java Basics - Anfänger-Themen 7
T Methode Implementieren Java Basics - Anfänger-Themen 15
I Taschenrechner - Methoden implementieren Java Basics - Anfänger-Themen 5
T Interface implementieren mit Abstrakten Typen? Java Basics - Anfänger-Themen 4
T Interface Implementieren Java Basics - Anfänger-Themen 5
T Methoden Wie compareTo() Methode implementieren? Java Basics - Anfänger-Themen 9
D Artikel-Suche implementieren Java Basics - Anfänger-Themen 7
S Implementieren? Java Basics - Anfänger-Themen 9
R Alle Klassen ermitteln, die Interface implementieren / Reflection Java Basics - Anfänger-Themen 51

Ähnliche Java Themen

Neue Themen


Oben