Minesweeper Logik

alapychak07

Mitglied
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?
Java:
class Feld{
   
    boolean istMine;//Eigenschaft
    boolean istgeoeffnet;
    int anzahlMine;
 
    Feld(){
        istMine = false; //konstruktur
        istgeoeffnet = false;
        anzahlMine = 0;
    }
 
    void setMine(){
        istMine= true; //Methode
    }
 
     boolean getMine(){
        return istMine;
    }
 
    void setgeoeffnet(){
        istgeoeffnet = true;
    }
    boolean getgeoeffnet(){
        return istgeoeffnet;
    }
 
    void setanzahl(int a){
        anzahlMine = a;
    }
 
    int getanzahl(int a){
        return anzahlMine;
    }
       
}






class Spielfeld{
    int h;
    int b;
    int am;
    Feld[][]s;
 
    Spielfeld(int h, int b, int am){
        this.h = h;
        this.b = b;
        this.am= am;
   
        s = new Feld[h][B];
    
        for(int i=0; i<h;i++){
            for(int j=0; j<b;j++){
                s[I][j] = new Feld();
            }
        }
        setMine();
        setanzahl();
    }
    public void setMine(){
        boolean anzahlMine = true;
        int counter = 0;
        if(am<=0){
            anzahlMine = false;
        }
        while(anzahlMine){
            int h = (int)(Math.random()*h);
            int b = (int)(Math.random()*b);
            if(!s[h][B].getMine()){
                s[h][B].setMine();
                counter++;
            }
            if(counter == am){
                anzahlMine = false;
            }
        }
    }
 
 
    public void setanzahl(){
        for(int x = 0; x<s.length;x++){
            for(int y=0;y<s[0].length;y++){
                if(!s[x][y].getMine()){
                    int nachbar = 0;
                    if(x<s.length-1 && y>0 && s[x-1][y].getMine()){ // rechts
                        nachbar++;
                    }
                    if(x>0 && s[x-1][y].getMine()){// links
                        nachbar++;
                    }
                    if(x<s.length-1 && y>0 && s[x+1][y-1].getMine()){//hoch rechts
                        nachbar++;
                    
                    }
                    if(x>0 && y>0 && s[x-1][y-1].getMine()){ //hoch links
                        nachbar++;
                    }
                    if(y>0 && s[x][y-1].getMine()){ //hoch
                        nachbar++;
                    }
                
                    if(y<s[0].length-1 && s[x][y+1].getMine()){// unten
                        nachbar++;
                    }
                    if(x<s.length-1 && y<s[0].length-1 && s[x+1][y+1].getMine()){ // unten rechts
                        nachbar++;
                    }
                    if(x>0 && y<s[0].length-1 && s[x+1][y+1].getMine()){ // unten links
                        nachbar++;
                    }
                
                
                
                    s[x][y].setanzahl(nachbar);
                }
            }
        }
    }
    public void print(){
        for(int i=0; i<h; i++){
            System.out.print(" ");
            for(int j=0; j<b; j++){
                if(s[I][j].getMine()){
                    System.out.print(" * ");
                }else{
                    System.out.print(" "+s[I][j].getanzahl()+" ");
                }
            }
        }
    }
}


class Main{

    public static void main(String[] args) {
        Spielfeld a = new Spielfeld(5,5,10);//konstruktur
        a.print();
    
    }
}
 
Zuletzt bearbeitet:
Java:
 public void linksKlick(int x, int y){

         

            if(x>=0 && y>=0 && x< breite && y<hohe){

                if(s[x][y].offen == false) {

                    s[x][y].offen = true;

             

                    if(s[x][y].getMine()){

                     

                        System.out.println("Verloren");

                    }

             

                else{

                    if(s[x][y].anzahl == 0){

                        linksKlick(x +1, y);

                        linksKlick(x +1, y +1);

                        linksKlick(x , y +1);

                        linksKlick(x -1, y +1);

                        linksKlick(x -1, y +1);

                        linksKlick(x -1, y -1);

                        linksKlick(x , y -1);

                        linksKlick(x +1, y -1);

                    }

                }
}
}
}
 
Java:
class Spielfeld{
    int h;
    int b;
    int am;
    Feld[][]s;
    ...
Wenn man den Code leserlich gestaltet, kann man es wesentlich besser durchgehen und auf Richtigkeit überprüfen.
Java:
if(x<s.length-1 && y>0 && s[x-1][y].getMine()){ // rechts
                        nachbar++;
                    }
                    if(x>0 && s[x-1][y].getMine()){// links
                        nachbar++;
                    }
                    if(x<s.length-1 && y>0 && s[x+1][y-1].getMine()){//hoch rechts
                        nachbar++;
                   
                    }
                    if(x>0 && y>0 && s[x-1][y-1].getMine()){ //hoch links
                        nachbar++;
                    }
                    if(y>0 && s[x][y-1].getMine()){ //hoch
                        nachbar++;
                    }
               
