# Minesweeper



## TPKey (13. Dez 2017)

Hallo,

ich möchte nun in meiner Klasse Spielfeld eine linksKlick Methode implementieren, welches das Anklicken eines Feldes darstellt. Dabei soll das angeklickte Feld und evtl. benachbarte Felder offengelegt werden.

Nun stellt sich mir eine grobe Frage.

Wie implementiere ich dies?

```
class Feld{
  
    boolean istMine;
    boolean offen;
    int anzahl;
  
    /*
    Zeichen:
  
    istMine = x
  
        */
    public void Feld(){
        offen = false;
        istMine = false;
        anzahl = 0;
    }
    public boolean getMine(){
        return istMine;
    }
    public void setMine(){
        istMine=true;
    }
    public void setNachbar(){
        anzahl++;
    }
    public String printFeld(){
        if(istMine==true){
            return("X");
      
        }
        else{
            return Integer.toString(anzahl);
        }
    }
  

}
```


```
import java.util.Random;
class Spielfeld{
      
        int laenge; //y hoehe
        int breite; //x breite
        int anzahl;
      
        Feld[][] EndeSF ;
      
        Spielfeld(int l, int b, int a){
            //Feldererstellung
            laenge = l;
            breite = b;
            anzahl = a;
            Feld[][] spfe = new Feld[breite][laenge];
            for(int h1=0;h1<laenge;h1++){
                for(int h2=0; h2<breite;h2++){
                    spfe[h2][h1] = new Feld();
                }
            }
            //Minenverteilung
            Random rand = new Random();
            for(int h1=0; h1<anzahl;h1++){
                int rb =rand.nextInt(breite);
                int rl = rand.nextInt(laenge);
                if(spfe[rb][rl].istMine==false){
                    spfe[rb][rl].setMine();
                    //linker Rand
                    if(rb!=0){
                        if(rl!=0){
                            spfe[rb-1][rl-1].setNachbar();
                          
                        }
                        if(rl!=laenge-1){
                            spfe[rb-1][rl+1].setNachbar();
                        }
                        spfe[rb-1][rl].setNachbar();
                    }
                    //rechter Rand
                    if(rb!=breite-1){
                        if(rl!=0){
                            spfe[rb+1][rl-1].setNachbar();
                        }
                        if(rl!=laenge-1){
                            spfe[rb+1][rl+1].setNachbar();
                          
                        }
                        spfe[rb+1][rl].setNachbar();
                    }
                    //oben und unten
                    if(rl!=0){
                        spfe[rb][rl-1].setNachbar();
                    }
                    if(rl!=laenge-1){
                        spfe[rb][rl+1].setNachbar();
                    }
                }
                else {
                    h1--;
                }
            }
            EndeSF=spfe;
        }
        public void printSPFE(){
            for(int h1=0;h1<laenge;h1++){
                System.out.print("\n");
                for(int h2=0; h2<breite;h2++){
                    System.out.print(EndeSF[h2][h1].printFeld()+" ");
              
                }
            }
        }  

    }
```


----------



## thet1983 (13. Dez 2017)

mit einem MouseListener?? 
SWING
JAVAFX


----------



## HarleyDavidson (13. Dez 2017)

Gerade für Minesweeper würde sich auch ein Spielfeld aus JButtons / JToggleButtons wunderbar eignen.
Das ganze in ein Panel mit einem GridLayout gepackt und fertig ist das Spielfeld.


----------



## TPKey (13. Dez 2017)

Und wie könnte man dies realisieren?


----------



## SchwarzWeiß (13. Dez 2017)

Hast du schon mal mit einer Grafikbibliothek (Swing, JavaFX) gearbeitet?


----------



## TPKey (13. Dez 2017)

Nein, wäre das erste mal.


----------



## HarleyDavidson (14. Dez 2017)

Mal ein ganz einfaches und schnelles Beispiel für ein Spielfeld 10x10:

```
public static void main( String args[] ) throws Exception
    {
        JFrame frame = new JFrame( "MinesweeperTest" );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
        //Feld 10x10
        frame.setLayout( new GridLayout( 10, 10 ) );

        //Buttons setzen
        for ( int x = 0; x < 10; x++ )
        {
            for ( int y = 0; y < 10; y++ )
            {
                JButton button = new JButton();
                //Größe Buttons
                button.setPreferredSize(new Dimension(20, 20) );
                frame.add( button );
            }
        }
        //Größe anpassen
        frame.pack();
        //Position zentral auf dem Bildschirm
        frame.setLocationRelativeTo( null);
        frame.setVisible( true );
    }
```

Jetzt könnte man die Klasse JButton erweitern und ihm seine Koordinaten mitgeben, ob unter ihm eine Mine versteckt ist und und und ...
Generell wie auch schon SchwarzWeiß geschrieben hat:


SchwarzWeiß hat gesagt.:


> Hast du schon mal mit einer Grafikbibliothek (Swing, JavaFX) gearbeitet?


solltest du dich vorher ein bisschen mit den Grafikbibliotheken beschäftigen. Wobei bei Minesweeper nicht viel zu tun und das eigentlich ein schönes Einstiegsprojekt dafür ist.


----------

