BBoard stellt seinen Betrieb ein, Details hier
www.meckerwiese.de.vu
Forum für den Programmierwettbewerb 2007
 

 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

DogAI ('s)


Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    www.meckerwiese.de.vu Foren-Übersicht -> Fragen zum Wettbewerb
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Deathfish
Gast







BeitragVerfasst am: 20.02.2007, 12:59    Titel: DogAI ('s) Antworten mit Zitat

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

BeitragVerfasst am: 20.02.2007, 17:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Deathfish
Gast







BeitragVerfasst am: 21.02.2007, 17:06    Titel: ähm... Antworten mit Zitat

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

BeitragVerfasst am: 22.02.2007, 01:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
silvester
Neuling



Geschlecht: Geschlecht:männlich
Anmeldungsdatum: 20.02.2007
Beiträge: 1

BeitragVerfasst am: 25.02.2007, 16:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
toster
Neuling



Geschlecht: Geschlecht:männlich
Anmeldungsdatum: 23.02.2007
Beiträge: 11
Wohnort: Magdeburg

BeitragVerfasst am: 26.02.2007, 15:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
zet
Forumsjunki




Anmeldungsdatum: 05.02.2007
Beiträge: 85

BeitragVerfasst am: 26.02.2007, 17:14    Titel: Antworten mit Zitat

danke @ toster, das stimmt alles Smilie

Hatte mich bei der "new DogAI" verschrieben, sollte natürlich "new MyDogAI" heißen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Gast








BeitragVerfasst am: 27.02.2007, 01:29    Titel: Antworten mit Zitat

erstmal vielen dank für die hilfe, werde mich morgen dransetzen und basteln, gute sache so ein forum. Sehr glücklich
Nach oben
zora
Neuling



Geschlecht: Geschlecht:weiblich
Anmeldungsdatum: 18.02.2007
Beiträge: 3

BeitragVerfasst am: 15.03.2007, 22:04    Titel: Antworten mit Zitat

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? Mit den Augen rollen
mfg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
zet
Forumsjunki




Anmeldungsdatum: 05.02.2007
Beiträge: 85

BeitragVerfasst am: 16.03.2007, 10:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Gast








BeitragVerfasst am: 18.04.2007, 20:23    Titel: DogAI Antworten mit Zitat

ja... hab auch gerade mal angefangen Winken
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

BeitragVerfasst am: 18.04.2007, 22:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Gast








BeitragVerfasst am: 18.04.2007, 22:11    Titel: Antworten mit Zitat

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

BeitragVerfasst am: 19.04.2007, 08:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Gast








BeitragVerfasst am: 19.04.2007, 22:02    Titel: Antworten mit Zitat

Hatte ich auch schon probiert, leider nichts...
Nach oben
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    www.meckerwiese.de.vu Foren-Übersicht -> Fragen zum Wettbewerb Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
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.




Powered by phpBB 2.0.23 © 2001, 2002 phpBB Group

BBoard.de bietet Ihnen ein Kostenloses Forum mit zahlreichen tollen Features

Impressum | Datenschutz