Eine Instanzvariable und zwei Objekte

E

Enilno

Mitglied
Hallo Zusammen,
ich bin ein absoluter Anfänger und soll in einer Hausarbeit eine Aufgabe lösen die mich zum verzweifeln bringt. Leider habe ich weder hier im Forum noch durch Google-Suche etwas gefunden.
Folgendes Problem:
Es wird eine Funktion "public boolean boxen(Human gegner)" vorgegeben (Human beinhaltet einen String name und einen int age).
Dazu werden zwei Objekte (Boxer) erstellt. Diese sollen jetzt gegeneinander antreten z.B. BoxerA.boxen(BoxerB). Es darf nicht geboxt werden wenn, der "gegner" bereits geboxt hat, der "gegner" != null ist und nicht gegen sich selbst geboxt wird. Die Ausgabe sollte folgendes anzeigen: BoxerA hat gegen BoxerB geboxt (und jetzt das Problem) BoxerB hat gegen BoxerA geboxt. Ich bekomme aber nur entweder BoxenA hat gegen BoxerB geboxt ODER BoxerB hat gegen BoxerA geboxt. Je nachdem ob ich BoxerA.boxt(BoxerB) ODER BoxerB.boxt(BoxerA) eingebe. Da der entsprechende Gegner in die "gegner" Variable geschrieben wird. Jetzt könnte ich natürlich einfach beides hinschreiben, ist aber offensichtlich nicht Zweck der Übung. Anbei noch der Code, der zum größten Teil vorgegeben ist.
Java:
package Qual;


//Ein Mensch
public class Human{

      
    //Erzeugt einen neuen Menschen mit angegebenen Namen und Alter
    public Human(String name, int age){
        this.name = name;
        this.age = age;
    }
      
    //gibt den Namen zurueck
    public String getName() {
        return name;
    }
  
    //gibt das Alter zurueck
    public int getAge() {
        return age;
    }
      
  
    // hier ist das ganze Übel
    public boolean marry(Human gegner{      
      
              
        try{
        if (getName().equals(gegner.getName())){return false;}
        }
      
        catch (NullPointerException e){return false;}
      
        this.gegner = gegner;
        return true;
    }
  
      
    //Name dieses Menschen
    protected String name;
  
    //Aktuelles Alter
    protected int age;
  
    //Der Gegner
    protected Human gegner;
  
    public Human getGegner() { return gegner; }
      
    //Gibt eine Beschreibung des Kampfes aus
    public String toString(){
        String ret = name + getAge();
        if (gegner!=null)
            ret += "; boxte mit " + partner.getName();  
    }
  

}


public class TestKampf{
    public static void main(String[] args){
        Human boxerA = new Human("Rocky", 25);
        Human boxerB = new Human("Creed", 27);
      
        if (!boxerA.boxen(BoxerB)){
            System.out.println("Keine Kampf");
        }
      
        System.out.println(BoxerB);
        System.out.println(BoxerA);
}

Bin schon total verzweifelt obwohl die Lösung wohl wie immer einfach ist. :-(
 
Zuletzt bearbeitet:
E

Enilno

Mitglied
Das ging ja super schnell, danke für den Tipp.
Kannst du mir evtl. noch zeigen wie es aussehen sollte?
 
stg

stg

Top Contributor
Hier setzt du bei this den Gegner.
Java:
this.gegner = gegner;
Den Gegner des Gegners kannst du ganz ähnlich setzen
Java:
gegner.gegner = this;
 
X

Xyz1

Gast
Hier mal ein wunderbares Beispiel:
Java:
/**
 * @author
 */
public class Boxer {
    public static final Object obj = new Object();
    public final char chr;
    public int schlag = 1;

    public Boxer(char chr) {
        this.chr = chr;
    }

    public void boxt(Boxer b) {
        synchronized (obj) {
            while (schlag > 3) {
                try {
                    obj.wait();
                } catch (InterruptedException ie) {
                    ie.printStackTrace();
                }
            }
            System.out.println(this + " boxt " + b + " um " + System.currentTimeMillis() / 1000 % 1000 + " Schlag: " + schlag++);
            b.schlag = 1;
            obj.notifyAll();
        }
        try {
            Thread.sleep((1000 - System.currentTimeMillis() % 1000) * schlag);
        } catch (InterruptedException ie) {
            ie.printStackTrace();
        }
    }

    @Override
    public String toString() {
        return "" + chr;
    }

    public static void main(String[] args) {
        Boxer a = new Boxer('A'), b = new Boxer('B');
        Runnable r1 = () -> {
            while (true) {
                a.boxt(b);
            }
        };
        Runnable r2 = () -> {
            while (true) {
                b.boxt(a);
            }
        };
        new Thread(r1).start();
        new Thread(r2).start();
    }
}

Code:
B boxt A um 520 Schlag: 1
B boxt A um 521 Schlag: 2
A boxt B um 521 Schlag: 1
A boxt B um 522 Schlag: 2
A boxt B um 523 Schlag: 3
B boxt A um 523 Schlag: 1
B boxt A um 524 Schlag: 2
A boxt B um 525 Schlag: 1
A boxt B um 526 Schlag: 2
B boxt A um 526 Schlag: 1
B boxt A um 527 Schlag: 2
A boxt B um 528 Schlag: 1
A boxt B um 529 Schlag: 2
B boxt A um 529 Schlag: 1
B boxt A um 530 Schlag: 2
A boxt B um 530 Schlag: 1
A boxt B um 531 Schlag: 2
A boxt B um 532 Schlag: 3
B boxt A um 532 Schlag: 1
[...]

Ich musst das Schlagen in der boxt()-Methode durch sleep()-Methode etwas forcieren (weil ich 8 Kerne oder so habe) aber eigentlich kann das mit sleep() komplett raus. :)
 
E

Enilno

Mitglied
Oh man, was ist den hier los :):):)?
So schnell!!!
Hat super funktionier danke auch für das tolle Bsp.
Hat sich echt gelohnt hier anzumelden, ihr wollt nicht wissen wie lange ich daran sitze:oops:
 
