Advertisement
Guest User

Minesweeper.java

a guest
Jan 27th, 2011
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.75 KB | None | 0 0
  1. package Fenster;
  2.  
  3. import Spiel.Feld;
  4. import Spiel.Feld.FeldStatus;
  5.  
  6. import java.util.List;
  7. import java.util.ArrayList;
  8. import java.awt.BorderLayout;
  9. import java.awt.Dimension;
  10. import java.awt.FlowLayout;
  11. import java.awt.GridLayout;
  12. import java.awt.Toolkit;
  13. import java.awt.Point;
  14. import java.awt.event.ActionEvent;
  15. import java.awt.event.ActionListener;
  16. import java.awt.event.MouseEvent;
  17. import java.awt.event.MouseListener;
  18. import java.util.Timer;
  19. import java.util.TimerTask;
  20. import javax.swing.ImageIcon;
  21. import javax.swing.JFrame;
  22. import javax.swing.JLabel;
  23. import javax.swing.JMenu;
  24. import javax.swing.JMenuBar;
  25. import javax.swing.JMenuItem;
  26. import javax.swing.JPanel;
  27.  
  28. /**
  29.  *
  30.  * @author DoHate -> Florian Schneider
  31.  */
  32. class Minesweeper extends JFrame {
  33.  
  34.     // <editor-fold defaultstate="collapsed" desc="Definiere Globale Variablen">
  35.     //Spiel Parameter & Objekte
  36.     private boolean spielende = false;
  37.     private int schwierigkeitsgrad = 10, minenAnzeige = 10, minenAnzahl = 10;
  38.     private Feld[][] spielFeld = new Feld[10][10]; //Groeße statisch oder dynamisch angeben?
  39.     private List<Point> pruefListe = new ArrayList<Point>(); //Fuer Aufdeck-Algorithmus
  40.     private List<Point> entschaerft = new ArrayList<Point>(); //Liste fuer entschaerfte Felder
  41.     private Feld currentFeld; //Tmp halter fuer gerade geklicktes Feld
  42.     //Importiere Icons
  43.     private ImageIcon bildMinen = new ImageIcon(Minesweeper.class.getResource("/IconBilder/bildMinen.png"));
  44.     private ImageIcon bildZeit = new ImageIcon(Minesweeper.class.getResource("/IconBilder/bildZeit.png"));
  45.     //Timer Objekte
  46.     private Timer timer = new Timer();
  47.     private TimerTask task = new TimerTask() {
  48.         public void run() {
  49.             if (!spielende) {
  50.                 if (sec == 60) {
  51.                     sec = 0;
  52.                     min++;
  53.                 }
  54.                 if (min > 9 && sec > 9) {
  55.                     labelZeit.setText(min + ":" + sec);
  56.                 } else {
  57.                     if (min > 9) {
  58.                         labelZeit.setText(min + ":0" + sec);
  59.                     } else if (sec > 9) {
  60.                         labelZeit.setText("0" + min + ":" + sec);
  61.                     } else {
  62.                         labelZeit.setText("0" + min + ":0" + sec);
  63.                     }
  64.                 }
  65.                 sec++;
  66.             } else {
  67.                 labelZeit.setText("0" + min + ":0" + sec);
  68.             }
  69.         }
  70.     };
  71.     private int min = 0, sec = 0;
  72.     //Fenster Objekte
  73.     private JPanel panelCenter = new JPanel();
  74.     private JPanel panelSouth = new JPanel();
  75.     private JLabel labZeit = new JLabel(bildZeit, JLabel.CENTER);
  76.     private JLabel labMinen = new JLabel(bildMinen, JLabel.CENTER);
  77.     private JLabel labelZeit = new JLabel();
  78.     private JLabel labelMinen = new JLabel();
  79.     //Menuleiste
  80.     private JMenuBar menuBar = new JMenuBar();
  81.     //Datei
  82.     private JMenu menu = new JMenu("Datei");
  83.     private JMenuItem neu = new JMenuItem("Neues Spiel");
  84.     //Siehe weiter unten
  85.     //private JMenuItem einfach = new JMenuItem("Einfach");
  86.     //private JMenuItem mittel = new JMenuItem("Mittel");
  87.     //private JMenuItem schwer = new JMenuItem("Schwer");
  88.     private JMenuItem beenden = new JMenuItem("Beenden");
  89.     //?
  90.     private JMenu impressum = new JMenu("?");
  91.     private JMenuItem hilfe = new JMenuItem("Hilfe");
  92.     private JMenuItem info = new JMenuItem("Info");
  93.     //EventListener
  94.     private pruefListener feldAktion = new pruefListener();
  95.  
  96.     //Siehe unten!
  97.     //AchtonListenerSchwierigkeitsgrad allGrade=new AchtonListenerSchwierigkeitsgrad();    
  98.     //</editor-fold>
  99.  
  100.     //Konstruktor
  101.     public Minesweeper() {
  102.         super("Minesweeper");
  103.         this.setIconImage(bildMinen.getImage());
  104.  
  105.         initFelder();
  106.         initFenster();
  107.  
  108.         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  109.         Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
  110.         this.setLocation(dim.width / 2 - this.getWidth() / 2, dim.height / 2 - this.getHeight() / 2);
  111.         this.setVisible(true); //Das koennte auch in die main, wenn es nicht direkt sichtbar sein soll
  112.     }
  113.  
  114.     //Allgemeiner Einstiegspunkt!
  115.     public static void main(String[] args) {
  116.         Minesweeper ms = new Minesweeper();
  117.     }
  118.  
  119.     //Initialisiere HauptFenster
  120.     private void initFenster() {
  121.         this.setSize(440, 460);
  122.         this.setResizable(false);
  123.         this.setLayout(new BorderLayout());
  124.  
  125.         menuBar.add(menu);
  126.         menu.add(neu);
  127.         menu.addSeparator();
  128.         //Schwierigkeitsgrad vielleicht anders festlegen?
  129.         //menu.add(einfach);
  130.         //menu.add(mittel);
  131.         //menu.add(schwer);
  132.         menu.addSeparator();
  133.         menu.add(beenden);
  134.         menuBar.add(impressum);
  135.         impressum.add(hilfe);
  136.         impressum.add(info);
  137.  
  138.         panelSouth.setLayout(new FlowLayout());
  139.         panelSouth.add(labZeit);
  140.         panelSouth.add(labelZeit);
  141.         panelSouth.add(labMinen);
  142.         panelSouth.add(labelMinen);
  143.        
  144.         neu.addActionListener(new ActionListener(){
  145.             @Override
  146.             public void actionPerformed(ActionEvent e){
  147.                 neuesSpiel();
  148.             }
  149.         });
  150.         //Siehe unten
  151.         //einfach.addActionListener(allGrade);
  152.         //mittel.addActionListener(allGrade);
  153.         //schwer.addActionListener(allGrade);
  154.         beenden.addActionListener(new ActionListener(){
  155.             @Override
  156.             public void actionPerformed(ActionEvent e){
  157.                 System.exit(0);
  158.             }
  159.         });
  160.        
  161.         this.add(menuBar, BorderLayout.NORTH);
  162.         this.add(panelCenter, BorderLayout.CENTER);
  163.         this.add(panelSouth, BorderLayout.SOUTH);
  164.  
  165.         //Diese Aktion ist schon in spielFeldErzeugen
  166.         //panelCenter.setLayout(new GridLayout(schwierigkeitsgrad, schwierigkeitsgrad));
  167.        
  168.         timer.scheduleAtFixedRate(task, 0, 1000);
  169.         this.spielFeldErzeugen();
  170.     }
  171.  
  172.     /*spaeter
  173.     public void guiInfo() {
  174.  
  175.     }
  176.  
  177.     public void guiHilfe() {
  178.  
  179.     }
  180.      *
  181.      */
  182.  
  183.     //Initialisiere Felder
  184.     private void initFelder(){
  185.         for(int i = 0; i < spielFeld.length; i++){
  186.             for(int j = 0; j < spielFeld[0].length; j++){
  187.                 spielFeld[i][j] = new Feld(i, j);
  188.                 spielFeld[i][j].addMouseListener(feldAktion);
  189.             }
  190.         }
  191.     }
  192.  
  193.     private void spielFeldErzeugen() {
  194.         minenLegen();
  195.         panelCenter.removeAll();
  196.         panelCenter.setLayout(new GridLayout(schwierigkeitsgrad, schwierigkeitsgrad));
  197.         for (int i = 0; i < schwierigkeitsgrad; i++) {
  198.             for (int j = 0; j < schwierigkeitsgrad; j++) {
  199.                 spielFeld[i][j].setMinenAußenrum(this.wievielMinenUmDasFeld(i, j));
  200.                 panelCenter.add(spielFeld[i][j]);
  201.             }
  202.         }
  203.         this.repaint();
  204.     }
  205.  
  206.     //Lege Minen auf das Spielfeld
  207.     private void minenLegen() {
  208.         List<Point> tmpList = new ArrayList<Point>();
  209.         for (int i = 0; i < schwierigkeitsgrad * (schwierigkeitsgrad / 10); i++) {
  210.             int randomX, randomY;
  211.             do {
  212.                 randomX = (int) (Math.random() * schwierigkeitsgrad);
  213.                 randomY = (int) (Math.random() * schwierigkeitsgrad);
  214.             } while (tmpList.contains(new Point(randomX, randomY)));
  215.             tmpList.add(new Point(randomX, randomY));
  216.         }
  217.         labelMinen.setText("" + schwierigkeitsgrad * (schwierigkeitsgrad / 10) + "");
  218.         minenAnzeige = schwierigkeitsgrad * (schwierigkeitsgrad / 10);
  219.         minenAnzahl = minenAnzeige;
  220.  
  221.         for(Point p : tmpList){
  222.             spielFeld[p.x][p.y].setMine();
  223.         }
  224.     }
  225.  
  226.     private void neuesSpiel() {
  227.         spielende = false;
  228.         min = 0;
  229.         sec = 0;
  230.         for (int i = 0; i < spielFeld.length; i++) {
  231.             for (int j = 0; j < spielFeld[0].length; j++) {
  232.                 spielFeld[i][j].reset();
  233.             }
  234.         }
  235.         this.spielFeldErzeugen();
  236.     }
  237.  
  238.     //Diese Methode ist verdammt Elegant. Richtig Respekt hierfuer!!!!!!
  239.     private int wievielMinenUmDasFeld(int x, int y) {
  240.         int anzahlMinen=0;
  241.         for (int i = -1; i < 2; i++) {
  242.             for (int j = -1; j < 2; j++) {
  243.                 if (!outOfBound(x+i, y+j)) {
  244.                     if (spielFeld[x + i][y + j].isMine()) {
  245.                         anzahlMinen++;
  246.                     }
  247.                 }
  248.             }
  249.         }
  250.         return anzahlMinen;
  251.     }
  252.  
  253.     //Feld entschaerfen
  254.     public void entschaerfung() {
  255.         if(currentFeld.getStatus() == FeldStatus.ZU){
  256.             if(!entschaerft.contains(currentFeld.getPointer())){
  257.                 boolean result = currentFeld.feldEntschaerfen();
  258.                 if(result){
  259.                     if(currentFeld.isMine()){
  260.                         minenAnzahl--;
  261.                     }
  262.                     minenAnzeige--;
  263.                     entschaerft.add(currentFeld.getPointer());
  264.                     labelMinen.setText(""+minenAnzeige+"");
  265.                 }
  266.                 if(minenAnzahl == 0){
  267.                     //Spiel Beendet!
  268.                 }
  269.             }else{
  270.                 boolean result = currentFeld.feldEntschaerfen();
  271.                 if(!result){
  272.                     if(currentFeld.isMine()){
  273.                         minenAnzahl++;
  274.                     }
  275.                     minenAnzeige++;
  276.                     entschaerft.remove(currentFeld.getPointer());
  277.                     labelMinen.setText(""+minenAnzeige+"");
  278.                 }
  279.             }
  280.         }
  281.     }
  282.  
  283.     //Feld Aufdecken
  284.     public void aufdecken(){
  285.         FeldStatus status = currentFeld.aufdecken();
  286.         switch(status){
  287.             case OFFEN://Hier eigentlich minenAnzeige hochzählen, da eventuell schon entschaerft gewesen
  288.                 break;//Mache nichts
  289.             case LEER:
  290.                 leerAufdecken(currentFeld.getPointer());
  291.                 break;
  292.             case ZU:
  293.                 //Mine erwischt
  294.         }
  295.     }
  296.  
  297.     //Leere Felder außenrum aufdecken // Defekt
  298.     //Bei 10x10 feld gehts! Sobald 2-stelliger index, gehts nichtmehr
  299.     //Rechte und untere seite wird falsch aufgedeckt!
  300.     private void leerAufdecken(Point point){
  301.         Point tmp = null;
  302.         //<editor-fold defaultstate="collapsed" desc="Von dir Geklaut :P">
  303.         for (int i = -1; i < 2; i++) {
  304.             for (int j = -1; j < 2; j++) {
  305.                 tmp = new Point(point.x+i, point.y+j);
  306.                 if (!outOfBound(tmp) && !pruefListe.contains(tmp)) {
  307.                     pruefListe.add(tmp);
  308.                 }
  309.             }
  310.         }
  311.         //</editor-fold>
  312.         for(Point p : pruefListe){
  313.             if(spielFeld[p.x][p.y].aufdecken() == FeldStatus.LEER){//Hier eigentlich minenAnzeige hochzählen, da eventuell schon entschaerft gewesen
  314.                 leerAufdecken(p);
  315.                 break;
  316.             }
  317.         }
  318.         pruefListe.clear();
  319.     }
  320.     /*
  321.     //Leere Felder aufdecken 2 Version
  322.     private void leerAufdecken(Point point){
  323.         Point[] pruefFelder = new Point[9];
  324.         Point tmp = null;
  325.         int count = 0;
  326.  
  327.         for (int i = -1; i < 2; i++) {
  328.             for (int j = -1; j < 2; j++) {
  329.                 tmp = new Point(point.x+i, point.y+j);
  330.                 if (!outOfBound(tmp)) {
  331.                     pruefFelder[count++] = tmp;
  332.                 }
  333.             }
  334.         }
  335.  
  336.         for(int i = 0; i < pruefFelder.length; i++){
  337.             if(pruefFelder[i] != null && spielFeld[pruefFelder[i].x][pruefFelder[i].y].aufdecken() == FeldStatus.LEER){//Hier eigentlich minenAnzeige hochzählen, da eventuell schon entschaerft gewesen
  338.                 leerAufdecken(pruefFelder[i]);
  339.                 //break;
  340.             }
  341.         }
  342.     }
  343.      *
  344.      */
  345.  
  346.     //Pruefe ob point OutOfBound
  347.     private boolean outOfBound(int x, int y){
  348.         if(x >= 0 && y >= 0 && x < spielFeld.length && y < spielFeld[0].length){
  349.             return false;
  350.         }else{
  351.             return true;
  352.         }
  353.     }
  354.     private boolean outOfBound(Point p){
  355.         return outOfBound(p.x, p.y);
  356.     }
  357.  
  358.  
  359.     //Listener Klasse fuer Felder
  360.     class pruefListener implements MouseListener {
  361.         public void mouseClicked(MouseEvent e) {
  362.             Feld feld = (Feld)e.getSource();
  363.             currentFeld = feld;
  364.             if(e.getButton() == 3){ //Wenn Rechtsklick
  365.                 entschaerfung();
  366.             }else if(e.getButton() == 1){ //Wenn Linksklick
  367.                 aufdecken();
  368.             }
  369.         }
  370.  
  371.         public void mousePressed(MouseEvent e) {}
  372.         public void mouseReleased(MouseEvent e) {}
  373.         public void mouseEntered(MouseEvent e) {}
  374.         public void mouseExited(MouseEvent e) {}
  375.     }
  376. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement