www.meckerwiese.de.vu Forum für den Programmierwettbewerb 2007
|
|
|
| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
Deathfish Gast
|
Verfasst am: 20.02.2007, 12:59 Titel: DogAI ('s) |
|
|
Hi Folks,
brobier jetzt schon ne ganze Weile rum, vllt stehe ich ja auch auf dem Schlauch, aber ich bekomm es nicht hin, mit Hilfe der getAIFor - Methode für jeden Hund eine eigene KI zu schreiben!?
Muss ich das in einer Klasse machen, oder pro KI/pro Hund eine eigene?
Wär toll wenn das mir mal jemand erklären könnte, damit ich hier endlich weiter komme,
danke schonmal im Voraus
The Deathfish |
|
| Nach oben |
|
 |
zet Forumsjunki
Anmeldungsdatum: 05.02.2007 Beiträge: 85
|
Verfasst am: 20.02.2007, 17:34 Titel: |
|
|
Wenn das Spiel hochfährt, läd es alle Klassen die es finden kann.
Wenn das Spiel dann gestartet wird, werden die Klassen die benutzt werden sollen instantiiert. Das heißt es wird davon ein Objekt erzeugt. Dann wird aber die getAIFor Funktion aufgerufen, für einen Hund nach dem anderen.
Dort kann dann die KI als Objekt zurückgegeben werden, die dieser benutzen soll. Standardmäßig ist das this, also das das Objekt dass der Initialisierer selbst benutzt.
Alternativ kann man auch eine andere KI zurückgeben, z.B.
| Code: |
public DogAI getAIfor(Dog dog) {
return new TestAI(idcnt++);
}
|
(aus der TestAI klasse).
Dann hat jeder Hund seine eigene KI. |
|
| Nach oben |
|
 |
Deathfish Gast
|
Verfasst am: 21.02.2007, 17:06 Titel: ähm... |
|
|
Also so richtig bin ich aus der sache nicht schlau geworden!
muss ich jetzt also für jeden hund eine Klasse schreiben und dann noch eine klasse die die getAIFor-Methode beinhaltet, die dann beim start aufgerufen wird?
The Deathfish |
|
| Nach oben |
|
 |
zet Forumsjunki
Anmeldungsdatum: 05.02.2007 Beiträge: 85
|
Verfasst am: 22.02.2007, 01:06 Titel: |
|
|
Du musst nicht, du kannst.
Beispiel 1:
| Code: |
public class MyDog extends DogAI {
public DogAI getAIfor (Dog d) {
return this;
}
}
|
Ergebnis: Jeder Hund benutzt das selbe KI Objekt. Sozusagen ein Hirn für mehrere Hunde.
Beispiel 2:
| Code: |
public class MyDog extends DogAI{
public DogAI getAIfor (Dog d) {
return new DogAI();
}
}
|
Ergebnis: Erzeugt für jeden Hund ein KI Objekt vom typ MyDog, also die selbe Klasse wie die, die auch alles initialisiert. Also ein Hirn pro Hund.
Beispiel 3:
| Code: |
public class MyDog extends DogAI {
int cnt = 0;
public DogAI getAIfor (Dog d) {
if (cnt++%2==0) return new EvenDog();
else return OddDog();
}
}
|
Ergebnis: jeder Hund hat ein eigenes KI Objekt, aber die mit gerader Initialisierungsnummer haben ein Objekt vom Typ EvenDog und die mit ungerader ein Objekt vom Typ OddDog. Sozusagen jeder Hund ein Hirn, aber die einen Männlich, die anderen Weiblich (im übertragenen Sinne). |
|
| Nach oben |
|
 |
silvester Neuling
Geschlecht:  Anmeldungsdatum: 20.02.2007 Beiträge: 1
|
Verfasst am: 25.02.2007, 16:26 Titel: |
|
|
Hallo!
Habe Beispiel 2 versucht und kriege nur die Meldung, dass DogAI abstrakt ist, aber abgesehen davon verstehe ich nicht, wie ich die einzelnen Hunde auswählen und mit einer KI versehen kann. In der Entity-Klasse ist eine Methode namens isTarget, die anzeigt, ob eine Entity ein Schaf ist oder nicht, nun hatte ich den Ansatz, das Feld durchzugehen und alles, was nicht isTarget ist, als Hund zu kennzeichnen, um dann per getAIfor dieser Entity eine KI zuzuweisen, leider gibt es bei dieser Operation auch wieder eine Fehlermeldung und ich bin mir auch nicht sicher, wie ich dann weiterverfahren sollte, da mir das DogCommand noch unklar ist, also wie ich genau übergebe, dass DogCommandxy nur für Dog1 ist, Dog 1 = new Dog() oder sowas funktioniert irgendwie nicht. Alles in allem stecke ich in einer ziemlichen Sackgasse und würde mich freuen, wenn mir jemand weiterhelfen könnte. |
|
| Nach oben |
|
 |
toster Neuling
Geschlecht:  Anmeldungsdatum: 23.02.2007 Beiträge: 11 Wohnort: Magdeburg
|
Verfasst am: 26.02.2007, 15:34 Titel: |
|
|
Hallo silvester,
du darfst natürlich deinem Hund nicht DogAI() zuweisen, sondern ein Objekt von deiner eigenen KI. Eigentlich müsste in dem Beispiel also return new MyDog() stehen.
Die isTarget() - Methode überprüft übrigens nicht, ob ein Entity ein Schaf ist, sondern ob es ein Schaf ist, das du in deinen Aktuellen sammelkreis reintreiben sollst. Wenn du alle Entitys sammelst, die bei isTarget() false zurückgeben, hast du da eventuell auch Schafe dabei, die du für deine Aufgabe nicht brauchst, aber der Gegner z.B.
Die getAIfor() - Methode wird am Anfang vom Spiel aufgerufen, um einem Hund eine KI zuzuweisen. Danach kannst du diese methode nicht selbst aufrufen um einem Hund nachträglich eine Andere KI zuzuweisen. Du kannst nur selbst die getAIfor() - Methode überschreiben und darin festlegen, welche KI du einem Hund zuweisen willst. (Beispiel 3 von oben)
Der DogCommand, den du mit der think-Methode zurück gibst, gilt immer nur genau für den Hund, der in der Methode als parameter übergeben wurde. Wenn du wissen willst, welcher Hund deine think-Methode gerade benutzt, musst du die Hunde deines Teams irgendwo speichern, damit du dann vergleichen kannst, welcher davon gerade denkt. Bei mir sieht das so aus:
class MyDogAI extends DogAI
{
static int dogcnt = 0;
static Dog[] dogs = new Dog[3];
public DogAI getAIfor(Dog d)
{
dogs[dogcnt++] = d;
return new MyDogAI();
}
}
So bekommt jeder Hund am Anfang ein eigenes KI-Objekt (allerdings vom gleichen Typ).
Da das Array dogs[] static ist, kann jede KI vom Typ MyDogAI() auf es zugreifen und bekommt das gleiche Ergebnis. Wenn alle Hunde erzeugt wurden (ich gehe davon aus, dass es maximal 3 Stück sind) stehen diese dann auch in dem Array drin und du kannst in der think - Methode überprüfen, welcher von den Hunden aus deinem Team sie gerade benutzt. Eine andere Möglichkeit wäre, beim ersten Aufruf der think-Methode alle Entitys des Feldes zu durchsuchen und zu überprüfen welche davon vom Typ Dog sind:
entity.getClass() == Dog.class;
diejenigen, die du dabei rausgefiltert hast, musst du jetzt nur noch auf ihr Team überprüfen. Dazu müsstest du natürlich irgendwie rausfinden, welches Team du überhaupt bist. Wenn du das weißt, kannst du alle Hunde auf dem Spielfeld, die zu deinem Team gehören in ein Array reinschreiben, dass wieder statisch ist und du könntest wiederum testen, welcher davon deine Methode gerade benutzt.
Ich hoffe, ich konnte dir irgendwie weiterhelfen. Viel erfolg. |
|
| Nach oben |
|
 |
zet Forumsjunki
Anmeldungsdatum: 05.02.2007 Beiträge: 85
|
Verfasst am: 26.02.2007, 17:14 Titel: |
|
|
danke @ toster, das stimmt alles
Hatte mich bei der "new DogAI" verschrieben, sollte natürlich "new MyDogAI" heißen. |
|
| Nach oben |
|
 |
Gast
|
Verfasst am: 27.02.2007, 01:29 Titel: |
|
|
erstmal vielen dank für die hilfe, werde mich morgen dransetzen und basteln, gute sache so ein forum.  |
|
| Nach oben |
|
 |
zora Neuling
Geschlecht:  Anmeldungsdatum: 18.02.2007 Beiträge: 3
|
Verfasst am: 15.03.2007, 22:04 Titel: |
|
|
Hallo,
trotz der vielen erklärungen, wird mir eine sache immer noch nicht klar:
Kann ich jeden meiner (3) hunde direkt mit namen ansprechen und dann dementsprechend 3 Klassen schreiben?
oder kann ich nur mithlife einer zählvariabe, die pro think() inkrementiert wird, immer einen anderen hund auswählen?
mfg |
|
| Nach oben |
|
 |
zet Forumsjunki
Anmeldungsdatum: 05.02.2007 Beiträge: 85
|
Verfasst am: 16.03.2007, 10:35 Titel: |
|
|
Vielleicht hilft das
Jeder Hund in dem Feld bekommt nen Think. Dabei ruft er das KI Objekt auf, welches ihm zuvor zugewiesen wurde.
Über die Art der Zuweisung entscheidest du. Und zwar in der Funktion getAIfor(Dog). Dort gibst du für jeden Hund das zurück was du möchtest - ein KI Objekt für alle Hunde (Fall 1), wo du dann auf jeden Fall einzeln eingehen kannst (Achtung: Nicht immer sind es genau 3 hunde, manchmal vielleicht auch nur 2). Oder du machst es wie im Fall 2 wo du für jeden Hund ein Objekt zurückgibst.
Mit Klassen hat das ansich nix zu tun - die KI Objekte können aus verschiedenen Klassen sein, aber prinzipiell stehts dir offen immer eine Instanz von der gleichen Klasse zu machen, oder unterschiedliche Klassen zu benutzen, je nach dem, wie der Hund sich verhalten soll.... |
|
| Nach oben |
|
 |
Gast
|
Verfasst am: 18.04.2007, 20:23 Titel: DogAI |
|
|
ja... hab auch gerade mal angefangen
die hunde sollen versch. aufgaben haben, daher soll jeder ne eigene klassen spendiert bekommen. leider klappt das ganze nicht so ganz, mir leuchtet aber nicht so wirklich ein, warum. hier mal der code:
| Code: |
public class Wolfgang extends DogAI {
class Werner extends Wolfgang {
public DogCommand think(Field f, Dog dog, Task task) {
return new DogCommand(dog.getLookdir()+1,1);
}
@Override
public String getName() {
return "Werner";
}
}
static int i=0;
public DogAI getAI(Dog dog) {
if(i++==2)
return new Werner();
return new Wolfgang();
}
} |
eigentlich sollte das doch so gehen, oder? |
|
| Nach oben |
|
 |
zet Forumsjunki
Anmeldungsdatum: 05.02.2007 Beiträge: 85
|
Verfasst am: 18.04.2007, 22:05 Titel: |
|
|
| Was genau ist der Fehler (also was ist die Compilerfehler / Exception meldung)? Ich weiß nur, das in dem Zusammenhang es vorkommen kann, dass der Hund nicht gezeichnet wird. |
|
| Nach oben |
|
 |
Gast
|
Verfasst am: 18.04.2007, 22:11 Titel: |
|
|
| es tritt gar kein fehler auf... es wird nur keine instanz von Werner erzeugt... zumindest sehe ich keinen der hunde im kreis laufen, was ja eigentlich bei einem der fall sein müsste... |
|
| Nach oben |
|
 |
zet Forumsjunki
Anmeldungsdatum: 05.02.2007 Beiträge: 85
|
Verfasst am: 19.04.2007, 08:55 Titel: |
|
|
| Code: |
class Werner extends Wolfgang {
Werner () {
System.out.println("bin erzeugtworden"); // <--- einfügen
}
public DogCommand think(Field f, Dog dog, Task task) {
System.out.println("ich denke also bin ich"); // <--- mal einfügen
return new DogCommand(dog.getLookdir()+1,1);
}
@Override
public String getName() {
return "Werner";
}
}
|
Wenn du den printlns einfügst die ich oben eingefügt hab, passiert dann was? |
|
| Nach oben |
|
 |
Gast
|
Verfasst am: 19.04.2007, 22:02 Titel: |
|
|
| Hatte ich auch schon probiert, leider nichts... |
|
| Nach oben |
|
 |
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|
|