E

Enilno

Mitglied
mein größtes Problem ist, dass wenn ich die Codes lese tatsächlich auch nachvollziehen kann was diese bewirken, selbst aber Probleme bekomme wenn ich welche schreiben soll, wobei dein Beispiel schon zu fortgeschritten ist. Jetzt kommt die nächste "Kinder-Aufgabe" an der ich eine Woche sitzen werde.....
Ich wusste z.B. nicht, dass "this" alleine stehen kann. Habe es als eine Art "Verweis" angesehen, der eben auf etwas verweisen soll o_O
 
X

Xyz1

Gast
Also wenn jeder Boxer jede Sekunde einmal Schlag soll, dann müsste es eigentlich so lauten:
Java:
        try {
            Thread.sleep(1000 - System.currentTimeMillis() % 1000);
        } catch (InterruptedException ie) {
            ie.printStackTrace();
        }

Allerdings ist das Timing von meinem OS so genau, dass es ganz oft die Ausgabe gibt:
Code:
...
A boxt B um 513 Schlag: 1
B boxt A um 514 Schlag: 1
A boxt B um 514 Schlag: 1
B boxt A um 515 Schlag: 1
A boxt B um 515 Schlag: 1
B boxt A um 516 Schlag: 1
A boxt B um 516 Schlag: 1
A boxt B um 517 Schlag: 2
B boxt A um 517 Schlag: 1
...

Also fast schon zu genau. Drei Schläge hintereinander kommt praktisch gar nicht vor. Deswegen muss man da eine "Unwucht" einbringen:
Vielleicht mit Random....
 
X

Xyz1

Gast
So, funktioniert es BEI MIR, ohne Random, das alles zufällig aussieht:
Java:
        try {
            long t1 = 1000 - System.currentTimeMillis() % 1000;
            if (t1 % 2 == 1) {
                t1 -= 20;
            }
            if (t1 > 0) {
                Thread.sleep(t1);
            }
        } catch (InterruptedException ie) {
            ie.printStackTrace();
        }

Kann aber auch an der HW liegen, also Hardware-abhängig sein. Fragt mich bitte nicht, wieso es funktioniert. Vielleicht: Ein Thread bleibt oft bei den geraden Zahlen und einer bei den ungeraden. (Eine ungerade Zahl Minus einer geraden Zahl ist wieder ungerade - aber nicht vice versa.) Zwischendurch braucht ein Thread mal 'ne Millisekunde länger, dann ändert sich das wieder.

Testet es mal.
 
X

Xyz1

Gast
Ich habe mal eine .jar erstellt. Das Programm sollte sich so Verhalten, wie ein echter Boxkampf (zufällig). Jeder Boxer jede Sekunde ein Schlag, auch bis zu 3 Schläge hintereinander möglich, auch insgesamt Schläge hinzugefügt. Nach 100 Sek. sollte ein KO sein (Programm ist dann fertig), dann der andere z. B. nur 80 Schläge. Testet es mal, Aufruf mit:

java -jar Boxer2.jar

Bitte nicht zurückübersetzen, da kommt mit dem besten Decompiler nur Quatsch bei raus. ;)

(Entschuldigt den Doppelpost.)
 

Anhänge

  • Boxer2.jar
    1,6 KB · Aufrufe: 2
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Weil ein Virenscanner auch super anschlägt, wenn dein Programm Dinge macht, die ganz normal sind, ich aber trotzdem nicht möchte...
 
X

Xyz1

