Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package ge;
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- import java.util.Random;
- /**
- * Write a description of class MineCanvas here.
- *
- * @author Peter Sestoft
- * @author hypesystem <[email protected]>
- * @version 1997, 2007-11-13 modified by hypesystem 14-11 2011
- */
- public class MineCanvas extends JComponent {
- //cols and rows made static, for use in Mines
- static final int cols = 25, rows = 25;
- private int unit = 15, mines = 0, cleared = 0;
- private boolean[][] mine = new boolean[cols][rows];
- private boolean[][] visible = new boolean[cols][rows];
- private boolean dead = false, painted = false;
- //replacing the constructor added mouse click to allow Mines to control mouse
- // clicks. It seems - if you expect adding the label displaying fields cleared
- // to be a piece of cake - that you haven't tried doing it. Because of the
- // structure of the program, it requires quite a lot to add this simple label.
- public void mouseClick(MouseEvent e) {
- int i = e.getX()/unit, j = e.getY()/unit;
- if (indenfor(i, j) && !dead) {
- visnul(i, j);
- //Linje unødvendig, gøres i visnul():
- // visible[i][j] = true;
- dead = mine[i][j];
- cleared = 0;
- for(boolean[] row : visible)
- for(boolean field : row)
- if(field) cleared++;
- repaint();
- }
- }
- private static final Random rnd = new Random();
- // Begynd forfra med et nyt tilfældigt minefelt
- public void nytspil() {
- for (int i=0; i < cols; i++)
- for (int j=0; j < rows; j++) {
- mine[i][j] = rnd.nextDouble() < 0.15; // Mine med 15% sandsynlighed
- if(mine[i][j]) mines++;
- visible[i][j] = false;
- }
- dead = false;
- repaint();
- }
- //gets the amount of mines in play
- public int getMines() {
- return mines;
- }
- //gets the amount of cleared fields in the game
- public int getCleared() {
- return cleared;
- }
- public boolean isPainted() {
- return painted;
- }
- // Afgør om koordinat (i,j) falder indenfor minefeltet
- private boolean indenfor(int i, int j) {
- return 0 <= i && i < cols && 0 <= j && j < rows;
- }
- // Find antal miner som er naboer til celle (i,j)
- int neighbors(int i, int j) {
- int antal = 0;
- for (int di=-1; di <= 1; di++)
- for (int dj=-1; dj <= 1; dj++)
- if (indenfor(i+di, j+dj) && (di != 0 || dj != 0) && mine[i+di][j+dj])
- antal++;
- return antal;
- }
- // Gør alle celler uden minenaboer i omegnen af (i,j) synlige
- private void visnul(int i, int j) {
- if (indenfor(i, j) && !visible[i][j]) {
- visible[i][j] = true;
- if (neighbors(i, j) == 0) {
- for (int di=-1; di <= 1; di++)
- for (int dj=-1; dj <= 1; dj++)
- if (di != 0 || dj != 0)
- visnul(i+di, j+dj);
- }
- }
- }
- // Tegn den synlige del af spillebrættet - modificeret til at være pænere
- // (tegner nu et grid) og centrerer nu faktisk tallene i firkanterne. Desuden
- // farver den tallene efter antallet af miner omkring dem.
- // drawLine er ikke særlig smart i dette tilfælde (selvom den anbefales i
- // opgaven), idet den ville kræve endnu en løkke - det er nemmere - som gjort
- // i eksemplet - blot at tilføje en drawRect (der tegner omkredsen af en
- // firkant) for hvert af felterne.
- // Læg mærke til at der er tilføjet et privat felt "mines" der tæller antallet
- // af miner genereret, samt en metode "getMines" der henter antallet af miner.
- @Override
- public void paint(Graphics g) {
- g.setColor(Color.black);
- g.drawRect(0, 0, unit*cols, unit*rows);
- for (int i=0; i < cols; i++) {
- for (int j=0; j < rows; j++) {
- if (mine[i][j] && dead) {
- g.setColor(Color.RED);
- g.fillRect(i*unit+1, j*unit+1, unit-1, unit-1);
- } else if (visible[i][j]) {
- if(neighbors(i,j) == 0) g.setColor(Color.GRAY);
- else if(neighbors(i,j) == 1) g.setColor(Color.BLUE);
- else if(neighbors(i,j) == 2) g.setColor(Color.GREEN);
- else if(neighbors(i,j) == 3) g.setColor(Color.PINK);
- else if(neighbors(i,j) == 4) g.setColor(Color.CYAN);
- else if(neighbors(i,j) > 5) g.setColor(Color.RED);
- g.drawString(Integer.toString(neighbors(i, j)), i*unit+5, (j+1)*unit-2);
- }
- g.setColor(Color.GRAY);
- g.drawRect(i*unit+1, j*unit+1, unit-1, unit-1);
- }
- }
- }
- // Bestem spillebrættets størrelse på skærmen
- @Override
- public Dimension getPreferredSize() {
- return new Dimension(cols*unit+1, rows*unit+1);
- }
- @Override
- public Dimension getMinimumSize() {
- return getPreferredSize();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment