Klassen Modellierung einer Kneipe

Ich möchte dich mal sehen wenn dein Zahnarzt zu dir sagt, "Sie hatten ja gesunde Zähne, aber ich hab mal rumgebohrt. Mir war danach, ich hab das einfach mal gemacht."

Der Musiker wird genau dann in die Liste eingetragen, wenn noch platz ist.
Wenn doSomething für den Musiker aufgerufen wird, soll ausgegeben werden "Der Musiker <Name des Musikers> spielt auf seinem Instrument, dem <Instrument des Musikers>."
Sieh mal zu dass du das hinkriegst und lass die Musiker nüchtern bleiben wenn sie das wollen (wers glaubt 😀)
 
Der Musiker wird genau dann in die Liste eingetragen, wenn noch platz ist.

Aber das habe ich doch gemacht? ???:L

Ich verstehe Dich nicht...

Ich habe nur noch die boolean-Variable darfmusizieren dazu genommen, damit man bei leave() wieder unterscheiden kann, ob er einfach nur die Bar verlässt (wenn er gar nicht in die Liste kommt) oder auch noch aus der Liste der Msuiker ausgetragen werden muss.



Wenn doSomething für den Musiker aufgerufen wird, soll ausgegeben werden "Der Musiker <Name des Musikers> spielt auf seinem Instrument, dem <Instrument des Musikers>."

Meinst Du:

Java:
public void doSomething(){
double b=Math.random();
 
System.out.println("Der Musiker " + name " spielt gerade " + instrument);

if(b<0.5){
  leave();
}

}
 
Zuletzt bearbeitet von einem Moderator:
if(bar.getSizeOfListOfMusician()<5) sieht übrigens rightig aus
Ein letztes mal: Ein Musiker soll die Bar nicht verlassen wenn doSomthing aufgerufen wird.
Wenn bei einem Musiker leave aufgerufen wird muss er IMMER von der Liste entfernt werden. Deswegen ja die überprüfung beim betreten der bar. Du kannst ja eine Annahme machen, dass ein Musiker der nicht mehr auf die Bühne passt die Bar wieder verlässt. Das kann man aus "Live-Bands mit mehr als fünf Musikern passen nicht auf die Bühne." Nicht wirklich gut schließen. Aber überleg mal, was macht ein Musiker in einer Bar in der er nicht spielen darf? Wenn er sich betrinkt, ist er kein Musiker mehr sondern ein Gast. Darum musst du dich bei deiner Aufgabe nicht kümmern. Für dich ist klar, der Musiker kann NUR musizieren, die bar betreten, verlassen sonst nix.
Wenn der Musiker keinen Platz findet, betritt er die bar gar nicht, er sollte in der enter() funktion schon wieder rausfliegen.
 
So? 🙂

Java:
// Die Klasse Musician (Aufgabe 1)
 
public class Musician extends Person{
 
String instrument;

 
public Musician(String name, String instrument){
super(name);
this.instrument=instrument;
}
 
public void enter(Bar bar){
 
this.bar=bar;
// Neue Methode in der Klasse Bar: getSizeOfListOfMusician();
//Sieht so aus:
// public int getSizeOfListOfMusician(){
//         return musician.size();
// }  
 
if(bar.getSizeOfListOfMusician()<5){
   bar.FuegeMusikerHinzu(this);
   }
else bar=null;
 
}
 
public void leave(){
bar=null;
 
bar.EntferneMusiker(this);
}
 

