Hi ich habe ein kleines Problem bei der Verbindung zwischen meiner Minesweeper Gui und Minesweeper Logik
bei dem compilen beider Codes kommt folgender Fehler
Wie ist dies zu lösen?
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);