Advertisement
superdee

A*

May 20th, 2019
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 16.43 KB | None | 0 0
  1. import robocode.Robot;
  2. import robocode.ScannedRobotEvent;
  3. import java.awt.*;
  4. import java.lang.*;
  5. import java.util.ArrayList;
  6. import java.util.Collection;
  7. import java.util.Iterator;
  8. import java.util.Map;
  9. import java.util.TreeMap;
  10. import java.awt.event.MouseEvent;
  11. import java.util.Collections;
  12.  
  13. public class MujRobotKlasa extends Robot
  14. { //lub AdvancedRobot
  15.    
  16.     public class Node implements Comparable<Node>
  17.     {
  18.         Pozycja pos;
  19.         Double gCost = 10000000.0;
  20.         Double hCost = 10000000.0;
  21.         Double fCost = 10000000.0;
  22.         Pozycja parent;
  23.         Boolean isStart = Boolean.FALSE;
  24.         Boolean isEnd = Boolean.FALSE;
  25.        
  26.         public Node(Pozycja pos, Boolean start, Boolean end)
  27.         {
  28.             this.pos = pos;
  29.             isStart = start;
  30.             isEnd = end;
  31.             if(start) gCost = 0.0;
  32.         }
  33.        
  34.         public void setHCost(Pozycja end)
  35.         {
  36.             hCost = travelCost(pos, end);
  37.         }
  38.        
  39.         public void setGcost(double cost)
  40.         {
  41.             gCost = cost;
  42.         }
  43.        
  44.         public void setParent(Pozycja parPos)
  45.         {
  46.             parent = parPos;
  47.         }
  48.        
  49.          @Override
  50.         public int compareTo(Node other)
  51.         {
  52.             return this.fCost.compareTo(other.fCost);
  53.         }
  54.     }
  55.    
  56.     public class Pozycja implements Comparable<Pozycja>
  57.     {
  58.         Integer x;
  59.         Integer xid;
  60.         Integer y;
  61.         Integer yid;
  62.        
  63.         public Pozycja(int xPos, int yPos)
  64.         {
  65.             x = xPos;
  66.             xid = x/20;
  67.             y = yPos;
  68.             yid = y/20;
  69.         }
  70.        
  71.         public Integer getId()
  72.         {
  73.             return x + y*2000;
  74.         }
  75.        
  76.         @Override
  77.         public int compareTo(Pozycja pos)
  78.         {
  79.             return this.getId().compareTo(pos.getId());
  80.         }
  81.     }
  82.    
  83.     ArrayList<Pozycja> Wrugowie = new ArrayList<>();
  84.     Map<Pozycja, Boolean> mapTiles = new TreeMap<>();       // bool = czy wolna
  85.     boolean notMappedYet = true;
  86.     int bfHeight = 0;
  87.     int bfWidth = 0;
  88.     Map<Pozycja, Node> graph = new TreeMap<>();
  89.     ArrayList<Node> droga = new ArrayList<>();
  90.    
  91.     double destX = -1;
  92.     double destY = -1;
  93.     double destDir = -1;
  94.     double destDist = -1;
  95.    
  96.     Boolean testowyBool = Boolean.FALSE;
  97.    
  98.    
  99.     public void run()
  100.     {
  101.         bfHeight = (int)getBattleFieldHeight();
  102.         bfWidth = (int)getBattleFieldWidth();
  103.        
  104.         // ruch robota
  105.         while (true)
  106.         {
  107.             turnRadarRight(360);
  108.            
  109.             //goToXY(destX, destY);
  110.             if(droga.size() > 0)
  111.             {
  112.                 Collections.reverse(droga);
  113.                 Iterator<Node> iterDroga = droga.iterator();
  114.                 Node nodeD = iterDroga.next();
  115.                 destX = nodeD.pos.x;
  116.                 destY = nodeD.pos.y;
  117.                 while(iterDroga.hasNext())
  118.                 {
  119.                     if(Math.abs(getX()-destX) < 1 && Math.abs(getY()-destY) < 1)
  120.                     {
  121.                         nodeD = iterDroga.next();
  122.                         destX = nodeD.pos.x;
  123.                         destY = nodeD.pos.y;
  124.                     }
  125.                    
  126.                    
  127.                     goToXY(destX, destY);
  128.                 }
  129.             }
  130.            
  131.            
  132.         }
  133.     }
  134.    
  135.     public void goToXY(double destX, double destY)
  136.     {
  137.         if(Math.abs(getX() - destX) > 0.1 || Math.abs(getY() - destY) > 0.1)
  138.         {
  139.             destDir = atan2deg(Math.toDegrees(Math.atan2(destX-getX(), destY-getY())));
  140.             if(Math.abs(destDir - getHeading()) >= 0.001)
  141.             {
  142.                 if(destDir-getHeading()>180)
  143.                 {
  144.                     turnLeft(360-(destDir - getHeading()));
  145.                 }
  146.                 else turnRight(destDir - getHeading());
  147.             }
  148.             else ahead(Math.hypot(destX-getX(), destY-getY()));
  149.         }
  150.     }
  151.    
  152.     public void onScannedRobot(ScannedRobotEvent e)
  153.     {
  154.         // wyniki z radaru
  155.        
  156.         double myX = getX();
  157.         double myY = getY();
  158.        
  159.         double kontWrogaWzgl = e.getBearing();
  160.         double mojKont = this.getHeading();
  161.         double kontWrogaBezWzgl = Math.toRadians((mojKont+kontWrogaWzgl) % 360);
  162.         double odleglosc = e.getDistance();
  163.        
  164.         Integer nowyWrugX = (int)Math.round(Math.sin(kontWrogaBezWzgl)*odleglosc + myX);
  165.         Integer nowyWrugY = (int)Math.round(Math.cos(kontWrogaBezWzgl)*odleglosc + myY);
  166.        
  167.         boolean jestJusz = false;
  168.         Iterator<Pozycja> iteratorWrug = Wrugowie.iterator();
  169.         while(iteratorWrug.hasNext())
  170.         {
  171.             Pozycja next = iteratorWrug.next();
  172.             if(Math.abs(next.x-nowyWrugX)<5 && Math.abs(next.y-nowyWrugY)<5)
  173.             {
  174.                 jestJusz = true;
  175.                 break;
  176.             }
  177.         }
  178.         if(!jestJusz) Wrugowie.add(new Pozycja(nowyWrugX, nowyWrugY));
  179.     }
  180.    
  181.     public void onPaint(Graphics2D g)
  182.     {
  183.  
  184.         // Set the paint color to red
  185.         double myX = getX();
  186.         double myY = getY();
  187.        
  188.         Pozycja mojeTajle = xyToTile(myX, myY);
  189.        
  190.         //if(Wrugowie.size() == 123 && notMappedYet)mapToTiles();
  191.         if(Wrugowie.size() == 123 && notMappedYet)
  192.         {
  193.             mapToTiles();
  194.             notMappedYet = false;
  195.             //aGwiazdka(mojeTajle, xyToTile(900,100));
  196.             //System.out.println("rozmiar drogi: " + Integer.toString(droga.size()));
  197.         }
  198.        
  199.         g.setColor(java.awt.Color.WHITE);
  200.         if(droga.size() > 0)
  201.         {
  202.             System.out.println("rysujedroge");
  203.             Iterator<Node> iterDroga = droga.iterator();
  204.             while(iterDroga.hasNext())
  205.             {
  206.                 Node nodeD = iterDroga.next();
  207.                 System.out.println(" B:" + Boolean.toString(stojable((double)nodeD.pos.x, (double)nodeD.pos.y)));
  208.                 g.fillOval(nodeD.pos.x-5, nodeD.pos.y-5, 10, 10);
  209.             }
  210.         }
  211.         //mapToTiles();
  212.        
  213.        
  214.        
  215.         g.drawString("Muj  X: " + Double.toString(myX), 10, 990);
  216.         g.drawString("Tile  X: " + Integer.toString(mojeTajle.x), 200, 990);
  217.         g.drawString("Heading: " + Double.toString(getHeading()), 280, 990);
  218.         g.drawString("Muj  Y: " + Double.toString(myY), 10, 978);
  219.         g.drawString("Tile  Y: " + Integer.toString(mojeTajle.y), 200, 978);
  220.         g.drawString("Dest H: " + Double.toString(destDir), 280, 978);
  221.         g.drawString("Wroguf: " + Wrugowie.size(), 10, 966);
  222.         g.drawString("Tile: " + mapTiles.size(), 10, 954);
  223.         g.drawString("Zmapowane: " + Boolean.toString(!notMappedYet), 100, 954);
  224.         g.drawString("Stojable: " + Boolean.toString(testowyBool), 10, 942);
  225.         g.drawString("Droga: " + Integer.toString(droga.size()), 100, 942);
  226.        
  227. //        g.setColor(java.awt.Color.BLUE);
  228. //        g.fillRect(mojeTajle.x*20, mojeTajle.y*20, 20, 20);
  229.        
  230.         g.setColor(java.awt.Color.RED);
  231.         /*Iterator<Pozycja> iteratorWrug = Wrugowie.iterator();
  232.         while(iteratorWrug.hasNext())
  233.         {
  234.             Pozycja next = iteratorWrug.next();
  235. //            g.drawRect(next.x-20, next.y-20, 40, 40);
  236.             g.fillRect(next.x-20, next.y-20, 40, 40);
  237.         }*/
  238.         g.setColor(java.awt.Color.GREEN);
  239.         for(int cntH = 0; cntH<=bfHeight; cntH+=20)
  240.         {
  241.             g.drawLine(cntH, 0, cntH, bfWidth);
  242.         }
  243.         for(int cntW = 0; cntW<=bfWidth; cntW+=20)
  244.         {
  245.             g.drawLine(0, cntW, bfHeight, cntW);
  246.         }
  247.      
  248.         g.setColor(java.awt.Color.BLUE);
  249.         for(Map.Entry<Pozycja,Boolean> entry : mapTiles.entrySet())
  250.         {
  251.             if(entry.getValue() == false)
  252.             {
  253.                 g.fillRect(entry.getKey().x, entry.getKey().y, 20, 20);
  254.             }
  255.         }
  256.     }
  257.    
  258.     public void onMouseClicked(MouseEvent e)
  259.     {
  260.         //testowyBool = stojable(e.getX(), e.getY());
  261.         //destX = e.getX();
  262.         //destY = e.getY();
  263.         destDist = Math.hypot(destX-getX(), destY-getY());
  264.         Pozycja mojeTajle = xyToTile(getX(), getY());
  265.         mapToTiles();
  266.         if(!notMappedYet)aGwiazdka(mojeTajle, xyToTile(e.getX(),e.getY()));
  267.         System.out.println("jest droga");
  268.     }
  269.    
  270.     public double atan2deg(double atan)
  271.     {
  272.         if(atan >= 0) return atan;
  273.         else return 360.0+atan;
  274.     }
  275.    
  276.     public void mapToTiles()
  277.     {
  278.         if(mapTiles.isEmpty())
  279.         {
  280.             for(int cntH = 0; cntH<bfHeight; cntH+=20)
  281.             {
  282.                 for(int cntW = 0; cntW<bfWidth; cntW+=20)
  283.                 {
  284.                     //g.drawRect(cntW, cntH, 20, 20);
  285.                     mapTiles.put(new Pozycja(cntW, cntH), Boolean.TRUE);
  286.                 }
  287.             }
  288.  
  289.         }
  290.         Iterator<Pozycja> iteratorWrug = Wrugowie.iterator();
  291.         while(iteratorWrug.hasNext())
  292.         {
  293.             Pozycja next = iteratorWrug.next();
  294.  
  295.             int rog1X = next.x - 19;
  296.             int rog1Y = next.y - 19;
  297.             int rog2X = next.x + 19;
  298.             int rog2Y = next.y - 19;
  299.             int rog3X = next.x - 19;
  300.             int rog3Y = next.y + 19;
  301.             int rog4X = next.x + 19;
  302.             int rog4Y = next.y + 19;
  303.  
  304.             mapTiles.put(xyToTile(rog1X, rog1Y), Boolean.FALSE);
  305.             mapTiles.put(xyToTile(rog2X, rog2Y), Boolean.FALSE);
  306.             mapTiles.put(xyToTile(rog3X, rog3Y), Boolean.FALSE);
  307.             mapTiles.put(xyToTile(rog4X, rog4Y), Boolean.FALSE);
  308.         }
  309.        
  310.         for(Map.Entry<Pozycja,Boolean> entry : mapTiles.entrySet())
  311.         {
  312.             if(entry.getValue() == Boolean.FALSE)
  313.             {
  314.                 Pozycja pos = entry.getKey();
  315.                 if(!mapTiles.get(new Pozycja(pos.x+40, pos.y)))
  316.                 {
  317.                     mapTiles.put(new Pozycja(pos.x+20, pos.y), Boolean.FALSE);
  318.                 }
  319.                 if(!mapTiles.get(new Pozycja(pos.x, pos.y+40)))
  320.                 {
  321.                     mapTiles.put(new Pozycja(pos.x, pos.y+20), Boolean.FALSE);
  322.                 }
  323.             }
  324.         }
  325.         notMappedYet = false;
  326.     }
  327.    
  328.     Pozycja xyToTile(double x, double y)
  329.     {
  330.         int xTile = (int)Math.floor(x/20)*20;
  331.         int yTile = (int)Math.floor(y/20)*20;
  332.        
  333.         return new Pozycja(xTile, yTile);
  334.     }
  335.    
  336.     Boolean stojable(double x, double y)
  337.     {
  338.         if(x<19.9 || y<19.9 || x>bfWidth-19.9 || y>bfHeight-19.9) return Boolean.FALSE;
  339.         if(!mapTiles.get(xyToTile(x, y))) return Boolean.FALSE;
  340.         if(!mapTiles.get(xyToTile(x-19.9, y+19.9)) ||
  341.            !mapTiles.get(xyToTile(x, y+19.9)) ||
  342.            !mapTiles.get(xyToTile(x+19.9, y+19.9)) ||
  343.            !mapTiles.get(xyToTile(x-19.9, y)) ||
  344.            !mapTiles.get(xyToTile(x+19.9, y)) ||
  345.            !mapTiles.get(xyToTile(x-19.9, y-19.9)) ||
  346.            !mapTiles.get(xyToTile(x, y-19.9)) ||
  347.            !mapTiles.get(xyToTile(x+19.9, y-19.9))) return Boolean.FALSE;
  348.  
  349.         return Boolean.TRUE;
  350.     }
  351.    
  352.     double travelCost(Pozycja start, Pozycja end)
  353.     {
  354.         //double kont = Math.toDegrees(Math.atan2(end.y-start.y, end.x-start.x));
  355.         int xAkt = start.x;
  356.         int yAkt = start.y;
  357.         double kosztJedn = 20;
  358.         double wspKosztuSkos = Math.sqrt(2)*2;
  359.        
  360.         double koszt = 0;
  361.         while(xAkt!=end.x || yAkt!=end.y)
  362.         {
  363.             if(xAkt < end.x && yAkt < end.y)    // skos gura prawo
  364.             {
  365.                 koszt += wspKosztuSkos*kosztJedn;
  366.                 xAkt += 20;
  367.                 yAkt += 20;
  368.             }
  369.             else if(xAkt > end.x && yAkt > end.y)    // skos dul lewo
  370.             {
  371.                 koszt += wspKosztuSkos*kosztJedn;
  372.                 xAkt -= 20;
  373.                 yAkt -= 20;
  374.             }
  375.             else if(xAkt < end.x && yAkt > end.y)    //skos dul prawo
  376.             {
  377.                 koszt += wspKosztuSkos*kosztJedn;
  378.                 xAkt += 20;
  379.                 yAkt -= 20;
  380.             }
  381.             else if(xAkt > end.x && yAkt < end.y)    //skos gura lewo
  382.             {
  383.                 koszt += wspKosztuSkos*kosztJedn;
  384.                 xAkt -= 20;
  385.                 yAkt += 20;
  386.             }
  387.             else if(xAkt < end.x)
  388.             {
  389.                 koszt += kosztJedn;
  390.                 xAkt += 20;
  391.             }
  392.             else if(xAkt > end.x)
  393.             {
  394.                 koszt += kosztJedn;
  395.                 xAkt -= 20;
  396.             }
  397.             else if(yAkt < end.y)
  398.             {
  399.                 koszt += kosztJedn;
  400.                 yAkt += 20;
  401.             }
  402.             else if(yAkt > end.y)
  403.             {
  404.                 koszt += kosztJedn;
  405.                 yAkt -= 20;
  406.             }
  407.         }
  408.  
  409.         return koszt;
  410.     }
  411.  
  412.     void createGraph(Pozycja start, Pozycja end)
  413.     {
  414.         for(Map.Entry<Pozycja,Boolean> entry : mapTiles.entrySet())
  415.         {
  416.             if(entry.getValue() == Boolean.TRUE)
  417.             {
  418.                 if(stojable(entry.getKey().x, entry.getKey().y))
  419.                 {
  420.                     if(entry.getKey().x - start.x == 0 && entry.getKey().y - start.y == 0)
  421.                     {
  422.                         graph.put(entry.getKey(), new Node(entry.getKey(), true, false));
  423.                         System.out.println("Znaleziono start");
  424.                     }
  425.                     else if(entry.getKey().x - end.x == 0 && entry.getKey().y - end.y == 0)
  426.                     {
  427.                         graph.put(entry.getKey(), new Node(entry.getKey(), false, true));  
  428.                         System.out.println("Znaleziono koniec");
  429.                     }
  430.                     else graph.put(entry.getKey(), new Node(entry.getKey(), false, false));
  431.                     //graph.get(entry.getKey()).setCost(start, end);
  432.                 }
  433.             }
  434.         }
  435.     }
  436.    
  437.     void aGwiazdka (Pozycja start, Pozycja end)
  438.     {
  439.         createGraph(start, end);
  440.         droga.clear();
  441.        
  442.         ArrayList<Node> openNodes = new ArrayList<Node>();
  443.         ArrayList<Node> closedNodes = new ArrayList<Node>();
  444.         Node curNode;
  445.         ArrayList<Node> succesors = new ArrayList<Node>();
  446.        
  447.         openNodes.add(graph.get(start));
  448.         curNode = openNodes.get(0);
  449.         while(!openNodes.isEmpty())
  450.         {
  451.             openNodes.sort(null);
  452.             curNode = openNodes.get(0);
  453.             //System.out.print("Rozmiar: " + Boolean.toString(curNode.isStart));
  454.             if(curNode.isEnd) break;
  455.             succesors.clear();
  456.             for(int i = -20;i<=20;i+=20)
  457.             {
  458.                 for(int j = -20;j<=20;j+=20)
  459.                 {
  460.                     if((i!=0 || j!=0) && stojable(curNode.pos.x + i, curNode.pos.y + j))
  461.                         succesors.add(graph.get(new Pozycja(curNode.pos.x + i, curNode.pos.y + j)));
  462.                 }
  463.             }
  464.             System.out.print(" " + Integer.toString(succesors.size()));
  465.             for(int i = 0; i<succesors.size();i++)
  466.             {
  467.                 Node succesor = succesors.get(i);
  468.                 double currentSuccesorCost =  curNode.gCost + travelCost(curNode.pos, succesor.pos);
  469.                 if(openNodes.contains(succesor))
  470.                 {
  471.                     if(succesor.gCost <= currentSuccesorCost) continue;
  472.                 }
  473.                 else if(closedNodes.contains(succesor))
  474.                 {
  475.                     if(succesor.gCost <= currentSuccesorCost) continue;
  476.                     closedNodes.remove(closedNodes.indexOf(succesor));
  477.                     openNodes.add(succesor);
  478.                 }
  479.                 else
  480.                 {
  481.                     openNodes.add(succesor);
  482.                     succesor.setHCost(end);
  483.                 }
  484.                 succesor.setGcost(currentSuccesorCost);
  485.                 succesor.setParent(curNode.pos);
  486.             }
  487.             closedNodes.add(curNode);
  488.             openNodes.remove(openNodes.indexOf(curNode));
  489.         }
  490.         Node tempNode = curNode;
  491.         droga.add(curNode);
  492.         while(tempNode.pos.x != start.x || tempNode.pos.y != start.y)
  493.         {
  494.             tempNode = graph.get(tempNode.parent);
  495.             droga.add(tempNode);
  496.         }
  497.         //Collections.reverse(droga);
  498.        
  499.         if(curNode.pos != end)
  500.         {
  501.             System.out.print("pszypau");
  502.         }
  503.     }
  504. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement