Ergebnis 1 bis 20 von 36

Thema: [MCW] - Der Kampf der Microchips ^^

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #8
    Hm, ich habe es mir eben mal angeschaut und finde es auch sehr schön. Aber als ich einen Bot schreiben wollte, bin ich gleich auf ein Problem gestoßen. Entweder ich verstehe etwas falsch oder if_blocked_right bzw. if_blocked_left arbeiten nicht so richtig.

    Nimm zum Beispiel mal deinen Bot "Intelligent Walk" als ersten Bot auf der Map "BG". Zu Beginn schaut der Chip nach oben. Er wird also von vorne, links und hinten geblockt und rechts ist frei. So, bei "if_blocked block1" springt er also zu "block1". Dort steht dann "if_blocked_right block2" gefolgt von "turn_right". Da rechts aber keine Blockade ist, dürfte er nicht zu "block2" springen, sondern müsste sich nach rechts drehen. Er dreht sich aber nach links, was erst in "block2" steht. Aber auch in "block2" müsste er durch die Anweisung "if blocked_left block3" eigentlich nach "block3" springen, da er ja von links geblockt wird. Also habe ich das Gefühl, dass if_blocked_right und if_blocked_left nicht so arbeiten, wie sie es sollten. Oder liegt der Fehler bei mir?

    edit: Hm, alles muss man selbst machen. Also:
    Code:
     if copy(S,1,17) = 'if_blocked_right ' then
     begin
      o := False;
      if (Chip.Destination = 2) AND (Chip.Y =  0) then o := True;
      if (Chip.Destination = 4) AND (Chip.Y = 12) then o := True;
      if (Chip.Destination = 3) AND (Chip.X =  0) then o := True;
      if (Chip.Destination = 1) AND (Chip.X = 12) then o := True;
      if (Chip.Destination = 2) AND (ImBG.Canvas.Pixels[Chip.X*30+1,(Chip.Y-1)*30+1] <> clWhite) then o := True;
      if (Chip.Destination = 4) AND (ImBG.Canvas.Pixels[Chip.X*30+1,(Chip.Y+1)*30+1] <> clWhite) then o := True;
      if (Chip.Destination = 3) AND (ImBG.Canvas.Pixels[(Chip.X+1)*30+1,Chip.Y*30+1] <> clWhite) then o := True;
      if (Chip.Destination = 1) AND (ImBG.Canvas.Pixels[(Chip.X-1)*30+1,Chip.Y*30+1] <> clWhite) then o := True;
      // Wenn blockiert, dann springe zur übergebenen Sprungmarke
      if o then
       Chip.CodePos := Mem.Lines.IndexOf(':'+copy(S,18,Length(S)));
     end;
     if copy(S,1,16) = 'if_blocked_left ' then
     begin
      o := False;
      if (Chip.Destination = 4) AND (Chip.Y =  0) then o := True;
      if (Chip.Destination = 2) AND (Chip.Y = 12) then o := True;
      if (Chip.Destination = 1) AND (Chip.X =  0) then o := True;
      if (Chip.Destination = 3) AND (Chip.X = 12) then o := True;
      if (Chip.Destination = 4) AND (ImBG.Canvas.Pixels[Chip.X*30+1,(Chip.Y-1)*30+1] <> clWhite) then o := True;
      if (Chip.Destination = 2) AND (ImBG.Canvas.Pixels[Chip.X*30+1,(Chip.Y+1)*30+1] <> clWhite) then o := True;
      if (Chip.Destination = 1) AND (ImBG.Canvas.Pixels[(Chip.X+1)*30+1,Chip.Y*30+1] <> clWhite) then o := True;
      if (Chip.Destination = 3) AND (ImBG.Canvas.Pixels[(Chip.X-1)*30+1,Chip.Y*30+1] <> clWhite) then o := True;
      // Wenn blockiert, dann springe zur übergebenen Sprungmarke
      if o then
       Chip.CodePos := Mem.Lines.IndexOf(':'+copy(S,17,Length(S)));
     end;
    Bei der if_blocked_right Abfrage wird, wenn der Chip nach oben schaut (Destination = 1), geprüft, ob das Feld links vom Chip (Chip.X-1) blockiert ist und wenn er nach unten schaut, wird überprüft, ob das Feld rechts vom Chip blockiert ist. Bei if_blocked_left ist die gleiche Vertauschung. Also reicht es aus, wenn man in der Destinations-Abfrage jeweils die '3' gegen die '1' tauscht (in den roten Zeilen). Der Intelligent Walk Bot ist dann gar nicht mal so übel.

    freundliche Grüße, Rolus

    Geändert von Rolus (29.07.2006 um 11:41 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •