hypesystem

GE - MineCanvas.java

Nov 14th, 2011
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.74 KB | None | 0 0
  1. package ge;
  2.  
  3. import java.awt.*;
  4. import java.awt.event.*;
  5. import javax.swing.*;
  6. import java.util.Random;
  7.  
  8. /**
  9.  * Write a description of class MineCanvas here.
  10.  *
  11.  * @author Peter Sestoft
  12.  * @author hypesystem <[email protected]>
  13.  * @version 1997, 2007-11-13 modified by hypesystem 14-11 2011
  14.  */
  15.  
  16. public class MineCanvas extends JComponent {
  17.     //cols and rows made static, for use in Mines
  18.   static final int cols = 25, rows = 25;
  19.   private int unit = 15, mines = 0, cleared = 0;
  20.   private boolean[][] mine    = new boolean[cols][rows];
  21.   private boolean[][] visible = new boolean[cols][rows];
  22.   private boolean dead = false, painted = false;
  23.  
  24.   //replacing the constructor added mouse click to allow Mines to control mouse
  25.   // clicks. It seems - if you expect adding the label displaying fields cleared
  26.   // to be a piece of cake - that you haven't tried doing it. Because of the
  27.   // structure of the program, it requires quite a lot to add this simple label.
  28.   public void mouseClick(MouseEvent e) {
  29.       int i = e.getX()/unit, j = e.getY()/unit;
  30.         if (indenfor(i, j) && !dead) {
  31.           visnul(i, j);
  32.           //Linje unødvendig, gøres i visnul():
  33.           // visible[i][j] = true;
  34.           dead = mine[i][j];
  35.           cleared = 0;
  36.           for(boolean[] row : visible)
  37.               for(boolean field : row)
  38.                   if(field) cleared++;
  39.           repaint();
  40.         }
  41.   }
  42.  
  43.   private static final Random rnd = new Random();
  44.  
  45.   // Begynd forfra med et nyt tilfældigt minefelt
  46.   public void nytspil() {
  47.     for (int i=0; i < cols; i++)
  48.       for (int j=0; j < rows; j++) {
  49.         mine[i][j] = rnd.nextDouble() < 0.15; // Mine med 15% sandsynlighed
  50.             if(mine[i][j]) mines++;
  51.         visible[i][j] = false;
  52.       }
  53.     dead = false;
  54.     repaint();
  55.   }
  56.  
  57.   //gets the amount of mines in play
  58.   public int getMines() {
  59.       return mines;
  60.   }
  61.  
  62.   //gets the amount of cleared fields in the game
  63.   public int getCleared() {
  64.       return cleared;
  65.   }
  66.  
  67.   public boolean isPainted() {
  68.       return painted;
  69.   }
  70.  
  71.   // Afgør om koordinat (i,j) falder indenfor minefeltet
  72.   private boolean indenfor(int i, int j) {
  73.     return 0 <= i && i < cols && 0 <= j && j < rows;
  74.   }
  75.  
  76.   // Find antal miner som er naboer til celle (i,j)
  77.   int neighbors(int i, int j) {
  78.     int antal = 0;
  79.     for (int di=-1; di <= 1; di++)
  80.       for (int dj=-1; dj <= 1; dj++)
  81.         if (indenfor(i+di, j+dj) && (di != 0 || dj != 0) && mine[i+di][j+dj])
  82.           antal++;
  83.     return antal;
  84.   }
  85.  
  86.   // Gør alle celler uden minenaboer i omegnen af (i,j) synlige
  87.   private void visnul(int i, int j) {
  88.     if (indenfor(i, j) && !visible[i][j]) {
  89.       visible[i][j] = true;
  90.       if (neighbors(i, j) == 0) {
  91.         for (int di=-1; di <= 1; di++)
  92.           for (int dj=-1; dj <= 1; dj++)
  93.             if (di != 0 || dj != 0)
  94.               visnul(i+di, j+dj);
  95.       }
  96.     }
  97.   }
  98.  
  99.   // Tegn den synlige del af spillebrættet - modificeret til at være pænere
  100.   // (tegner nu et grid) og centrerer nu faktisk tallene i firkanterne. Desuden
  101.   // farver den tallene efter antallet af miner omkring dem.
  102.   // drawLine er ikke særlig smart i dette tilfælde (selvom den anbefales i
  103.   // opgaven), idet den ville kræve endnu en løkke - det er nemmere - som gjort
  104.   // i eksemplet - blot at tilføje en drawRect (der tegner omkredsen af en
  105.   // firkant) for hvert af felterne.
  106.   // Læg mærke til at der er tilføjet et privat felt "mines" der tæller antallet
  107.   // af miner genereret, samt en metode "getMines" der henter antallet af miner.
  108.   @Override
  109.   public void paint(Graphics g) {
  110.     g.setColor(Color.black);
  111.     g.drawRect(0, 0, unit*cols, unit*rows);
  112.     for (int i=0; i < cols; i++) {
  113.       for (int j=0; j < rows; j++) {
  114.         if (mine[i][j] && dead) {
  115.           g.setColor(Color.RED);
  116.           g.fillRect(i*unit+1, j*unit+1, unit-1, unit-1);
  117.     } else if (visible[i][j]) {
  118.           if(neighbors(i,j) == 0) g.setColor(Color.GRAY);
  119.           else if(neighbors(i,j) == 1) g.setColor(Color.BLUE);
  120.           else if(neighbors(i,j) == 2) g.setColor(Color.GREEN);
  121.           else if(neighbors(i,j) == 3) g.setColor(Color.PINK);
  122.           else if(neighbors(i,j) == 4) g.setColor(Color.CYAN);
  123.           else if(neighbors(i,j) > 5) g.setColor(Color.RED);
  124.           g.drawString(Integer.toString(neighbors(i, j)), i*unit+5, (j+1)*unit-2);
  125.         }
  126.         g.setColor(Color.GRAY);
  127.         g.drawRect(i*unit+1, j*unit+1, unit-1, unit-1);
  128.       }
  129.     }
  130.   }
  131.  
  132.   // Bestem spillebrættets størrelse på skærmen
  133.   @Override
  134.   public Dimension getPreferredSize() {
  135.     return new Dimension(cols*unit+1, rows*unit+1);
  136.   }
  137.  
  138.   @Override
  139.   public Dimension getMinimumSize() {
  140.     return getPreferredSize();
  141.   }
  142. }
Advertisement
Add Comment
Please, Sign In to add comment