Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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. :-(
/**
* @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.
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
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
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....
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.
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.
heul doch nicht rum
führs in einer virtuellen Maschine/Sandbox aus
oder frag mich nach dem sourcecode.
oder lass es ganz.
Das Thema wurde ja glaub ich schon beantwortet.