 public void doSomething(){

System.out.println("Der Musiker " + name " spielt gerade " + instrument); 

}


Zeile 38 ist falsch: Wie macht man das mit dem System.out.println hier?
 
Zuletzt bearbeitet von einem Moderator:
Eine Nachfrage noch hierzu, bevor ich zur Klasse Main komme.


Irgendwie habe ich das doch jetzt bei Guest so gemacht:

Potentieller Gast betritt die Bar.
Er schaut, ob bei der Bühne ein Platz frei ist.
Wenn ja, trägt er sich dort ein.
Wenn nein, schaut er, ob bei der Theke ein Platz frei ist.
Wenn ja, trägt er sich dort ein.
Wenn nein, schaut er, ob bei der Tür ein Platz frei ist.
Wenn ja, trägt er sich dort ein.
Wenn nein, verlässt er die Kneipe wieder.

Ein Gast kann die Bar aber auch verlassen, nachdem er sich bereits irgendwo eingetragen hatte.
(Hier hat man also sozusagen zwei "verschiedene" Arten von leave() (die aber beide in einer Methode umgesetzt sind).


Bei einem Musiker ist das jetzt anders? Ich sehe nicht, warum!

Er kommt in die Bar, schaut, ob auf der Musikerliste ein Platz ist.
Wenn ja, trägt er sich ein.
Wenn nicht, geht er wieder.

Auch der Musiker kann die Bar verlassen, nachdem er sich eingetragen hatte.




Ich verstehe also nicht, inwiefern die Methode enter bei Musician so viel einfacher sein kann!
Entweder bin ich schwer von Begriff oder man könnte die Methode enter bzw. leave bei Guest auch viel einfacher machen.
 
Mag sein, dass wir aneinander vorbeireden.

Aber sowohl Gast als auch Musiker können doch entweder SOFORT wieder gehen oder aber sich erst eintragen und DANN gehen.


Da sehe ich keinen Unterschied.

Naja, egal.
 
Unter diesen Gesichtspunkten war ich auf diesen Code gekommen.
Deswegen habe ich da die boolean-Variable darfmusizieren (im Sinne von: Er konnte sich in die Musiker-Liste eintragen und darf also musizieren) eingeführt, damit ich unterscheiden kann, ob der Musiker in einer Liste steht (und er dann weggeht) oder ob er weggeht ohne überhaupt in einer Liste eingetragen worden zu sein.

Würdest Du sagen, dass der Code dann okay ist?


Java:
// Die Klasse Musician (Aufgabe 1)

public class Musician extends Person{

String instrument;
boolean darfmusizieren=false;

public Musician(String name, String instrument){
super(name);
this.instrument=instrument;
}

public void enter(Bar bar){

this.bar=bar;
// Neue Methode in der Klasse Bar: getSizeOfListOfMusician();
//Sieht so aus:
// public int getSizeOfListOfMusician(){
//         return musician.size();
// }  

if(bar.getSizeOfListOfMusician()<5){
   bar.FuegeMusikerHinzu(this);
   darfmusizieren=true;
}
else leave();

}

public void leave(){
bar=null;

if(darfmusizieren=true){
bar.EntferneMusiker(this);
}

}


public void doSomething(){

System.out.println("Der Musiker" + name + " spielt gerade" + instrument); 
 
}
 }
 
Zuletzt bearbeitet von einem Moderator:
Vielleicht können wir jetzt zur Klasse Main kommen?

(Das Andere ist wohl einfach Auslegungssache.)


Die Klasse Main ist vorgegeben:

Java:
public class Main {

	/**
	 * This is a short example using the waitFor method.
	 */
	public static void main(String[] args) {
		waitFor(1000); // sleep 1 second
		System.out.println("first line");
		waitFor(1000);
		System.out.println("second line");
		waitFor(500); // sleep 0.5 seconds
	}


	/**
	 * Stops the execution of the program for the specified time.
	 * @param millis The amount of milliseconds to stop.
	 */
	public static void waitFor(long millis) {
		try {
			Thread.sleep(millis);
		} catch(Exception e) {
			// ignore here
		}
	}

}

und soll Folgendes (in Worten) machen:

Die Klasse Main erzeugt eine Kneipe und füllt diese mit Personen. Damit etwas in der
Kneipe passieren kann, gibt es eine Schleife die für jede Person doSomething() aufruft. Zur Umsetzung
dieser Schleife sollten alle Referenzen der erzeugten Personen in dieser Klasse gespeichert
sein.
In der bereits vorgegebenen Klasse Main befindet sich eine statische Methode waitFor(long millis).
Diese Methode sorgt dafür, dass das Programm eine bestimmte Zeit wartet, bevor es weiter
arbeitet (Angaben in Millisekunden). Verwendet diese Methode, um die Konsolenausgaben etwas
zu verzögern.




Um ehrlich zu sein: Ich verstehe nur Bahnhof.

Die Klasse Main soll irgendwie ergänzt werden, so viel verstehe ich noch.
 
Java:
public class Main {
 
    public static void main(String[] args) {
        Bar myBar= new Bar(10,20,30);
        Waiter james = new Water(...);
        Musican wolle = new Musican(...);
        Guest gast1 = new Gast(...);
        myBar.addWaiter(james);
        myBar.addMusican(wolle);
        gast1.enter(myBar);
        waitFor(1000); // sleep 1 second
        System.out.println("first line");
        waitFor(1000);
        System.out.println("second line");
        waitFor(500); // sleep 0.5 seconds
    }
 
 
    /**
     * Stops the execution of the program for the specified time.
     * @param millis The amount of milliseconds to stop.
     */
    public static void waitFor(long millis) {
        try {
            Thread.sleep(millis);
        } catch(Exception e) {
            // ignore here
        }
    }

In den Klammer die Parameter der Konstruktoren ausführen. Hab ich jetzt nicht gemacht, weil ich so nicht wusste wo was steht. Das ist erst einmal die Intialisierung.
 
Okay, ich erzeuge also eine neue Bar, dabei muss ich die Größen der Bereiche übergeben (so war ja der Konstruktor der Klasse Bar geschrieben worden.

Dann erzeuge ich einen Gast, einen Kellner, einen Musiker.

Dann muss ich dafür sorgen, daß für jede Person doSomething() ausgeführt wird.

(Das wird eine each-for Schleife sein, vermute ich.)


Aber was soll das mit der Verzögerung?

Muss ich da, wo jetzt "first line" und "second line" steht irgendwas eintragen?
 
Okay, ich erzeuge also eine neue Bar, dabei muss ich die Größen der Bereiche übergeben (so war ja der Konstruktor der Klasse Bar geschrieben worden.

Dann erzeuge ich einen Gast, einen Kellner, einen Musiker.

Dann muss ich dafür sorgen, daß für jede Person doSomething() ausgeführt wird.

(Das wird eine each-for Schleife sein, vermute ich.)


Aber was soll das mit der Verzögerung?

Muss ich da, wo jetzt "first line" und "second line" steht irgendwas eintragen?

for Schleife geht nur wenn du die Personen in einem Array anlegst dann kannst du sagen
for(....)
so müsste man jetzt schreiben
Guest.doSomething();
Waiter.doSomething();
.....
 
Ich meine die each-for Schleife.

Nicht die klassische for-Schleife.


Also

Java:
for (Elementyp element: sammlung){
      Schleifenrumpf
}

Pseudocode:

für jedes element in sammlung tue:{
Schleifenrumpf
}


Damit müsste ich doch für alle Gäste in der ArrayList doSomething aufrufen können?
(Und ebenso für alle Kellner und Gäste in ihren Listen..)


Was passiert aber, nachdem ich doSomething aufgerufen habe?

Es soll ja auch irgendwas ausgegeben werden?
Und das vielleicht verzögert, um zu simulieren, dass die Dinge in der Kneipge nicht sofort hintereinander passieren müssen?




Dort, wo jetzt "first line" steht, soll sicherlich der Name der Person stehen, die gerade etwas getan hat.

Und dort, wo "second line" steht, soll bestimmt das stehen, was die betreffende Person gerade gemacht hat.


Und die Ausgabe soll man verzögern, wieso auch immer. 🙂
 
Zuletzt bearbeitet von einem Moderator:
Ja sicherlich soll da noch irgendwas gemacht werden und ausgegeben werden.
Zum Beispiel das irgend nen Gast für irgendetwas vom Menü Geld bezahlt hat oder so..
 
Also ich denk mal, nachdem man für jede Person doSomething() hat ausführen lassen, muss man eben den Namen der Person und die Aktivität dieser Person ausgeben lassen.


Wenn ich also zum Beispiel den Gast Dennis nehme...
Und für diesen Gast doSomething() ausführe...
Stehen ja nur bestimmte Dinge zur Verfügung, die dieser Gast machen kann.

Bis jetzt habe ich nur die Möglichkeit, dass der Gast (eventuell) die Bar verlässt.
Angenommen, der Gast hat noch die Möglichkeit ein Getränk zu bestellen.

Könnte ich nicht - nach der Ausführung von doSomething() für Dennis - eine if-else-Bedingung für die Aktivitäten machen? Und dann diese Aktivität ausgeben?


Vielleicht irgendwie sowas:

doSomething für Dennis ausführen
if(Aktivität==leave()){
System.out.print("Dennis");
Verzögerung
System.out.println("Verlässt Bar");
else(Aktivität==GetränkBestellen());
System.out.print("Dennis")
Verzögerung
System.out.println("Bestellt Getränk")


Oder so ähnlich?
 
Ich habe jetzt Folgendes zur Klasse Main:

Dabei ist anzumerken, dass ich bei der Methode doSomething() von Guest ergänzt habe, dass ausgegeben wird: "verlässt Bar".
Bei der Klasse Musician habe ich in der doSomething Methode, dass ausgegeben wird:
"spielt gerade..."


Java:
public class Main {
	
	public static void main(String[] args) {
	Bar bar1=new Bar(45,20,50);
	Guest Dennis=new Guest("Dennis");
	Guest Philipp=new Guest("Philipp");
	Guest Michael=new Guest("Michael");
	Waiter Peter=new Waiter("Peter");
	Waiter Klaus=new Waiter("Klaus");
	Musician Thomas=new Musician("Thomas", "Gitarre");
	Musician Wolfgang=new Musician("Wolfgang", "Klavier");
	bar1.FuegeMusikerHinzu(Thomas);
	bar1.FuegeMusikerHinzu(Wolfgang);
	bar1.FuegeKellnerHinzu(Peter);
	bar1.FuegeKellnerHinzu(Klaus);
	
	
	Dennis.enter(bar1);
	Philipp.enter(bar1);
	Michael.enter(bar1);
	
	Person[] personen=new Person[7];
	
	personen[0]=Dennis;
	personen[1]=Philipp;
	personen[2]=Michael;
	personen[3]=Thomas;
	personen[4]=Wolfgang;
	personen[5]=Peter;
	personen[6]=Klaus;
	
	
	
	for(int i=0; i<=6; i++){
		waitFor(1000);
		System.out.println("Die Person " + personen[i] + " macht gerade Folgendes:");
		waitFor(1000);
		System.out.println(personen[i].doSomething());
		waitFor(500);
		}
	

	}


	/**
	 * Stops the execution of the program for the specified time.
	 * @param millis The amount of milliseconds to stop.
	 */
	public static void waitFor(long millis) {
		try {
			Thread.sleep(millis);
		} catch(Exception e) {
			// ignore here
		}
	}

}

Es kommen Fehlermeldungen: s. Screenshot


Davon sind 7 Fehler wieder klar, weil ich die Klasse Waiter noch nicht habe.

Aber ich verstehe diesen Fehler nicht:

Code:
Main.java:38:




EDIT: Meine Idee ist folgende:

Ich ändere in der Klasse Person die abstrakte Klasse public void doSomething() in die abstrakte Klasse

public String doSomething() und dann gebe ich bei Guest und bei Musician mit return einen String zurück, der dann in der Main-Methode ausgegeben wird.


Geht sowas:

return "spielt gerade " + instrument;

??

Ist das dann "spielt gerade Geige", wenn instrument des Musikers Geige ist?
 
Zuletzt bearbeitet von einem Moderator:
Habe das noch ein bisschen modifiziert:

Java:
public class Main {
	
	public static void main(String[] args) {
	Bar bar1=new Bar(45,20,50);
	Guest Dennis=new Guest("Dennis");
	Guest Philipp=new Guest("Philipp");
	Guest Michael=new Guest("Michael");
	Waiter Peter=new Waiter("Peter");
	Waiter Klaus=new Waiter("Klaus");
	Musician Thomas=new Musician("Thomas", "Gitarre");
	Musician Wolfgang=new Musician("Wolfgang", "Klavier");
	bar1.FuegeMusikerHinzu(Thomas);
	bar1.FuegeMusikerHinzu(Wolfgang);
	bar1.FuegeKellnerHinzu(Peter);
	bar1.FuegeKellnerHinzu(Klaus);
	
	
	Dennis.enter(bar1);
	Philipp.enter(bar1);
	Michael.enter(bar1);
	
	Person[] personen=new Person[7];
	
	personen[0]=Dennis;
	personen[1]=Philipp;
	personen[2]=Michael;
	personen[3]=Thomas;
	personen[4]=Wolfgang;
	personen[5]=Peter;
	personen[6]=Klaus;
	
	//toString() entsprechend in der Klassen Guest und Musician und Waiter überschrieben	
	
	for(int i=0; i<=6; i++){
		waitFor(1000);
		System.out.println("Die Person " + personen[i].toString() + " macht gerade Folgendes:");
		waitFor(1000);
		System.out.println(personen[i].doSomething());
		waitFor(500);
		}
	

	}


	/**
	 * Stops the execution of the program for the specified time.
	 * @param millis The amount of milliseconds to stop.
	 */
	public static void waitFor(long millis) {
		try {
			Thread.sleep(millis);
		} catch(Exception e) {
			// ignore here
		}
	}

}

Jetzt habe ich aber ein Problem.
In dem Fall, dass ein Gast bei Aufruf von doSomething() die Bar verlässt, habe ich eine NullPointerException: s. Screenshot ganz unten.


Hier nochmal (damit ihr mit dem Screenshot was anfangen könnt, Guest und Main:


Java:
// Die Klasse Guest (Aufgabe 1)

import java.util.List;
import java.util.ArrayList;

public class Guest extends Person{
	 
Area area=null;

public Guest(String name){
	super(name);
}


 
public void enter(Bar bar){
this.bar=bar;
 
if(bar.gibStage().nochFrei()){
   bar.gibStage().FuegeGastHinzu(this);
   area=bar.gibStage();
  }
 
else if (bar.gibCounter().nochFrei() && area==null){
   bar.gibCounter().FuegeGastHinzu(this);
   area=bar.gibCounter();
}
 
else if (bar.gibDoor().nochFrei() && area==null){
   bar.gibDoor().FuegeGastHinzu(this);
   area=bar.gibDoor();
}
 
else leave();
}
 
public void leave(){
  bar=null;
 
  if(area!=null){
        if(area==bar.gibStage()){
           bar.gibStage().EntferneGast(this);
           area=null;}
        else if (area==bar.gibCounter()){
           bar.gibCounter().EntferneGast(this);
           area=null;}
               else { bar.gibDoor().EntferneGast(this);
                        area=null;}
}
}

public String toString(){
	String x=name;
	return x;
}
 
public String doSomething(){
   double a=Math.random();
     if(a<0.5){
    leave();	 
    return "verlaesst Bar.";
    	 
    	 
      }
     return "-";
}
 
 
}

Java:
public class Main {
	
	public static void main(String[] args) {
	Bar bar1=new Bar(45,20,50);
	Guest Dennis=new Guest("Dennis");
	Guest Philipp=new Guest("Philipp");
	Guest Michael=new Guest("Michael");
	Waiter Peter=new Waiter("Peter");
	Waiter Klaus=new Waiter("Klaus");
	Musician Thomas=new Musician("Thomas", "Gitarre");
	Musician Wolfgang=new Musician("Wolfgang", "Klavier");
	bar1.FuegeMusikerHinzu(Thomas);
	bar1.FuegeMusikerHinzu(Wolfgang);
	bar1.FuegeKellnerHinzu(Peter);
	bar1.FuegeKellnerHinzu(Klaus);
	
	
	Dennis.enter(bar1);
	Philipp.enter(bar1);
	Michael.enter(bar1);
	
	Person[] personen=new Person[7];
	
	personen[0]=Dennis;
	personen[1]=Philipp;
	personen[2]=Michael;
	personen[3]=Thomas;
	personen[4]=Wolfgang;
	personen[5]=Peter;
	personen[6]=Klaus;
	
		
	
	for(int i=0; i<=6; i++){
		waitFor(1000);
		System.out.println("Die Person " + personen[i].toString() + " macht gerade Folgendes:");
		waitFor(1000);
		System.out.println(personen[i].doSomething());
		waitFor(500);
		}
	

	}


	/**
	 * Stops the execution of the program for the specified time.
	 * @param millis The amount of milliseconds to stop.
	 */
	public static void waitFor(long millis) {
		try {
			Thread.sleep(millis);
		} catch(Exception e) {
			// ignore here
		}
	}

}



Wer kann mir bitte helfen?
 
Zuletzt bearbeitet von einem Moderator:
Java:
public void leave(){
  
 
  if(area!=null){
             if(area.equals(bar.gibStage())){
                          bar.gibStage().EntferneGast(this);
                          area=null;
               }
               else if (area.equals(bar.gibCounter())){
                          bar.gibCounter().EntferneGast(this);
                          area=null;
               }
               else if(area.equals(bar.gibDoor())){
                          bar.gibDoor().EntferneGast(this);
                          area=null;
               }
   } 
bar=null;
}
Zu beachten:
Bar nicht zu Anfang null setzen, denn wie soll er gucken ob die Areas gleich sind, wenn er gar nicht auf die Areas seiner bar zugreifen kann.
Und == sollte man nur für prmitive Datentypen wie int und boolean.
Strings sollte man ebenfalls mit compareTo oder equals(oder equalsIngnoreCase) vergleichen.
 
Jetzt geht es ohne den Fehler, danke!


Kannst Du mir aber bitte nochmal erklären, wieso ich

bar=null;

nicht an den Anfang schreiben darf? :reflect:
 
Dein Gast kennt die bar1,
wenn dem entsprechend in der leave() Methode
bar=null; also deine Bar gleich null gesetzt wird
vergißt dein Gast praktisch die Bar.
Er kann die bar.getStage() auch nicht mehr fragen wie die Stage von der bar lautet.
Deshalb erst danach, denn dann kann der Gast noch bar.getStage(); ausführen denn er verwendet als Bar, die von dir in der Mainclass erstellte bar1. Der Gast führt sozusagen bar1.getStage() aus.

Wenn erst null gesetzt wird würde das ganze so aussehen:
bar=null
bar.getStage(); -> Gast kennt gar keine Bar mehr null.getStage() --> NullPointer...
 
Aufgabe 1 ist damit erledigt.

Jetzt versuche ich gerade Aufgabe 2, da hakt es schon wieder.


Meine bisherigen Ideen:

Ergänze in der Klasse Bar:

Java:
// Liefert ganzzahlige Zufallszahlen zwischen min (inklusive) und max (inklusive), also aus [min, max].
	
	public static int zufallszahlen(int min, int max) {   
		    max++;   
		    return (int) (Math.random() * (max - min) + min);   
		} 
	
	
	public void order(Drink drink, Guest guest){
		int c;
		c=zufallszahlen(0, getSizeOfListOfWaiter()-1);
		waiter.get(c).serve(drink, guest);
	}

Ergänze in der Klasse Guest:

Java:
public void give(Drink drink){
	alcoholLevel=alcoholLevel+drink.getAlcoholLevel();
}

...

public String doSomething(){
   double a=Math.random();
   
     if(a<0.5){
    leave();	 
    return "verlaesst Bar.";
    	 
   }
     
    if(a>=0.5){
    	bar.order(Menu.cola, this);
    	
    return "bestellt Getraenk";	
    }
     return "-";
     
}
 
 
}


Ergänze in der Methode Waiter:

Java:
public void serve(Drink drink, Guest guest){
	
}

Außerdem die Klasse Drink:

Java:
public class Drink{
	
	String name;
	double cost;
	double alcoholLevel;
	
	public Drink(String name, double cost, double alcoholLevel){
		this.name=name;
		this.cost=cost;
		this.alcoholLevel=alcoholLevel;
	}
	
	
	public double getAlcoholLevel(){
		return alcoholLevel;
	}
}

und die Klasse Menu:

Java:
public class Menu{
	
	static Drink cola=new Drink("cola", 2, 0);
	static Drink bier=new Drink("bier", 3, 7);
	static Drink wasser=new Drink("wasser", 1, 0);
	static Drink rum=new Drink("rum", 5, 12);
	
	
	
	
	
}


Vielleicht helft ihr mir ja auch bei Aufgabe 2.

Es klappt zwar irgendwie, aber bisher habe ich nur realisiert, dass bei einem der drei Gäste meiner Bar "bestellt ein Getränk" ausgegeben werden kann.

Aber soll man nicht auch ausgeben welches Getränk und dass der Gast bezahlt?
 
Zuletzt bearbeitet von einem Moderator:
Fehler erscheinen da keine!

Aber ich bin damit nicht zufrieden, einfach nur auszugeben: "bestellt Getränk".


Wozu die Methode serve bei Waiter, wozu die verschiedenen Getränke in Menu:

Man soll doch bestimmt auch ausgeben: welches Getränk und dass bezahlt wird und welcher zufällig ausgewählte Kellner bedient??!???:L
 
Ich weiß aber nicht, wie ich das Getränk zufällig auswählen kann und an den Preis und den zufällig ausgewählten Kellner komme!

Die Methode serve ist doch so auch nicht vollständig...
 
Dann nimmst du für die Getränke die Datenstruktur: Array,Liste oder ArrayList oder sowas in der Richtung.
Dann kannst du mit Random eine Ganzzahligezufallszahl ermitteln und dann genau das Getränk aus der Liste bestellen. Wenn du essen gehst, sagst du dem Keller doch auch ich hätte gerne die Nummer 67 oder soetwas in der Richtung
 
Das habe ich ja versucht:

Java:
public class Menu{
	
	static Drink cola=new Drink("cola", 2, 0);
	static Drink bier=new Drink("bier", 3, 7);
	static Drink wasser=new Drink("wasser", 1, 0);
	static Drink rum=new Drink("rum", 5, 12);
	
	Drink[] getraenke=new Drink[4];
	
	getraenke[0]=cola;
	getraenke[1]=bier;
	getraenke[2]=wasser;
	getraenke[3]=rum;
	
	
	
}

Und dann:

Java:
public String doSomething(){
   double a=Math.random();
   
     if(a<0.5){
    leave();	 
    return "verlaesst Bar.";
    	 
   }
     
    if(a>=0.5){
    	
    	int b=bar.zufallszahlen(0, 3);
    	bar.order(Menu.getraenke[b], this);
    	
    return "bestellt Getraenk";	
    }
     return "-";
     
}

Es kommt aber folgende Fehlermeldung: s. Screenshot
 
Okay, habe es jetzt hinbekommen, dass das bestellte Getränk angezeigt wird.

Jetzt versuche ich noch anzuzeigen, welcher zufällig ausgewählte Kellner das Getränk bringt und dass der Gast das Getränk dann trinkt.
 
Naja, die Getränke auf der Menükarte static zu machen finde ich ganz in Ordnung. Man kann argumentieren, dass diese sich eben nicht ändern und gleich Konstanten (static final) sein können.
 
Ich selbst wäre wohl auch nicht darauf gekommen, sie static zu setzen; die Aufgabe wünscht es so.


Ich möchte mich an dieser Stelle übrigens sehr herzlich für die Hilfe bedanken.
 

Zurück
Oben