                    if(y<s[0].length-1 && s[x][y+1].getMine()){// unten
                        nachbar++;
                    }
                    if(x<s.length-1 && y<s[0].length-1 && s[x+1][y+1].getMine()){ // unten rechts
                        nachbar++;
                    }
                    if(x>0 && y<s[0].length-1 && s[x+1][y+1].getMine()){ // unten links
                        nachbar++;
                    }
Ehrlich, ist das für ein anderen leicht leserlich und verständlich?
 
Java:
class Spielfeld{
    int h;
    int b;
    int am;
    Feld[][]s;
    ...
Wenn man den Code leserlich gestaltet, kann man es wesentlich besser durchgehen und auf Richtigkeit überprüfen.
Java:
if(x<s.length-1 && y>0 && s[x-1][y].getMine()){ // rechts
                        nachbar++;
                    }
                    if(x>0 && s[x-1][y].getMine()){// links
                        nachbar++;
                    }
                    if(x<s.length-1 && y>0 && s[x+1][y-1].getMine()){//hoch rechts
                        nachbar++;
                  
                    }
                    if(x>0 && y>0 && s[x-1][y-1].getMine()){ //hoch links
                        nachbar++;
                    }
                    if(y>0 && s[x][y-1].getMine()){ //hoch
                        nachbar++;
                    }
              
                    if(y<s[0].length-1 && s[x][y+1].getMine()){// unten
                        nachbar++;
                    }
                    if(x<s.length-1 && y<s[0].length-1 && s[x+1][y+1].getMine()){ // unten rechts
                        nachbar++;
                    }
                    if(x>0 && y<s[0].length-1 && s[x+1][y+1].getMine()){ // unten links
                        nachbar++;
                    }
Ehrlich, ist das für ein anderen leicht leserlich und verständlich?

Code:
class Feld{
       
    boolean istMine;//Eigenschaft
    boolean istgeoeffnet;
    int anzahlMine;
   
    Feld(){
        istMine = false; //konstruktur
        istgeoeffnet = false;
        anzahlMine = 0;
    }
   
    void setMine(){
        istMine= true; //Methode
    }
   
    boolean getMine(){
        return istMine;
    }
   
    void setgeoeffnet(){
        istgeoeffnet = true;
    }
    boolean getgeoeffnet(){
        return istgeoeffnet;
    }
   
    void setanzahl(int a){
        anzahlMine = a;
    }
   
    int getanzahl(){
        return anzahlMine;
    }
           
}





/*
class Spielfeld{
    int h;
    int b;
    int am;
    Feld[][]s;
   
    Spielfeld(int h, int b, int am){
        this.h = h;
        this.b = b;
        this.am = am;
       
        s = new Feld[h][b];
       
        for(int i=0; i<h;i++){
            for(int j=0; j<b;j++){
                s[i][j] = new Feld();
            }
        }
        setMine();
        setanzahl();
    }
    public void setMine(){
        boolean anzahlMine = true;
        int counter = 0;
        if(am<=0){
            anzahlMine = false;
        }
        while(anzahlMine){
            int h = (int)(Math.random()*this.h);
            int b = (int)(Math.random()*this.b);   
            if(!s[h][b].getMine()){
                s[h][b].setMine();
                counter++;
            }
            if(counter == am){
                anzahlMine = false;
            }
        }
    }
   
   
    public void setanzahl(){
        for(int x = 0; x<s.length;x++){
            for(int y=0;y<s[0].length;y++){
                if(!s[x][y].getMine()){
                    int nachbar = 0;
                    if(x>0 && y>0 && s[x-1][y-1].getMine()){ //hoch links
                        nachbar++;
                    }
                    if(x>0 && y<s[0].length-1 && s[x-1][y+1].getMine()){ // unten links
                        nachbar++;
                    }
                    if(x>0 && s[x-1][y].getMine()){// links
                        nachbar++;
                    }
                    if(x<s.length-1 && y>0 && s[x+1][y-1].getMine()){//hoch rechts
                        nachbar++;
                       
                    }
                    if(x<s.length-1 && y<s[0].length-1 && s[x+1][y+1].getMine()){ // unten rechts
                        nachbar++;
                    }
                    if(x<s.length-1 && s[x+1][y].getMine()){ // rechts
                        nachbar++;
                    }
                   
                    if(y>0 && s[x][y-1].getMine()){ //hoch
                        nachbar++;
                    }
                   
                    if(y<s[0].length-1 && s[x][y+1].getMine()){// unten
                        nachbar++;
                    }
                   
                   
                   
                   
                    s[x][y].setanzahl(nachbar);
                }
            }
        }
    }
    public void print(){
        for(int i=0; i<h; i++){
            System.out.print(" ");
            for(int j=0; j<b; j++){
                if(s[i][j].getMine()){
                    System.out.print(" * ");
                }else{
                    System.out.print(" "+s[i][j].getanzahl()+" ");
                }
            }
        }
    }
}
*/
/*
class Main{

    public static void main(String[] args) { 
        Spielfeld a = new Spielfeld(5,5,10);//konstruktur 
        a.print();
       
    }
}
*/
 

Zurück
Oben