Advertisement
qtinio

gwiazdalak

May 20th, 2019
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.67 KB | None | 0 0
  1.  
  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.Graphics2D;
  5. import java.util.ArrayList;
  6. import robocode.AdvancedRobot;
  7. import robocode.*;
  8. import robocode.util.Utils;
  9. import static robocode.util.Utils.normalAbsoluteAngle;
  10. import static robocode.util.Utils.normalRelativeAngle;
  11.  
  12. /*
  13.  * To change this license header, choose License Headers in Project Properties.
  14.  * To change this template file, choose Tools | Templates
  15.  * and open the template in the editor.
  16.  */
  17.  
  18. /**
  19.  *
  20.  * @author Gruby
  21.  */
  22. public class gwiazdkalak extends AdvancedRobot{
  23.     int szerokosc_kratki = 40;
  24.     ArrayList<Wierzchol> wierzcholki = new ArrayList<>();
  25.     ArrayList<Przeszkody> przeszkody = new ArrayList<>();
  26.     ArrayList<Mapa> closed = new ArrayList<>();
  27.     ArrayList<ArrayList<Mapa>> mapa = new ArrayList<>();
  28.     boolean rysuj_trase = false;
  29.     int liczba_robotow = 0;
  30.     int celY = 24;
  31.     int celX = 4;
  32.     int kosztg = 20;
  33.    
  34.     @Override
  35.     public void run(){
  36.    
  37.         stworz_plansze();
  38.         //astar();
  39.         setTurnRight(90);
  40.         waitFor(new TurnCompleteCondition(this));
  41.         setTurnLeft(180);
  42.         waitFor(new TurnCompleteCondition(this));
  43.         setTurnRight(180);
  44.         waitFor(new TurnCompleteCondition(this));
  45.         a();
  46.         rysuj_trase = true;
  47.  
  48.         while (true) {
  49.             setTurnRight(90);
  50.             waitFor(new TurnCompleteCondition(this));
  51.             setTurnLeft(180);
  52.             waitFor(new TurnCompleteCondition(this));
  53.             setTurnRight(180);
  54.             waitFor(new TurnCompleteCondition(this));
  55. //        
  56.         }
  57.     }
  58.    
  59.     public void a(){
  60.        
  61.         // aktualna pozycja
  62.         int akt_x;
  63.         int akt_y;
  64.         double najmniejsza;
  65.         Wierzchol najmniejsza_mapa;
  66.         ArrayList<Wierzchol> otwarta = new ArrayList<>();
  67.         wierzcholki.add(new Wierzchol(3, 3));
  68.         mapa.get(3).get(3).zajety = true;
  69.        
  70. //        while(wierzcholki.size() != 50){
  71.            
  72.         while(wierzcholki.get(wierzcholki.size()-1).y != celY){
  73.             otwarta.clear();
  74.             najmniejsza = 100000;
  75.             najmniejsza_mapa = new Wierzchol(0, 0);
  76.            
  77.             // badanie dostepnych wierzcholkow
  78.             akt_x = wierzcholki.get(wierzcholki.size()-1).x;
  79.             akt_y = wierzcholki.get(wierzcholki.size()-1).y;
  80.             dodaj_do_otwartej(otwarta, akt_x, akt_y);
  81.            
  82.             // wycofaj jezeli slepa uliczka
  83.             while (otwarta.isEmpty()){
  84.                 wierzcholki.remove(wierzcholki.size()-1);
  85.                 akt_x = wierzcholki.get(wierzcholki.size()-1).x;
  86.                 akt_y = wierzcholki.get(wierzcholki.size()-1).y;
  87.                 dodaj_do_otwartej(otwarta, akt_x, akt_y);
  88.             }
  89.                        
  90.             // najmniejszy koszt podrozy
  91.             for (int i = 0; i < otwarta.size(); i++){
  92.                 if (najmniejsza
  93.                         > mapa.get(otwarta.get(i).y).get(otwarta.get(i).x).f)
  94.                 {
  95.                     najmniejsza =
  96.                             mapa.get(otwarta.get(i).y).get(otwarta.get(i).x).f;
  97.                     najmniejsza_mapa = otwarta.get(i);
  98.                 }
  99.             }
  100.            
  101.             // dodanie wierzcholka z najmniejszym f
  102.             wierzcholki.add(new Wierzchol(najmniejsza_mapa.x,
  103.                     najmniejsza_mapa.y));
  104.             mapa.get(najmniejsza_mapa.y).get(najmniejsza_mapa.x).zajety = true;
  105.         }    
  106.     }
  107.    
  108.     public void dodaj_do_otwartej(ArrayList<Wierzchol> otwarta, int x, int y) {
  109.         if (x >0 && mapa.get(y).get(x-1).zajety != true){
  110.             otwarta.add(new Wierzchol(x-1, y));
  111.             aktualizuj_mape(x, y, x-1, y);
  112.         }
  113.         if (x < 24 && mapa.get(y).get(x+1).zajety != true){
  114.             otwarta.add(new Wierzchol(x+1, y));
  115.             aktualizuj_mape(x, y, x+1, y);
  116.         }
  117.         if (y > 0 && mapa.get(y-1).get(x).zajety != true){
  118.             otwarta.add(new Wierzchol(x, y-1));
  119.             aktualizuj_mape(x, y, x, y-1);
  120.         }
  121.         if (y < 24 && mapa.get(y+1).get(x).zajety != true){
  122.             otwarta.add(new Wierzchol(x, y+1));
  123.             aktualizuj_mape(x, y, x, y+1);
  124.         }
  125.     }
  126.    
  127.     public void aktualizuj_mape(int aktx, int akty, int otwx, int otwy){
  128.         mapa.get(otwy).get(otwx).h = pitagorasalak(celX, celY, otwx, otwy);
  129.         mapa.get(otwy).get(otwx).g = mapa.get(akty).get(aktx).g + kosztg;
  130.         mapa.get(otwy).get(otwx).aktualizuj();
  131.     }
  132.    
  133.     public double pitagorasalak(int x1, int y1, int x2, int y2){
  134.         double loc_x1 = mapa.get(y1).get(x1).x;
  135.         double loc_y1 = mapa.get(y1).get(x1).y;
  136.         double loc_x2 = mapa.get(y2).get(x2).x;
  137.         double loc_y2 = mapa.get(y2).get(x2).y;
  138.        
  139.         return Math.sqrt(Math.pow(loc_y2 - loc_y1, 2)
  140.                 + Math.pow(loc_x2 - loc_x1, 2));
  141.     }
  142.    
  143.     public void jedz(int nrx, int nry) {
  144.         double celx = mapa.get(nry).get(nrx).x + szerokosc_kratki/2;
  145.         double cely = mapa.get(nry).get(nrx).y + szerokosc_kratki/2;
  146.         setTurnRightRadians(angleToTurnInRadians(celx, cely));
  147.         waitFor(new TurnCompleteCondition(this));
  148.             while(dystans(celx, cely) > 5){
  149.                 setAhead(50);
  150.                 execute();
  151.                
  152.             }
  153. //        }
  154.         setAhead(0);
  155.     }
  156.    
  157.     public double dystans(double x, double y){
  158.         return Math.sqrt(Math.pow(y - getY(), 2) + Math.pow(x - getX(), 2));
  159.     }
  160.    
  161.     public double angleToTurnInRadians(double x, double y){
  162.         double angle = normalAbsoluteAngle(Math.atan2(x - getX(), y - getY()));
  163.         return normalRelativeAngle(angle - getHeadingRadians());
  164.     }
  165.    
  166.     public void stworz_plansze(){  
  167.         int x_m = 0;
  168.         int y_m = 0;
  169.         int liczba_kratek = 1000/szerokosc_kratki;
  170.        
  171.         for(int j=0; j<liczba_kratek; j++){
  172.             ArrayList<Mapa> mapalista = new ArrayList<>();
  173.             for(int i=0; i<liczba_kratek; i++){
  174.                 mapalista.add(new Mapa(x_m, y_m, false, 10000, 10000));
  175.                 x_m=x_m+40;
  176.             }
  177.             mapa.add(mapalista);
  178.             y_m=y_m+40;
  179.             x_m=0;
  180.         }
  181.     }
  182.    
  183.     @Override
  184.     public void onScannedRobot(ScannedRobotEvent e) {
  185. //        double angle = Math.toRadians((getHeading() + e.getBearing()) % 360);
  186.         if(liczba_robotow < 300){
  187.         double absoluteBearing = getHeadingRadians() + e.getBearingRadians();
  188.         double enemyX = getX() + e.getDistance() * Math.sin(absoluteBearing);
  189.         double enemyY = getY() + e.getDistance() * Math.cos(absoluteBearing);
  190.        
  191.         for (int i = 0; i < mapa.size(); i++) {
  192.             for (int j = 0; j < mapa.size(); j++) {
  193.                 if(((mapa.get(i).get(j).x >= enemyX-szerokosc_kratki
  194.                         && mapa.get(i).get(j).x<=enemyX)
  195.                         && (mapa.get(i).get(j).y >= enemyY-szerokosc_kratki
  196.                         && mapa.get(i).get(j).y<=enemyY))
  197.                         && mapa.get(i).get(j).zajety != true){
  198.                     mapa.get(i).get(j).zajety=true;
  199.                     liczba_robotow += 1;
  200.                 }
  201.            }
  202.         }
  203.         }
  204.     }
  205.    
  206.     @Override
  207.     public void onStatus( StatusEvent e) {
  208.     // you can also put all setAdjustXX(..) methods here
  209.         setTurnRadarRightRadians(Double.POSITIVE_INFINITY);
  210.     }
  211.    
  212.     @Override
  213.     public void onPaint(Graphics2D g){
  214.         g.setColor(Color.blue);
  215.         /// rysowalak siatki
  216.         for (int i = 0; i < 25; i++) {
  217.             for (int j = 0; j < 25; j++) {
  218.                 g.setColor(Color.blue);
  219.                 g.drawRect(mapa.get(i).get(j).x, mapa.get(i).get(j).y,
  220.                         szerokosc_kratki, szerokosc_kratki);
  221.                 if(mapa.get(i).get(j).zajety==true){
  222.                     g.setColor(Color.red);
  223.                     g.fillRect(mapa.get(i).get(j).x, mapa.get(i).get(j).y,
  224.                             szerokosc_kratki, szerokosc_kratki);
  225.                 }
  226.             }
  227.         }
  228.         if(rysuj_trase == true){
  229.             g.setColor(Color.green);
  230.             for(int i=0; i<wierzcholki.size(); i++){
  231.                 int iks = wierzcholki.get(i).x;
  232.                 int igr = wierzcholki.get(i).y;
  233.                 g.fillRect(mapa.get(igr).get(iks).x, mapa.get(igr).get(iks).y,
  234.                             szerokosc_kratki, szerokosc_kratki);
  235.             }
  236.         }
  237.     }
  238.    
  239.    
  240.     public class Mapa
  241.     {
  242.         public int x=0;
  243.         public int y=0;
  244.         public boolean zajety = false;
  245.         public double h=0;
  246.         public double g=0;
  247.         public double f=0;
  248.        
  249.         public void aktualizuj(){
  250.             this.f = this.g + this.h;
  251.         }
  252.        
  253.         public Wierzchol zwroc_wierzchol(){
  254.             int x_indeks = (int) this.x / 40;
  255.             int y_indeks = (int) this.y / 40;
  256.            
  257.             return new Wierzchol(x_indeks, y_indeks);
  258.         }
  259.        
  260.         public Mapa(int x_m,int y_m, boolean zajete,int h_m,int g_m){
  261.                 this.x=x_m ;
  262.                 this.y=y_m;
  263.                 this.zajety=zajete;
  264.                 this.h=h_m;
  265.                 this.g=g_m;
  266.                 this.f=this.h+this.g;
  267.  
  268.  
  269.            }
  270.     }
  271.     public class Wierzchol
  272.     {
  273.         public int x=0;
  274.         public int y=0;
  275.  
  276.         public Wierzchol(int x_m,int y_m){
  277.                 x=x_m ;
  278.                 y=y_m;
  279.         }
  280.     }
  281.    
  282.     public class Przeszkody
  283.     {
  284.         public int x=0;
  285.         public int y=0;
  286.  
  287.         public Przeszkody(int x_m,int y_m){
  288.                 x=x_m ;
  289.                 y=y_m;
  290.         }
  291.     }
  292. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement