Saladplus Geschrieben 30. März 2010 Geschrieben 30. März 2010 Hey, ich lerne seit etwa einem Jahr mit dem Programm Blue J das Programmieren mit Java. Jetzt, in den Ferien, wollte ich mal ein etwas größeres Programm selber schreiben. Es handelt sich um eine "Tower Simulation" in der man die Aufgaben eines Fluglotsen übernimmt. Mein großes Problem ist: ich will einen Befehl schreiben, der in zufälligen Abständen immer neue Flugzeuge erzeugt, damit nicht irgendwann kein "Nachschub" mehr vorhanden ist. Wie ich den Befehl an sich schreibe, weiß ich, das Problem ist, ich weiß nicht, wie ich die erzeugten Flugzeuge benennen soll. Ich hatte daran gedacht, an den Objektnamen eine Variabel zu hängen (zB. FlugzeugX) die mit jedem erzeugten Flugzeug um 1 größer wird. (also Flugzeug1, Flugzeug2...) Aber das scheitert daran, dass ich nicht weiß, wie ich das im Programm schreiben soll. Denn wenn ich zB. schreibe X = 1, dann erkennt das Programm das X am ende vom Namen vom Flugzeug (FlugzeugX) nicht als Variabel. Könnte mir jemand erklären, wie ich sagen kann, dass X eine Variabel ist, die an dem Namen angehängt ist? Ich hoffe, ich habe mein Problem deutlich erklärt, wenn nicht, bitte nachfragen Für schnelle Antworten wäre ich sehr dankbar Zitieren
srea Geschrieben 30. März 2010 Geschrieben 30. März 2010 Hallo Saladplus, wie wäre es wenn du die Objekte in ein Objektarray schreibst? Bsp[] arr_bsp = new Bsp[10]; Bsp bsp= new Bsp; arr_bsp[0] = bsp; Ich hoffe ich habe deine Frage halbwegs richtig verstanden und vielleicht sogar weiterhelfen können. Grüße srea Zitieren
Saladplus Geschrieben 30. März 2010 Autor Geschrieben 30. März 2010 Danke für die schnelle Antwort. Verzeih mir die Frage, aber was ist ein Objektarray? bin halt noch ein Anfänger... würd mir schon reichne wenn ich wüsste was das bedeutet, und wofür die Abkürzungen stehen. Zitieren
srea Geschrieben 30. März 2010 Geschrieben 30. März 2010 (bearbeitet) Verzeih mir die Frage, aber was ist ein Objektarray? bin halt noch ein Anfänger... würd mir schon reichne wenn ich wüsste was das bedeutet, und wofür die Abkürzungen stehen. Kein Problem, ich versuche es zu erklären. Ein Objektarray ist eigentlich ein normales Array, das jedoch nicht mit Elementen von Standarddatentypen (int etc.) "gefüllt wird", sondern eben mit Objekten selbstdefinierter Datentypen. Der kleine Code Ausschnitt ist lediglich Pseudo-Code. "Bsp" steht dabei einfach für Beispiel und das solltest du durch deine Bezeichnungen der Objekte usw ersetzen. Bei weiteren Fragen oder wenn es unverständlich ist einfach nochmal nachfragen! Bearbeitet 30. März 2010 von srea Fehler rauseditiert Zitieren
Saladplus Geschrieben 30. März 2010 Autor Geschrieben 30. März 2010 Ich bin mir aber nicht ganz sicher, ob das mein Problem löst... also ich versuchs nochmal zu erklären: dadurch dass ich nicht sofort die verschiedenen Flugzeuge erzeuge sondern erst im Verlauf des Spiels, kann ich ja nicht einfach sagen dass das erste Objekt Flugzeug1 heißt usw.. ich dachte mir, ich könnte einen Befehl schreiben, bei dem eine Zahl (zB. X) mit jedem erzeugten Flugzeug um 1 addiert wird. das is ja auch noch kein Problem, jetzt muss ich nur wissen wie ich dem Programm sag, dass das 6. erzeugte Flugzeug (also in dem Fall X=6) in den Namen Flugzeug6 umbenannt wird. gibts da irgendeine Schreibweise dafür? also irgendwie Flugzeug(int X) oder Flugzeug[int X] oder oder oder... sorry, vllt bin ich auch nur schwer von begriff:rolleyes: Zitieren
srea Geschrieben 30. März 2010 Geschrieben 30. März 2010 (bearbeitet) Vielleicht steh auch einfach ich auf dem Schlauch. Wenn du das ganze so machst wie ich es vorgeschlagen habe, erzeugst du am Anfang ein Array in das du deine Flugzeuge schreibst. Mal angenommen deine "Flugzeugklasse" heisst auch Flugzeug, dann wäre das Array Flugzeug[] arr_flugzeug = new Flugzeug[]; Nun erzeugst du ein erstes "Flugzeugobjekt" Flugzeug flugzeug = new Flugzeug(); und schreibst das dann in dein Array Flugzeug[0] = flugzeug; Nun sind deine fortlaufenden Zahlen eben nicht im Objektnamen sondern sind die Stelle im Array. So kannst du ein Array befüllen und später mit zum Beispiel Flugzeug[0].methode(); etwas damit anstellen, als wäre es ein normales Objekt. Verstehst du halbwegs was ich meine? Ich glaub das du so dein Problem ganz gut lösen kannst. Bearbeitet 30. März 2010 von srea kurze Ergänzung Zitieren
Ulfmann Geschrieben 30. März 2010 Geschrieben 30. März 2010 Du kannst eine Variable nicht erzeugen wie einen String, sodass Du einen Namensteil hast, der sich immer ändert. Versuch mal, den Compiler zu verstehen: Es geht nicht, dass Du sagst "Ok, bau mir ein Objekt, aber wie es heißen soll, erfährst Du später." Du bennenst ja - vereinfacht formuliert - eine Speicherstelle für ihn. Warum überschreibst Du nicht immer ein und das selbe Flugzeug? So sparst Du Dir auch denUmweg mit dem Array (edit: der außerdem vorweg eine feste Größe braucht). Flugzeug flugzeug; //nur deklariert for (int i = 0; i < 100000; i++) { flugzeug = new Flugzeug(); flugzeug.fliegWeg(); flugzeug.machIrgendwas(); //Abbruchbedingung } So hast Du immer ein Neues. Zitieren
Saladplus Geschrieben 30. März 2010 Autor Geschrieben 30. März 2010 das mit dem Überschreiben geht nicht, da ich mehrere Flugzeuge aufeinmal haben will, würd ich den Namen einfach überschreiben wäre nur immer ein Flugzeug erzeugt, oder..? Danke srea, ich werd versuchen deinen Vorschlag umzusetzen... eine Frage noch: ich habe noch nie mit arrays gearbeitet... ist das eine klasse, die ich erst noch schreiben/erzeugen muss? Zitieren
srea Geschrieben 30. März 2010 Geschrieben 30. März 2010 das mit dem Überschreiben geht nicht, da ich mehrere Flugzeuge aufeinmal haben will, würd ich den Namen einfach überschreiben wäre nur immer ein Flugzeug erzeugt, oder..? Danke srea, ich werd versuchen deinen Vorschlag umzusetzen... eine Frage noch: ich habe noch nie mit arrays gearbeitet... ist das eine klasse, die ich erst noch schreiben/erzeugen muss? Nein, du musst nichts erst selbst schreiben um ein Array zu machen. Ein Array ist ein Objekt, dass du einfach so erzeugen kannst. Allerdings kann das angesprochene Problem noch auftauchen, dass Arrays mit einer bestimmten Größe erzeugt werden müssen. Hier wäre eine Alternative eine ArrayList zu verwenden. Zitieren
Saladplus Geschrieben 30. März 2010 Autor Geschrieben 30. März 2010 array list? :confused: also wär das sowas wie eine abstrakte klasse der Klasse array, in der die feste Größe immer mit 1 addiert wird? oder wie muss ich mir das vorstellen? Zitieren
lupo49 Geschrieben 30. März 2010 Geschrieben 30. März 2010 Du kannst es bspw. so Flugzeug flugzeug; //nur deklariert Flugzeug[] hangar = new Flugzeug[100000]; for (int i = 0; i < 100000; i++) { flugzeug[i] = new Flugzeug(); } oder mittels Arraylist import java.util.ArrayList; ArrayList<Flugzeug> hangar = new ArrayList<Flugzeug>(); for(int i = 0; i < 100000; i++) { Flugzeug flugzeug = new Flugzeug(); hangar.add( flugzeug ); } Zitieren
srea Geschrieben 30. März 2010 Geschrieben 30. März 2010 Hmm, nach einem Jahr Java noch nichts von Arrays und ArrayListen gehört? Fertigen Code anbieten erzielt meist nicht so den Lerneffekt. So wie lupo49 das geschrieben hat hätte ich es auch gemacht. Java ist auch eine Insel zu Arrays Java ist auch eine Insel zu ArrayList Zitieren
Saladplus Geschrieben 30. März 2010 Autor Geschrieben 30. März 2010 ich schreibe grade ein test Programm, um das mit der arrayList hinzubekommen... einfacher Aufbau: mehrere Kreise werden im Verlauf des Programms an zufälligen Stellen erzeugt. Mit der Maus kann man dann immer einen Kreis aktivieren. Den Befehl zum "Benennen" jedes neuen Kreises habe ich jetzt so geschrieben: ArrayList<Kreis> liste = new ArrayList<Kreis>(); for(int i = 0; i < 100000; i++) { Kreis hatKreis = new Kreis(); liste.add(hatKreis); } wie kann ich jetzt den einzelnen Kreisen, die bereits erzeugt wurden Befehle schicken? Zitieren
flashpixx Geschrieben 30. März 2010 Geschrieben 30. März 2010 dadurch dass ich nicht sofort die verschiedenen Flugzeuge erzeuge sondern erst im Verlauf des Spiels, kann ich ja nicht einfach sagen dass das erste Objekt Flugzeug1 heißt usw.. ich dachte mir, ich könnte einen Befehl schreiben, bei dem eine Zahl (zB. X) mit jedem erzeugten Flugzeug um 1 addiert wird. das is ja auch noch kein Problem, jetzt muss ich nur wissen wie ich dem Programm sag, dass das 6. erzeugte Flugzeug (also in dem Fall X=6) in den Namen Flugzeug6 umbenannt wird. Sei doch einfach faul Jedes Objekt in Java bekommt die Methode "toString()" von "Object" vererbt, wenn man die nicht selbst implementiert, dann liefert sie einen eindeutiger Hash der das Objekt indentifiziert. Zitieren
Saladplus Geschrieben 30. März 2010 Autor Geschrieben 30. März 2010 das heißt ich müsste einfach eine ansteigende Zahl zB. X als Parameter für die Klasse Flugzeug übergeben und im Konstruktor der Klasse toString(X) schreiben? würde das gehen? Zitieren
lilith2k3 Geschrieben 30. März 2010 Geschrieben 30. März 2010 Wo ist das Problem? Im Grunde ist das, was Du willst, mittels eines Klassenattributs zu lösen. Du implementierst einfach einfach einen Objektzähler, der Dir die Anzahl der Objekte festhält und im Konstruktor zu jedem Objekt wird der Zähler inkrementiert und als String an den Namen des Flugzeugs angehängt, so heißen Deine Flugzeuge alle durchnummeriert, wie Du es haben möchtest. (Was natürlich noch keine Verwaltungsstruktur darstellt, mit der Du die Flugzeuge auch namentlich anspechen kannst - dazu wäre evtl. ein assoziatives Array nützlich, wo Du den Namen als Schlüssel und einen Verweis auf Dein Objekt als Wert hinterlegst; dann könntest Du die Flugzeuge namentlich ansprechen) Zitieren
Saladplus Geschrieben 30. März 2010 Autor Geschrieben 30. März 2010 Wo ist das Problem? Im Grunde ist das, was Du willst, mittels eines Klassenattributs zu lösen. Du implementierst einfach einfach einen Objektzähler, der Dir die Anzahl der Objekte festhält und im Konstruktor zu jedem Objekt wird der Zähler inkrementiert und als String an den Namen des Flugzeugs angehängt, so heißen Deine Flugzeuge alle durchnummeriert, wie Du es haben möchtest. Genau das will ich! und das hab ich auch die ganze Zeit schon versucht, aber wie muss ich den Befehl schreiben, dass der String an den Namen angehängt wird? Zitieren
Saladplus Geschrieben 30. März 2010 Autor Geschrieben 30. März 2010 wobei... bedeutet: (Was natürlich noch keine Verwaltungsstruktur darstellt, mit der Du die Flugzeuge auch namentlich anspechen kannst - dazu wäre evtl. ein assoziatives Array nützlich, wo Du den Namen als Schlüssel und einen Verweis auf Dein Objekt als Wert hinterlegst; dann könntest Du die Flugzeuge namentlich ansprechen) dass ich im prinzip gar nicht die objekte unterscheiden kann? weil das muss ich ja können um zu sagen dass genau dieses eine Flugzeug das ich aktivieren will auch aktiviert wird Zitieren
flashpixx Geschrieben 30. März 2010 Geschrieben 30. März 2010 dass ich im prinzip gar nicht die objekte unterscheiden kann? weil das muss ich ja können um zu sagen dass genau dieses eine Flugzeug das ich aktivieren will auch aktiviert wird Dann ist eine HashMap das richtigt HashMap (Java 2 Platform SE v1.4.2) ein assoziatives Array in Java ist eben genau die HashMap bzw eine entsprechende Collection Zitieren
Saladplus Geschrieben 30. März 2010 Autor Geschrieben 30. März 2010 (bearbeitet) hmmm oh man... ich sitze jetzt seit 10 Uhr an diesem Problem un komm keinen Schritt weiter :upps ich glaub ich bin einfach zu dumm -,- könnte mir vllt jemand schnell ein Beispiel Programm schreiben, in dem nach und nach zB mehrere Kreise erzeugt werden und die Kreise mit sich verändernden Zahlen benannt werden (1. erzeugter Kreis = Kreis1 2. erzeugter Kreis = Kreis 2, oder so etwas). Weil ich krieg es echt nicht mehr alleine hin... ich will einfach nur wissen wie ich mehrere Objekte im Verlauf des Spiels erzeugen und sie alle anders benennen kann, damit ich jedes beliebige Objekt auch ansprechen kann. Wenn sich jemand die paar Minuten nehmen würde, wär das echt Klasse. Denn ich bin langsam am verzweifeln... alles andere in meinem Programm könnte ich (theoretisch) programmieren... das lässt mir grad keine Ruhe Vielen Dank schonmal Bearbeitet 30. März 2010 von Saladplus Zitieren
Saladplus Geschrieben 30. März 2010 Autor Geschrieben 30. März 2010 Und nocheinmal ich, sorry für die vielen Fragen, aber ich brenne darauf mein Programm fertig zu stellen, und im Prinzip ist es fertig, mir fehlt nur dieser entscheidende Teil mit dem benennen... Ich habe mal ein Testprogramm geschrieben (so wie im letzten Beitrag beschrieben mit den Kreisen) ich weiß, dass die Bezeichnungen und schreibweisen nicht unbedingt den Richtlinien entsprechen, aber es ist nur ein Testprogramm. Könnte vielleicht jemand drüber schauen und mir erklären, wie ich jeden neu dazukommenden Kreis einen eigenen individuellen Namen geben kann, sodass ich die einzelnen Kreise auch beliebig aktivieren kann? Das Hauptprogramm: import sum.werkzeuge.*; import sum.kern.*; /** * @author * @version */ public class Test2 { // Objekte Kreis hatKreis; Kreis aktiverKreis; Rechner meinRechner; Bildschirm derBildschirm; Stift meinStift; Uhr dieUhr; Maus hatMaus; // Konstruktor public Test2() { derBildschirm = new Bildschirm(300, 300); meinRechner = new Rechner(); dieUhr = new Uhr(); hatMaus = new Maus(); aktiverKreis = null; } // Dienste public void fuehreAus() { do { hatKreis = new Kreis(); hatKreis.bewegeBis(meinRechner.ganzeZufallszahl(0, derBildschirm.breite()), meinRechner.ganzeZufallszahl(0, derBildschirm.hoehe())); hatKreis.zeichne(); dieUhr.warte(5000); if(meinRechner.wurzel(meinRechner.quadrat(hatMaus.hPosition() - hatKreis.hPosition()) + meinRechner.quadrat(hatMaus.vPosition() - hatKreis.vPosition())) < 10) { aktiverKreis = null; aktiverKreis = hatKreis; hatKreis.aktiviere(); } }while(!hatMaus.doppelKlick()); } } Und jetzt noch die Klasse Kreis: import sum.kern.*; /** * @author * @version */ public class Kreis { // Objekte Bildschirm kenntBildschirm; Buntstift meinStift; // Konstruktor public Kreis() { meinStift = new Buntstift(); } // Dienste public void zeichne() { meinStift.zeichneKreis(5); } public void aktiviere() { meinStift.setzeFarbe(Farbe.ROT); } public void deaktiviere() { meinStift.setzeFarbe(Farbe.SCHWARZ); } public void bewegeBis(int pH, int pV) { meinStift.bewegeBis(pH, pV); } public double hPosition() { return meinStift.hPosition(); } public double vPosition() { return meinStift.vPosition(); } } Zitieren
Saladplus Geschrieben 30. März 2010 Autor Geschrieben 30. März 2010 import sum.werkzeuge.*; import sum.kern.*; /** * @author * @version */ public class Test2 { // Objekte Kreis hatKreis; Kreis aktiverKreis; Rechner meinRechner; Bildschirm derBildschirm; Stift meinStift; Uhr dieUhr; Maus hatMaus; // Konstruktor public Test2() { derBildschirm = new Bildschirm(300, 300); meinRechner = new Rechner(); dieUhr = new Uhr(); hatMaus = new Maus(); aktiverKreis = null; } // Dienste public void fuehreAus() { do { hatKreis = new Kreis(); hatKreis.bewegeBis(meinRechner.ganzeZufallszahl(0, derBildschirm.breite()), meinRechner.ganzeZufallszahl(0, derBildschirm.hoehe())); hatKreis.zeichne(); dieUhr.warte(5000); if(meinRechner.wurzel(meinRechner.quadrat(hatMaus.hPosition() - hatKreis.hPosition()) + meinRechner.quadrat(hatMaus.vPosition() - hatKreis.vPosition())) < 10) { aktiverKreis = null; aktiverKreis = hatKreis; hatKreis.aktiviere(); } }while(!hatMaus.doppelKlick()); } } import sum.kern.*; /** * @author * @version */ public class Kreis { // Objekte Bildschirm kenntBildschirm; Buntstift meinStift; // Konstruktor public Kreis() { meinStift = new Buntstift(); } // Dienste public void zeichne() { meinStift.zeichneKreis(5); } public void aktiviere() { meinStift.setzeFarbe(Farbe.ROT); } public void deaktiviere() { meinStift.setzeFarbe(Farbe.SCHWARZ); } public void bewegeBis(int pH, int pV) { meinStift.bewegeBis(pH, pV); } public double hPosition() { return meinStift.hPosition(); } public double vPosition() { return meinStift.vPosition(); } } Zitieren
Dragon8 Geschrieben 31. März 2010 Geschrieben 31. März 2010 (bearbeitet) Du hängst dich viel zu sehr daran fest, dass du jedes einzelne neue Objekt was du erzeugst, egal ob nun Flugzeuge oder Kreise, mit jeweils einem eigenem Namen ansprechen willst. Das geht so in Java NICHT! Dir wurden jetzt hier im Laufe des Threads schon mehre Lösungen für dein Problem angeboten, diesen solltest du auch nachgehen und nicht an deiner Vorstellung festhalten, du könntest das lösen indem du in irgendeinerweise dynamisch Variablennamen erzeugst. Wenn du mehrere Objekte des selben Typs erzeugen und speichern willst, zum Beispiel in einer Schleife, dann ist das grundlegenste was du dafür kennen musst, Arrays. Also möchtest du folgenden Link lesen und versuchen zu verstehen: Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 3.10 Arrays Wenn du verstanden hast was und wofür Arrays gut sind, könntest du dein Programm schon fertig schreiben. Wenn du aber anfangs nie weißt wie viele Flugzeuge genau im Laufe deines Programmablaufes erzeugt werden, wirst du irgendwann darauf stoßen dass man bei Arrays immer eine zum Zeitpunkt der Erzeugung eindeutige Größe festlegen muss. Um sich selber die Arbeit zu ersparen um dieses Problem herum zu arbeiten, kann man eine der Listen-Klassen benutzen die von der Standardbibliothek angeboten werden. Das heißt, nachdem du verstanden hast was Arrays sind, möchtest du folgenden Link unbedingt gründlich lesen und verstehen: Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 12.3 Listen Wenn du dann immer noch der Meinung bist, es wäre schön wenn du deine Objekte über einen bestimmten String ansprechen willst, dann kannst du dir danach auch noch das Kapitel für "Assoziative Speicher" zur Gemüte führen: Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 12.8 Assoziative Speicher Das wird alles nicht in 5 - 10 Minuten erledigt sein, wenn du das richtig verstehen willst. Ich würde dir aber dringends empfehlen dir die Zeit zu nehmen und das in ungefähr der Reihenfolge abzuarbeiten. Du kannst dein Programm zwar wahrscheinlich auch fertig bekommen wenn du gleich zum letzten Schritt springst, den Lerneffekt halte ich dabei dann aber für sehr gering. Und soweit ich das mitbekommen habe, machst du die Aufgabe ja eigentlich auch nur um was zu lernen. Bearbeitet 31. März 2010 von Dragon8 Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.