Zum Inhalt springen

Objekte beim Erzeugen zufällig benennen


Empfohlene Beiträge

Geschrieben

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 :)

Geschrieben

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

Geschrieben

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.

Geschrieben (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 von srea
Fehler rauseditiert
Geschrieben

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:

Geschrieben (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 von srea
kurze Ergänzung
Geschrieben

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.

Geschrieben

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?

Geschrieben
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.

Geschrieben

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 );

}

Geschrieben

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?

Geschrieben

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 :P

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.

Geschrieben

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)

Geschrieben
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?

Geschrieben

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

Geschrieben (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 von Saladplus
Geschrieben

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();

}

}

Geschrieben


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();

    }

}

Geschrieben (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 von Dragon8

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...