1. #1

    Registriert seit
    19.11.2011
    Beiträge
    2.128
    Thanked 1.936 Times in 1.180 Posts

    Standard Kara Kleeblätter aufsammeln lassen(automatisch)

    Hallo,

    wir müssen in Informatik mit JavaKara arbeiten.

    Unsere Aufgabe besteht nun darin, den Käfer alle Kleeblätter aufsammeln zu lassen.

    Die anderen haben einfach konstante Turns für das aktuelle Feld mit der aktuellen Itemaufstellung, was wir bekommen haben (18 Felder breit, 6 Felder hoch), genommen.

    Das möchte ich eher nicht, denn die nächste Aufgabe wird sowieso sein, den Käfer vollautomatisiert laufen zu lassen.


    So sieht das Feld aus:



    Momentan sieht mein Codeversuch so aus:


    PHP-Code:
    import javakara.JavaKaraProgram;
            
    /* BEFEHLE:  kara.
     *   move()  turnRight()  turnLeft()
     *   putLeaf()  removeLeaf()
     *
     * SENSOREN: kara.
     *   treeFront()  treeLeft()  treeRight()
     *   mushroomFront()  onLeaf()
     */

    public class einstiegsprogramm1 extends JavaKaraProgram {
      public 
    void myProgram() {
          
    kara.turnLeft();
        while (
    true) {
          if (
    kara.treeFront() ||  kara.mushroomFront()) {
              
          if (!
    kara.treeRight())

    kara.turnRight();
    kara.move();
    kara.turnLeft(); 
    }
          if (!
    kara.treeLeft()) 
    {
    kara.turnLeft();
    kara.move();
    kara.turnRight();
             }
        }
     if (
    kara.onLeaf()) kara.removeLeaf();
     
    kara.move();
        }
    }

    Leider scheint da irgendwo ein Fehler zu sein. Kann mir jemand helfen?

  2. #2
    Avatar von milchbubix
    Registriert seit
    06.12.2011
    Beiträge
    757
    Thanked 413 Times in 271 Posts

    Standard AW: Kara Kleeblätter aufsammeln lassen(automatisch)

    Wir haben/hatten in der schule, theoretisch das gleiche, nur mit einem JavaHamser der körner aufsammeln konnte

    Wo ist denn der Fehler? Also sagt dir das Programm nicht irgendeine Fehlermeldung?


    Egal was du hast, es ist nie das was du willst.

    Denkbar finde ich auch, daß es außerirdische Lebensformen geben kann, die es darauf abgesehen haben, die Erde zu erobern, um sich hier anzusiedeln. Dabei wären die Menschen ja eher störend. Die Außerirdischen inszenieren dann solche Katastrophen wie 9/11 und legen falsche Spuren, um die Menschheit gegeneinander aufzuhetzen, damit sie sich selber ausrottet.


  3. #3

    Registriert seit
    19.11.2011
    Beiträge
    2.128
    Thanked 1.936 Times in 1.180 Posts

    Standard AW: Kara Kleeblätter aufsammeln lassen(automatisch)

    Kara läuft gegen einen Baum.. Irgendwo scheint in meinem Code also ein Fehler zu stecken.

  4. #4
    Avatar von patlux
    Registriert seit
    26.10.2011
    Beiträge
    1.195
    Thanked 1.596 Times in 725 Posts
    Blog Entries
    2

    Standard AW: Kara Kleeblätter aufsammeln lassen(automatisch)

    Wenn du Hilfe erwartest, dann formatier bitte mal den Code richtig. Sowas werde zumindest ich nicht lesen.
    Geändert von patlux (12.09.2012 um 17:40 Uhr)

  5. #5
    Gelöschter Benutzer
    Gast

    Standard AW: Kara Kleeblätter aufsammeln lassen(automatisch)

    ------
    Geändert von Gelöschter Benutzer (19.02.2013 um 20:19 Uhr)

  6. The Following User Says Thank You to Gelöschter Benutzer For This Useful Post:

    patlux (12.09.2012)

  7. #6

    Registriert seit
    19.11.2011
    Beiträge
    496
    Thanked 412 Times in 268 Posts

    Standard AW: Kara Kleeblätter aufsammeln lassen(automatisch)

    Finn, das Vieh wird sich da nur im Kreis drehen.

    @TE
    Das was du vorhast, alle Kleeblätter bei beliebiger Weltkonfiguration einzusammeln, ist nicht so trivial, wie du vielleicht dachtest. Mir fällt kein Algorithmus ein, der zum gewünschten Ergebnis führt.

  8. #7

    Registriert seit
    19.11.2011
    Beiträge
    2.128
    Thanked 1.936 Times in 1.180 Posts

    Standard AW: Kara Kleeblätter aufsammeln lassen(automatisch)

    Damit läuft er immer linksherum..

    Edit :Sorry, da kam wohl zwischenzeitlich noch ein Post.

    Besteht denn die Möglichkeit den Käfer automatisch die Kleeblätter aufsammeln zu lassen, wenn ich die .world Datei auslese und somit die Positionen der Items kenne? Dann müsste es doch funktionieren oder?
    Geändert von !lkay (12.09.2012 um 18:19 Uhr)

  9. #8
    Gelöschter Benutzer
    Gast

    Standard AW: Kara Kleeblätter aufsammeln lassen(automatisch)

    ------
    Geändert von Gelöschter Benutzer (19.02.2013 um 20:19 Uhr)

  10. #9

    Registriert seit
    19.11.2011
    Beiträge
    496
    Thanked 412 Times in 268 Posts

    Standard AW: Kara Kleeblätter aufsammeln lassen(automatisch)

    A*-Algorithmus
    Code:
    import javakara.*;
    import java.util.*;
    import java.math.*;
    import java.awt.Point;
            
    public class AStern extends JavaKaraProgram {
      private final List<PathPoint> listOfTreesAndMushrooms = new ArrayList<>();
      private final List<PathPoint> listOfLeafs = new ArrayList<>();
    
      public void myProgram() {
        for(int x = 0; x < world.getSizeX(); ++x) 
          for(int y = 0; y < world.getSizeY(); ++y)
            if(world.isTree(x, y) || world.isMushroom(x, y))
              listOfTreesAndMushrooms.add(new PathPoint(x, y));
            else if(!world.isMushroom(x, y) && world.isLeaf(x, y))
              listOfLeafs.add(new PathPoint(x, y));
        while(!listOfLeafs.isEmpty()) {
          PathPoint start = new PathPoint(kara.getPosition().x,kara.getPosition().y);
          PathPoint end = getNearestLeaf(start);
          followPath(getPath(start, end));
          kara.removeLeaf();
          listOfLeafs.remove(end);
        }
      }
    
      private void followPath(Stack<Point> path) {
        int size = path.size();
        for(int i = 0; i < size; ++i) {
          Point nextPoint = path.pop();
          kara.setPosition(nextPoint.x, nextPoint.y);
        }
      }
    
      private Stack<Point> getPath(PathPoint start, PathPoint end) {
        List<PathPoint> openList = new ArrayList<>(), closedList = new ArrayList<>();
        openList.add(start);
        while(!closedList.contains(end) || openList.isEmpty()) {
          Collections.sort(openList, PathPoint.comparator);
          start = openList.get(0);
          openList.remove(start);
          closedList.add(start);
          for(PathPoint neighbour : getWalkableNeighbours(start))
            if(!closedList.contains(neighbour)) {
              neighbour.setPreviousPoint(start);
              neighbour.computeCosts(end);
              if(!openList.contains(neighbour))
                openList.add(neighbour);
            }
        }
        Stack<Point> path = new Stack<>();
        PathPoint point = closedList.get(closedList.indexOf(end));
        while(point.getPreviousPoint() != null) {
          path.push(point);
          point = point.getPreviousPoint();
        }
        return path;
      }
    
      private List<PathPoint> getWalkableNeighbours(Point currentPoint) {
        List<PathPoint> walkableNeighbours = new ArrayList<>();
        List<PathPoint> neighbours = new ArrayList<>();
        if((currentPoint.y - 1) >= 0)
          neighbours.add(new PathPoint(currentPoint.x, currentPoint.y - 1));
        if((currentPoint.x + 1) < world.getSizeX())
          neighbours.add(new PathPoint(currentPoint.x + 1, currentPoint.y));
        if((currentPoint.y + 1) < world.getSizeY())
          neighbours.add(new PathPoint(currentPoint.x, currentPoint.y + 1));
        if((currentPoint.x - 1) >= 0)
          neighbours.add(new PathPoint(currentPoint.x - 1, currentPoint.y));
        for(PathPoint neighbour : neighbours)
          if(!listOfTreesAndMushrooms.contains(neighbour))
            walkableNeighbours.add(neighbour);
        return walkableNeighbours;
      }
    
      private PathPoint getNearestLeaf(PathPoint currentPoint) {
        for(PathPoint leaf : listOfLeafs) 
          leaf.computeCosts(currentPoint);
        Collections.sort(listOfLeafs, PathPoint.comparator);
        return listOfLeafs.get(0);
      }
    }
    
    class PathPoint extends Point {
      public final static Comparator<PathPoint> comparator = new Comparator<PathPoint>() {
        @Override
        public int compare(PathPoint p1, PathPoint p2) {
          if(p1.getSumOfCosts() < p2.getSumOfCosts())
            return -1;
          else if(p1.getSumOfCosts() > p2.getSumOfCosts()) 
            return 1;
          return 0;
        }
      };
    
      private PathPoint previousPoint = null;
      private int movementCosts = 0, estimatedCosts = 0;
    	
      public PathPoint(int x, int y) {
        super(x, y);
      }
    
      public void computeCosts(PathPoint end) {
        movementCosts = previousPoint!=null ? previousPoint.getMovementCosts()+10 : 10;
        estimatedCosts = (Math.abs(end.x - x) + Math.abs(end.y - y)) * 10;
      }
    
      public void setPreviousPoint(PathPoint previousPoint) {
        this.previousPoint = previousPoint;
      }
    
      public PathPoint getPreviousPoint() { return previousPoint; }
      public int getMovementCosts() { return movementCosts; }
      public int getEstimatedCosts() { return estimatedCosts; }
      public int getSumOfCosts() { return movementCosts + estimatedCosts; }
    }
    Leider kann über die Kara-Instanz nicht ihre Richtung ermittelt werden. Deswegen wird ihre Anfangsrichtung immer beibehalten, aber ansonsten bin ich mit dem Ergebnis zufrieden.

    Getestet mit Welten wie:

    Geändert von Mr. White (13.09.2012 um 15:37 Uhr)

  11. The Following 2 Users Say Thank You to Mr. White For This Useful Post:

    Gnome (14.09.2012)

Ähnliche Themen

  1. OpenVPN automatisch verbinden
    Von ThunderStorm im Forum Software
    Antworten: 1
    Letzter Beitrag: 13.02.2013, 18:47
  2. automatisch tastenkombo
    Von yamyam87 im Forum Andere
    Antworten: 1
    Letzter Beitrag: 02.09.2012, 13:50
  3. Automatisch markieren
    Von Shane im Forum Hochsprachen
    Antworten: 3
    Letzter Beitrag: 16.06.2012, 12:17
  4. Login automatisch ausfüllen?
    Von x BoooM x im Forum Hochsprachen
    Antworten: 3
    Letzter Beitrag: 01.03.2012, 18:01
  5. SMS automatisch weiterleiten
    Von Frankfurt am Main im Forum iOS
    Antworten: 6
    Letzter Beitrag: 27.11.2011, 00:01
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.