Gast
heul doch nicht rum :rolleyes:
führs in einer virtuellen Maschine/Sandbox aus :)
oder frag mich nach dem sourcecode.
oder lass es ganz. :confused:
Das Thema wurde ja glaub ich schon beantwortet.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Nach einer erstmaligen Eingabe, eine zweite Eingabe nur noch gegen bestätigung möglich Java Basics - Anfänger-Themen 2
TimoN11 Java - Eine oder mehrere Eingaben möglich machen Java Basics - Anfänger-Themen 6
A Wie schaffe ich das eine while Schleife addiert danach subtrahirt? Java Basics - Anfänger-Themen 1
Y Einfügen in eine doppelt verkettete Liste Java Basics - Anfänger-Themen 8
T Ich habe eine Variabel die nicht Methoden übergreifend ist. Kann mir jemand Helfen :) Java Basics - Anfänger-Themen 5
H Daten aus einer Datei in eine Liste speichern Java Basics - Anfänger-Themen 23
Tino1993 for-Schleife, die eine vorgegebene Anzahl von Zeichen ausgibt Java Basics - Anfänger-Themen 3
newcomerJava Nach doppelter Zahl eine Ausgabe Java Basics - Anfänger-Themen 10
jonny_2k12 Wie kann ich eine ArrayList aus einer Klasse in eine andere übergeben? Java Basics - Anfänger-Themen 21
S Eine Liste kopieren Java Basics - Anfänger-Themen 13
A eine neue normale String-Array von einer String-Array, die in for schleife ist, schaffen Java Basics - Anfänger-Themen 3
java3690 eine liste sortieren Java Basics - Anfänger-Themen 12
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
K Übergabe des Wertes einer Variable aus main() in eine Klassenmethode Java Basics - Anfänger-Themen 8
J Wie kann ich hier eine While schleife einbauen? Java Basics - Anfänger-Themen 3
P Was genau bringt mir es ein Array in eine Liste zu bringen Java Basics - Anfänger-Themen 3
J Eine Frage zur Schreibweise == ? : Java Basics - Anfänger-Themen 3
I Wo am besten eine String Konstante initialisieren? Java Basics - Anfänger-Themen 5
N Wie teste ich eine geworfene Exception? Java Basics - Anfänger-Themen 8
B Eine Methode erstellen Java Basics - Anfänger-Themen 3
L Konstruktor für eine Map-Datei/Map-Datei einlesen Java Basics - Anfänger-Themen 5
Y Methoden Wie kann ich eine if-Abfrage bei Setters bauen? Java Basics - Anfänger-Themen 6
I Sortiert eine HashMap nicht gleich wie eine ArrayList? Java Basics - Anfänger-Themen 1
L Iterieren durch eine ArrayList. Integer Array wird übergeben Java Basics - Anfänger-Themen 17
KogoroMori21 Mit einer Schleife eine Treppe zeichnen Java Basics - Anfänger-Themen 29
J Eine Position im String durch einen Integer - Wert teilen Java Basics - Anfänger-Themen 5
M Verständnisfrage zu eine Online Aufgabe Java Basics - Anfänger-Themen 7
N Wie kann ich eine meine Variable Final machen? Java Basics - Anfänger-Themen 1
H Datentypen Was für eine Format verbirgt sich hinter dem Integer-Wert 053? Java Basics - Anfänger-Themen 2
C Methoden Java ist auch eine Insel Listing 2.40 Recursion Java Basics - Anfänger-Themen 7
F Eine Zahl mit Arrays vergleichen Java Basics - Anfänger-Themen 7
P Eine komplizierte Sache Java Basics - Anfänger-Themen 1
B Nur eine bestimmte Anzahl an Arrays ausgeben Java Basics - Anfänger-Themen 9
M Zugriff auf eine ArrayList in einer anderen Klasse Java Basics - Anfänger-Themen 4
T Wie eine Komposition garantieren Java Basics - Anfänger-Themen 5
M Wie analysiert JSON eine toString-Ausgabe ? Java Basics - Anfänger-Themen 1
V Array auf eine Zahl durchsuchen Java Basics - Anfänger-Themen 15
bensdt Klasse erweitern um eine Methode "void decrement()" Java Basics - Anfänger-Themen 5
S Datenbank Tabelle eine Zeile an einer bestimmten Stelle einfügen Java Basics - Anfänger-Themen 2
X Nach einem Bruch testen ob es eine ganze Zahl ist Java Basics - Anfänger-Themen 6
B Von Array nur eine bestimmte Anzahl bekommen Java Basics - Anfänger-Themen 3
C "HelloWorld" - Dateien erstellt, aber ist es eine class-Datei? Java Basics - Anfänger-Themen 2
L Muss eine HttpURLConnection geschlossen werden? Java Basics - Anfänger-Themen 2
D OOP- Eine Klasse in mehrere Klassen aufteilen Java Basics - Anfänger-Themen 7
V Erste Schritte Eine Array-Variable mit Benutzereingaben befüllen Java Basics - Anfänger-Themen 3
N Eine Zahl solange teilen bis es nicht möglich ist und die Ergebnisse ausgeben Java Basics - Anfänger-Themen 23
O Ziehen im Array um einen Schritt in eine einzige beliebige Richtung Java Basics - Anfänger-Themen 5
E Kreis soll eine Raupe darstellen Java Basics - Anfänger-Themen 37
P Alles eine Typfrage Java Basics - Anfänger-Themen 7
B Eine ganze Zahl zerlegen. Java Basics - Anfänger-Themen 4
I Klassen Eine ArrayList<Long>, die sich automatisch sortiert Java Basics - Anfänger-Themen 20
D Guten Tag mache gerade eine Umschulung zum FiSi war leider jetzt 2 Wochen Krank und wir hatten Prozendurale Programmierung. Java Basics - Anfänger-Themen 3
L Iterieren über eine CSV Datei Java Basics - Anfänger-Themen 7
W Zwei Programme sollen auf eine Klasse zugreifen Java Basics - Anfänger-Themen 18
V Wie wiederhole ich eine for-Schleife beim erreichen eines Wertes Java Basics - Anfänger-Themen 9
A Kann man eine Methode als Variable speichern und danach noch verändern? Java Basics - Anfänger-Themen 6
L Klassen Wie “installiert” man eine Klasse? Java Basics - Anfänger-Themen 2
E Datentypen Einfügen von Objekten in eine Map Java Basics - Anfänger-Themen 2
X Wo steht, ob eine Datei big, little oder bi-endian codiert ist? Java Basics - Anfänger-Themen 3
N Bewegtes Objekt soll sich um eine Parallele bewegen Java Basics - Anfänger-Themen 0
O Iterator für eine geordnete Menge Java Basics - Anfänger-Themen 134
J Lesen und schreiben in eine Datei(Anfänger- Dateizugriffe) Java Basics - Anfänger-Themen 3
M Wie lang eine Funktion/Methode? Java Basics - Anfänger-Themen 51
R Warnung, wenn eine Variable eingegeben wird Java Basics - Anfänger-Themen 6
D Richtig Vorbereiten auf eine Programmier Klausur Studium. Java Basics - Anfänger-Themen 7
A Eine Krone in der Textausgabe - Mein Code Java Basics - Anfänger-Themen 11
scratchy1 Kann man in einer Methode eine andere aufrufen? Java Basics - Anfänger-Themen 2
B CSS Klassen in eine Liste schreiben Java Basics - Anfänger-Themen 4
L Klassen Kann eine Unterklasse einer abstrakten Klasse ein Interface implementieren? Java Basics - Anfänger-Themen 2
mor16Euro Erste Schritte Wie nennt man eine While oder For schleife die nie Ausgeführt wird Java Basics - Anfänger-Themen 5
N Best Practice Rückgabe eines Terminal Befehls in eine Variable speichern Java Basics - Anfänger-Themen 27
scratchy1 Wie deklariert man eine Methode, die ein Objekt zurückgeben soll? Java Basics - Anfänger-Themen 22
B Wie kann man an ein JPanel eine Scrollbar anheften? Java Basics - Anfänger-Themen 8
H Eine befühlte Klasse weiter geben an Controller Java Basics - Anfänger-Themen 12
K Durch eine Text eingabe etwas Ausführen Java Basics - Anfänger-Themen 5
A Überprüfen, ober eine Zahl Ziffer enthält Java Basics - Anfänger-Themen 12
O Bedingter Operator eine Frage! Java Basics - Anfänger-Themen 10
C Methoden Über eine einfach verkettete Liste Java Basics - Anfänger-Themen 8
J Eine Liste von Listen erstellen Java Basics - Anfänger-Themen 11
A Wie gebe ich bei android eine string im programm aus? Java Basics - Anfänger-Themen 4
R Auf eine Stelle [i] des Arrays zugreifen Java Basics - Anfänger-Themen 7
J Button klick bei eine bestimmten Zahl Java Basics - Anfänger-Themen 8
J Algorithmus für eine Reihe implementieren Java Basics - Anfänger-Themen 2
F Input/Output die eine txt-Datei funktioniert die andere nicht Java Basics - Anfänger-Themen 8
V Compiler-Fehler Warum eine IndexOutOfBoundsException? Java Basics - Anfänger-Themen 3
S Daten aus zwei Verschiedenen Tabellen in eine ArrayListe Java Basics - Anfänger-Themen 4
B Kann man eine Tabelle in Eclipse erzeugen und damit arbeiten? Java Basics - Anfänger-Themen 8
I Wie benutzt man eine Klasse? Java Basics - Anfänger-Themen 13
D Wie kann man eine solche Fehlermeldung abfangen Java Basics - Anfänger-Themen 4
M Wie kann ich eine Eingabe im Java-Swing übergeben? Java Basics - Anfänger-Themen 1
H OOP eine Zahl immer weiter durch 2 teilen Java Basics - Anfänger-Themen 15
F Aus geraden eine Kurve machen Java Basics - Anfänger-Themen 6
Queiser Datentypen 2 generische Datentypen für eine Schnittstelle Java Basics - Anfänger-Themen 1
G Arraynamen über eine Schleife ansprechen Java Basics - Anfänger-Themen 4
J Für jeden Buchstaben eine Zahl Java Basics - Anfänger-Themen 1
E Ist eine Datenvearbeitung eine kritische Operation? Java Basics - Anfänger-Themen 1
J Hinzufügen eines Objekts in eine Liste, um später dann nochmal auf das Objekt zugreifen zu können Java Basics - Anfänger-Themen 8
L Collections Ist eine Arraylist hier das richtige? Java Basics - Anfänger-Themen 12
I Erste Schritte Testen, ob eine Zahl eine Primzahl ist Java Basics - Anfänger-Themen 8
L Klassen Objekt aus einer Warteschlange in eine andere übergeben, geht nicht? Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Anzeige

Neue Themen


Oben