Hallo,
ich habe die SuFu benutzt und allgemein viel Gegoogelt, aber leider nie genau das gefunden, was ich gemeint habe. Es könnte auch daran liegen, dass ich mir zu diesem Zeitpunkt nicht einmal genau sicher bin ob ich mit Objekten den richtigen Begriff benutze - nun ja.
Ich habe für die Uni ein Programm geschrieben mit 3 Datein - Arena, Gladiator und Würfel. Sie enthalten die jeweiligen Konstruktoren und die Funktion ist einwandfrei. Gladiator wird mit gewissen Rüstungs, Angriffs und ähnlichen Werten erstellt und durch eine Math.Random in den Würfeln werden Rundenbasiert Schläge ausgetauscht.
Nun zu meiner Frage:
in Arena öffne ich in der Methode starteKampf() die Methode attacke() welche sich in Gladiator befindet mit dem Namen des Angreiffers (_glad1.attacke). Da ich ja diese Attacke mit diesem Objekt ausführe habe ich ja auch nur diese Werte von _glad1 drin.
Gibt es eine Möglichkeit wie ich jetzt in der Methode attacke noch auf _glad2-Werte zugreifen kann ? im Sinne von irgendwie "_glad2 get Element ´By ID ('name')" o.ä.
Kleiner Hinweis:
Ihr helft mir nicht bei meiner Abgabe - der Auftrag ist schon komplett erledigt. Es interessiert mich nur persönlich und ich hatte dieses Problem schon ein paar mal
Danke im Vorraus und entschuldigung für den langen evtl. unnötigen Text
Moin,
ohne den Code kann ich nur diffus antworten:
Wenn ich Dich richtig verstehe, erstellst Du doch ein Objekt "Gladiator _glad1" und machst was damit, richtig?
(a) Was spricht nun gegen ein zweites Objekt "Gladiator _glad2" ???
(b) Du hast schon 'irgendwo' das zweite Objekt "Gladiator _glad2"? Dann sollte es vor Dir geschriebene Gette und Setter für die Eigenschaften enthalten, wie naürlich "Gladiator _glad1" auch !!
Ich vermute mal folgenden Zweck: Der eine haut dem anderem eins auf die Kapuze.
Also müsstest du entweder die Methode attacke() erweitern und den Gegner übergeben.
Also: _glad1.attacke(_glad2);
oder du hast in der Arena eine Methode kämpfen, in der Art: kampf(_glad1, _glad2);
Hi danke für die antwort.
ist denke ich allgemein viel Code und ich war mir nicht sicher was gebraucht wird, aber ich glaube ich habe echt zu kompliziert gedacht (leicht peinlich) und vollkommen vergessen, dass ich einen getter benutzen kann ^^
Java:
publicbooleannehmeSchaden(int tp){
tp = tp - _rs;
_le = _le - tp;if(_le<5 && _le>0){System.out.println("");System.out.println("");System.out.println("Gladiator "+_name+" ist Bewusstlos und kann nicht mehr weiter kämpfen.");System.out.println("");returntrue;}elseif(_le<=0){System.out.println("");System.out.println("");System.out.println("Gladiator "+_name+" ist Tod und kann nicht mehr weiter kämpfen.");System.out.println("");returntrue;}elsereturnfalse;}
Wenn ich hier einfach ne Ausgabe möchte in der Art " Gladiator 2 gewinnt " - dann brauch ich ja eig nur schreiben: System.out.print(_glad2.getGladName()+" gewinnt.");
Wenn ich mich nach Vfl_Freak's NAchricht nicht irre ?!
oha - bitte verabschiede Dich ganz schnell von Variablennamen wie 'tp', '_rs', '_le' usw.
Da blickst Du selbst bald nicht mehr durch !!
Stichwort "sprechende Bezeichner" !!
Wir können jetzt nur raten in welcher Klasse diese Methode steht, ich nehme mal an in Gladiator.
Steht dir denn in der Klasse Gladiator das Objekt _glad2 zur Verfügung? Ich hoffe nicht und ohne wird es nicht funktionieren.
Du hast einen kleinen Denkfehler in deinem Design: Die Klasse Gladiator kann ruhig auf die Konsole schreiben wenn der Gladiator nicht mehr fähig ist weiterzukämpfen. Welcher aber den Kampf gewonnen hat sollte die Klasse Arena entscheiden/ausgeben.
Um das zu realisieren wäre wie mariane schon gesagt hat eine Methode "kampf(Gladiator glad1, Gladiator glad2)" in der Klasse Arena passend.
Pseudocode:
Java:
publicvoidkampf(Gladiator gladiator1,Gladiator gladiator2){while(gladiator1 ist am leben && gladiator2 ist am leben){// kampflogik wer wen schlägt usw.// sowas wie gladiator1.attacke(gladiator2);}if(gladiator1 ist tot && gladioator 2 ist tot){
ausgabe -> unentschieden;}elseif(gladiator1 ist tot){
ausgabe -> gladiator2 hat gewonnen;}else{
ausgabe -> gladiator1 hat gewonnen;}}
Und wie Klaus schon sagt verwende sprechende Namen (egal ob für Attribute, Methoden, Klassen oder Variablen). Und vermeide "_" als Prefix einer Variable, keine Ahnung wozu das gut sein soll.
naja, mein Prof für OOSE hat das so gemacht und wir sollten diese Namen übernehmen ^^. Er macht das überall, wenn er ein Konstruktor anlegt - ich denke, weil er oftmals später 'name' als übergabe benutzt und so unterscheiden kann zwischen alten und neuen variablen.
Und danke für den Hinweis mit dem Gladiator @ Joose. ja der Code den ich kopiert hatte stand in der Klasse Gladiator und er muss in der Arena ausgegeben werden, da dort _glad2 erst erstellt wird.
Wie am Anfang beschrieben habe ich den Kampf und die Ausgabe und alles - auch so, dass sobald ein Gladiator tot ist, der andere nicht mehr zuschlagen kann. uach wenn es nicht schön geschrieben ist
Falls es jemand möchte kann ich gerne auch mal die 3 Dateien hier hoch schicken.
Aber ich denke ihr habt mein Problem gelöst - Danke
naja, mein Prof für OOSE hat das so gemacht und wir sollten diese Namen übernehmen ^^. Er macht das überall, wenn er ein Konstruktor anlegt - ich denke, weil er oftmals später 'name' als übergabe benutzt und so unterscheiden kann zwischen alten und neuen variablen.
Dann sag deinem Prof das ist ein schlechter Stil, erspart vielleicht etwas Schreibarbeit. Aber er soll sich den Code dann in einem Jahr wieder anschauen und überlegen für was die Variablen stehen
Und normalerweise bieten IDE eine Autovervollständigung an um nicht immer die ganzen Variablennamen schreiben zu müssen.
Um zwischen einen Parameter bzw. lokalen Variable und einem Instanzattribut zu unterscheiden sollte man mit this.[Name des Attributs arbeiten.