Minesweeper Interaktivität

TPKey

Mitglied
Hi ich habe ein kleines Problem bei der Verbindung zwischen meiner Minesweeper Gui und Minesweeper Logik
Java:
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()+" ");
               
                }
            }
        }
   
        public void linksKlick(int x, int y){
           
            if(x>=0 && y>=0 && x< breite && y<laenge){
                if(EndeSF[x][y].offen == false) {
                    EndeSF[x][y].offen = true;
               
                    if(EndeSF[x][y].getMine()){
                       
                        System.out.println("Verloren");// in neue Methode ausgliedern
                    }
               
                else{
                    if(EndeSF[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);
                    }
                }
                }
            }
        }
       
        public int zaehleminen(){
   
        int a =0;
   
        for(int x =0; x<breite; x++){
            for(int y = 0; y<laenge; y++){
                if(EndeSF[x][y].getMine()){
                    a++;
                }
            }
        }
        return a;
        }
   
        public Feld[][] getState(){
            return EndeSF;
        }
    }


Java:
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.layout.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.event.*;
import javafx.scene.input.KeyEvent;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.paint.Paint;
import javafx.scene.paint.Color;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import java.io.FileInputStream;



public class Msgui extends Application{
   
    Spielfeld sf;
   
    public void start(Stage stage){       
        stage.setTitle("Minesweeper 1.0");
        BorderPane root = new BorderPane();   
        HBox oben = new HBox();
        GridPane spiel = createSpiel();               
        MenuBar menuBar = createMenu();
        MenuBar menuBar1 = createMenu1();
        oben.getChildren().addAll(menuBar,menuBar1);
        root.setTop(oben);
        root.setCenter(spiel);
        Scene scene = new Scene(root);
       
        root.setStyle("-fx-background-color: #00008B;");
       
        stage.setScene(scene);
        stage.show();
       
       
       
    }
    public static void main(String[] a){
        launch(a);
    }
   
    GridPane createSpiel(){
        sf = new Spielfeld(15, 15, 35);
        GridPane spiel = new GridPane();
        for(int i=0; i < 15; i++){
            for(int j=0; j < 15; j++){
                Button t = new Button();
               
                t.setStyle("-fx-background-color: #6B6B6B; -fx-border-width: 1px; -fx-border-color: #1A1A1A;");
               
                //int val = sf.get(h1,h2);
               
               
                t.setPrefSize(25, 25);
               
           
               
                t.setOnAction(new EventHandler<ActionEvent>() {

                   
                    public void handle(ActionEvent e) {
                   
                        sf.linksKlick(i, j);
                       
                        update();
                       
                    }
                });
               
                spiel.add(t,i,j);
            }
        }
        return spiel;
    }
   
   
   
    MenuBar  createMenu(){
        MenuBar menuBar = new MenuBar();
        Menu menu = new Menu("Datei");
        MenuItem newItem = new MenuItem("Neu");
        MenuItem quitItem = new MenuItem("Beenden");
       
        menu.setStyle("-fx-selection-bar: #FFA500;");
       
        quitItem.setOnAction(new EventHandler<ActionEvent>(){
            public void handle(ActionEvent e){
                System.exit(1);
            }
        });
       
        menu.getItems().addAll(newItem,quitItem);
        menuBar.getMenus().addAll(menu);   
        return menuBar;
    }
   
    MenuBar createMenu1() {
        MenuBar menuBar1 = new MenuBar();
        Menu menu = new Menu ("Schwierigkeit");
        MenuItem leicht = new MenuItem ("Leicht");
        MenuItem mittel = new MenuItem ("Mittel");
        MenuItem schwer = new MenuItem ("Schwer");
   
       
        menu.setStyle("-fx-selection-bar: #FFA500;");
       
       
       
       
        menu.getItems().addAll(leicht, mittel, schwer);
        menuBar1.getMenus().addAll(menu);
        return menuBar1;
    }
   
    void update(){
        /*    t.setStyle("-fx-background-color: #C1CDCD; -fx-border-width: 1px; -fx-border-color: #FFFFFF;");*/

        Feld[][] state = sf.getState();
   
    }
   
   
}

bei dem compilen beider Codes kommt folgender Fehler
Code:
Msgui.java:68: error: local variables referenced from an inner class must be final or effectively final
                                                sf.linksKlick(i, j);
                                                              ^
Msgui.java:68: error: local variables referenced from an inner class must be final or effectively final
                                                sf.linksKlick(i, j);
Wie ist dies zu lösen?
 

truesoul

Top Contributor
Hi.

Vor dieser Zeile
Code:
t.setOnAction
erzeugst du z. B final index = i; und verwendest die Variable index. bei linksKlick.

Und mit j machst du das auch.


Grüße
 

Ähnliche Java Themen


Oben