Advertisement
Guest User

Applet Labirynt

a guest
Oct 28th, 2012
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.04 KB | None | 0 0
  1. //LabApplet.java//
  2.  
  3. import java.awt.Color;
  4. import java.awt.Graphics;
  5. import java.awt.Graphics2D;
  6. import java.awt.Image;
  7. import java.awt.MediaTracker;
  8. import java.awt.RenderingHints;
  9. import java.awt.event.KeyEvent;
  10. import java.awt.event.KeyListener;
  11. import java.awt.image.BufferedImage;
  12. import javax.swing.JApplet;
  13. import java.net.URL;
  14. import java.util.Random;
  15.  
  16.  
  17. public class LabApplet extends JApplet implements KeyListener {
  18.     private static final long serialVersionUID = -8465410739280348595L;
  19.    
  20.     private URL url; //do pobrania obrazka
  21.     private Komorka mapa[][] = new Komorka[32][32]; // tablica labiryntu
  22.     Image obrazek, bufor, labirynt;
  23.     Graj graj; 
  24.     int rozmiarx = 34*16, rozmiary = 34*16, wspx, wspy, s = 16, losowania = 0, wx, wy;  // s-wielkosc tilesa, wsp - do generatora, wx, wy- do chodzenia
  25.  
  26.     BufferedImage bufferedImage = new BufferedImage(rozmiarx, rozmiary, BufferedImage.TYPE_INT_RGB);
  27.     Random generator = new Random();
  28.    
  29.     RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  30.     Graphics2D g2 = bufferedImage.createGraphics();
  31.     Graphics bg, labg;
  32.  
  33.    
  34.     public void init() {
  35.         pobranieObrazka(); //pobiera potrzebna grafike
  36.        
  37.         bufor = createImage(rozmiarx,rozmiary); //obrazek buforu
  38.         labirynt = createImage(rozmiarx,rozmiary); //obrazek labiryntu
  39.         bg = bufor.getGraphics();
  40.         labg = labirynt.getGraphics();
  41.        
  42.         generator(); //generuje mape labiryntu i rysuje jÄ… do obrazka
  43.  
  44.         addKeyListener(this);
  45.        
  46.         setVisible(true);
  47.         setFocusable(true);    
  48.         this.requestFocus(); //potrzebny focus
  49.        
  50.         rysowanieDoBuforu(); //rysowanie
  51.         repaint();
  52.        
  53.         graj();
  54.     }
  55.    
  56.     public void start() {
  57.         this.requestFocus();
  58.     }
  59.    
  60.     private void graj() {
  61.         graj = new Graj(31, 31, this);
  62.     }
  63.    
  64.     private void pobranieObrazka() {
  65.         MediaTracker mt;
  66.         mt = new MediaTracker(this);   
  67.         url = getClass().getResource("labir.png");
  68.         obrazek = getToolkit().getImage(url);
  69.         mt.addImage(obrazek,1);
  70.         try{
  71.           mt.waitForAll();
  72.         }
  73.         catch (InterruptedException e) {}
  74.     }
  75.    
  76.     protected void gratulacje() {
  77.         g2.setPaint(new Color(255,255,255));
  78.         g2.fillRect(0,0,rozmiarx,rozmiary);
  79.         g2.setPaint(new Color(0,0,0));
  80.         g2.drawString("Gratulacje!", 300, 300);
  81.         g2.drawString("copyright: szymonhab@gmail.com", 10*16, 33*16);
  82.         bg.drawImage(bufferedImage,0,0,this);
  83.         repaint();
  84.     }
  85.  
  86.     public void stop() {}
  87.     public void destroy() {}
  88.    
  89.     private void generator() {
  90.       for(int i=0; i<32; i++){
  91.         for(int j=0; j<32; j++){
  92.           mapa[i][j]=new Komorka();
  93.         }
  94.       }
  95.       generujSciezke(31, 31, generator.nextInt(20), false);
  96.       boolean allvisited = false;
  97.       int tmp2 = 0;
  98.       while(!allvisited){
  99.           allvisited=true;
  100.           tmp2++;
  101.           for(int g=0; g<32; g++) {
  102.               for(int h=0; h<32; h++) {
  103.                   if(mapa[g][h].visited==1) { generujSciezke(g, h, generator.nextInt(20), false);}
  104.                   if(mapa[g][h].visited==0) { if(tmp2>4) {generujSciezke(g, h, generator.nextInt(20), true); } allvisited=false; }
  105.               }
  106.           }
  107.       }
  108.       rysujDoObrazka();
  109.       System.out.println(losowania);
  110.     }
  111.    
  112.     private void generujSciezke(int wx, int wy, int dlugosc, boolean przebicie) {
  113.         int kierunek=0; //0-gora, 1-dol, 2-lewo, 3-prawo
  114.         int b = 0;
  115.         mapa[31][31].visited=1;
  116.         int nastSciezka = generator.nextInt(dlugosc+1);
  117.         while((wx!=0 || wy!=0) && b<dlugosc+1) {
  118.             b++;
  119.             kierunek = wazenieLosowej(wx, wy, kierunek, przebicie);
  120.             if(kierunek==4) {b=1000; break;}
  121.             switch(kierunek) {
  122.             case 0: mapa[wx][wy].up = 1; wy--; mapa[wx][wy].down = 1; mapa[wx][wy].visited=1;break;
  123.             case 1: mapa[wx][wy].down = 1; wy++; mapa[wx][wy].up = 1; mapa[wx][wy].visited=1;break;
  124.             case 2: mapa[wx][wy].left = 1; wx--; mapa[wx][wy].right = 1; mapa[wx][wy].visited=1;break;
  125.             case 3: mapa[wx][wy].right = 1; wx++; mapa[wx][wy].left = 1; mapa[wx][wy].visited=1;break;         
  126.             }
  127.             if(b==nastSciezka && przebicie==false) { generujSciezke(wx, wy, generator.nextInt(20), false); }
  128.             if(b==generator.nextInt(dlugosc+2) && przebicie==false) { generujSciezke(wx, wy, generator.nextInt(20), false); }
  129.         }
  130.     }
  131.    
  132.     private int wazenieLosowej(int wx, int wy, int kierunek, boolean przebicie) {
  133.         losowania++;
  134.         int szansa0=0, szansa1=0, szansa2=0, szansa3=0; //szanse
  135.         if(kierunek!=1 && wy!=0 && mapa[wx][wy-1].visited!=1) szansa0=35;
  136.         if(kierunek!=0 && wy!=31 && mapa[wx][wy+1].visited!=1) szansa1 = 35;
  137.         if(kierunek!=3 && wx!=0 && mapa[wx-1][wy].visited!=1) szansa2 = 35;
  138.         if(kierunek!=2 && wx!=31 && mapa[wx+1][wy].visited!=1) szansa3 = 35;
  139.         if(szansa0+szansa1+szansa2+szansa3 == 0 && (generator.nextInt(100)==15 || przebicie == true)) { //szanse na przeskok
  140.             if(kierunek!=1 && wy!=0) szansa0=35;
  141.             if(kierunek!=0 && wy!=31) szansa1 = 35;
  142.             if(kierunek!=3 && wx!=0) szansa2 = 35;
  143.             if(kierunek!=2 && wx!=31) szansa3 = 35;
  144.         }
  145.         else if(szansa0+szansa1+szansa2+szansa3 == 0) return 4;
  146.         //losowanie//
  147.         int losowa = generator.nextInt(szansa0+szansa1+szansa2+szansa3);
  148.         if(losowa<szansa0) return 0;
  149.         if(szansa0<=losowa && losowa<szansa1+szansa0) return 1;
  150.         if(szansa0+szansa1<=losowa && losowa<szansa2+szansa1+szansa0) return 2;
  151.         else return 3;
  152.     }
  153.    
  154.     private void rysujDoObrazka() {
  155.         int x;
  156.         for(int i=0; i<32; i++){
  157.             for(int j=0; j<32; j++){
  158.                     x = kratka(mapa[i][j]);
  159.                     labg.drawImage(obrazek,i*s,j*s,i*s+s,j*s+s,x*s,0,x*s+s,s,this);  
  160.             }
  161.         }
  162.        
  163.     }
  164.        
  165.     private void rysowanieDoBuforu() {
  166.         g2.setRenderingHints(rh);
  167.         g2.setPaint(new Color(255,255,255));
  168.         g2.fillRect(0,0,rozmiarx,rozmiary);
  169.         g2.setPaint(new Color(0,0,0));
  170.         g2.drawImage(labirynt,1,1,rozmiarx,rozmiary,this);
  171.         g2.drawRect(0, 0, 32*16+1, 32*16+1);
  172.         g2.drawImage(obrazek,1,1,1+s,1+s,18*s,0,18*s+s,s,this);
  173.         g2.drawImage(obrazek,1+31*s,1+31*s,1+31*s+s,1+31*s+s,18*s,0,18*s+s,s,this);
  174.         g2.drawImage(obrazek,1,1,1+s,1+s,16*s,0,16*s+s,s,this);
  175.         g2.drawString("copyright: szymonhab@gmail.com", 10*16, 33*16);
  176.         g2.drawImage(obrazek,1+wx*s,1+wy*s,1+wx*s+s,1+wy*s+s,17*s,0,17*s+s,s,this); //rysowanie ludzika
  177.         bg.drawImage(bufferedImage,0,0,this);
  178.     }
  179.    
  180.     protected void przerysuj(int wx, int wy) {
  181.         this.requestFocus();
  182.         this.wx=wx;
  183.         this.wy=wy;
  184.         rysowanieDoBuforu();
  185.         repaint();
  186.     }
  187.    
  188.     public void update(Graphics g) {
  189.         bg.clearRect(0, 0, rozmiarx, rozmiary);
  190.         paint(bg);
  191.         g.drawImage(bufor,0,0,this);
  192.     }
  193.    
  194.     public void paint(Graphics g) {
  195.         g.drawImage(bufor,0,0,this);
  196.       }
  197.    
  198.     private int kratka(Komorka k) { //Przypisanie obrazka do zmiennych w Komorce
  199.           if(k.down!=0)
  200.             if(k.up!=0)
  201.               if(k.left!=0)
  202.             if(k.right!=0) return 10;
  203.             else return 6;
  204.               else
  205.             if(k.right!=0) return 8;
  206.             else return 0;
  207.             else
  208.               if(k.left!=0)
  209.             if(k.right!=0) return 9;
  210.             else return 3;
  211.               else
  212.             if(k.right!=0) return 2;
  213.             else return 15;
  214.           else
  215.             if(k.up!=0)
  216.               if(k.left!=0)
  217.             if(k.right!=0) return 7;
  218.             else return 4;
  219.               else
  220.             if(k.right!=0) return 5;
  221.             else return 13;
  222.             else
  223.               if(k.left!=0)
  224.             if(k.right!=0) return 1;
  225.             else return 12;
  226.               else
  227.             if(k.right!=0) return 14;
  228.             else return 11;
  229.         }
  230.  
  231.     @Override
  232.     public void keyPressed(KeyEvent e) {
  233.         int evt = e.getKeyCode();
  234.         switch(evt) {
  235.         case KeyEvent.VK_UP: System.out.println("up"); if(mapa[wx][wy].up==1) graj.y--;break;
  236.         case KeyEvent.VK_DOWN: System.out.println("down"); if(mapa[wx][wy].down==1) graj.y++;break;
  237.         case KeyEvent.VK_LEFT: System.out.println("left"); if(mapa[wx][wy].left==1)  graj.x--;break;
  238.         case KeyEvent.VK_RIGHT: System.out.println("right"); if(mapa[wx][wy].right==1) graj.x++;break;
  239.         }  
  240.     }
  241.  
  242.     @Override
  243.     public void keyReleased(KeyEvent e) {  
  244.     }
  245.    
  246.     @Override
  247.     public void keyTyped(KeyEvent e) {     
  248.     }
  249. }
  250.  
  251. //Komorka.java//
  252. public class Komorka {
  253.   int up, down, left, right, visited=0;
  254.   Komorka() {
  255.     up = 0;
  256.     down = 0;
  257.     left = 0;
  258.     right = 0;
  259.   }
  260.   Komorka(int up, int down, int left, int right) {
  261.     this.up=up;
  262.     this.down=down;
  263.     this.left=left;
  264.     this.right=right;
  265.   }
  266. }
  267.  
  268. //Graj.java//
  269.  
  270.  
  271. public class Graj implements Runnable {
  272.     int x, y;
  273.     LabApplet lab;
  274.     Thread thread;
  275.    
  276.     long czas, poprzedni_czas, czas_do_fps, czasDoTimeStep = (long) 0;
  277.     final long timeStep = (long) 30;
  278.  
  279.    
  280.     Graj(int x, int y, LabApplet lab) {
  281.         this.x=x;
  282.         this.y=y;
  283.         this.lab=lab;
  284.         poprzedni_czas = System.currentTimeMillis();
  285.         thread = new Thread(this);
  286.         thread.start();
  287.     }
  288.     @Override
  289.     public void run() {
  290.         boolean exit = false;
  291.         while(!exit) {
  292.             sprawdzCzas();
  293.             czasDoTimeStep=czasDoTimeStep+czas;
  294.             while(czasDoTimeStep>timeStep) {   
  295.                 exit = sprawdzWarunekZakonczenia(x, y);
  296.                 przerysuj(x, y);
  297.                 czasDoTimeStep=czasDoTimeStep-timeStep;
  298.             }
  299.             try { Thread.sleep(timeStep); }
  300.             catch (InterruptedException e) { }
  301.         }  
  302.         if(exit) lab.gratulacje();
  303.     }
  304.    
  305.     private boolean sprawdzWarunekZakonczenia(int wx, int wy) {
  306.         if(wx==0 && wy==0) return true;
  307.         else return false;
  308.     }
  309.    
  310.     private void przerysuj(int wx, int wy) {
  311.         lab.przerysuj(wx, wy);
  312.     }
  313.    
  314.     void sprawdzCzas() {
  315.         czas = System.currentTimeMillis() - poprzedni_czas;
  316.         poprzedni_czas = System.currentTimeMillis();
  317.     }
  318.  
  319. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement