IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: MinesJavaFX

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Unda
Člen
Avatar
Unda:29.4.2018 11:51

Zdravím snažím se použít rekurzivní metodu kterou jsem našel zde ve zdrajakovišti a aplikovat ji na můj upravený kód, ovšem mi to uskakuje a odkrývá špatně, pokud zrovna nehodí výjimku, nejspíše mam nekde špatně indexy ale nemohu to v tom najít, mohl by mi nekdo poradit kde jsem zamenil x a y prosím? :)
Zdroják níže.

 private final int pocetSloupcu = 15;
    private final int pocetRadku = 20;
    private final ImageView[][] visualniMatice = new ImageView[pocetRadku][pocetSloupcu];
    private final Image pozadi = new Image(getClass().getResourceAsStream("upraveny_pozadi.png"));
    private final Image pozadi_mina = new Image(getClass().getResourceAsStream("pozadi_mina.png"));
    private final Image vlajka = new Image(getClass().getResourceAsStream("upraveny_vlajka.png"));
    private final Image kliknuta_mina = new Image(getClass().getResourceAsStream("kliknuta_mina.png"));
    private final Image dveMiny = new Image(getClass().getResourceAsStream("upraveny_dveminy.png"));
    private final Image triMiny = new Image(getClass().getResourceAsStream("upraveny_triminy.png"));
    private final Image ctyriMiny = new Image(getClass().getResourceAsStream("upraveny_ctyriminy.png"));
    private final Image kliknuto0min = new Image(getClass().getResourceAsStream("upraveny_kliknuto0min.png"));
    private final Image jednaMina = new Image(getClass().getResourceAsStream("upraveny_jednaMina.png"));
    private final int pocetMin = 35;
    private int x;
    private int y;

private void vyplnHraciPole(GridPane grid) {
        for (int i = 0; i < pocetRadku; i++) {
            for (int j = 0; j < pocetSloupcu; j++) {
                ImageView imageView = new ImageView();
                imageView.setImage(pozadi);
                imageView.setOnMousePressed((event) -> {
                    klikSecButtonDown(event, imageView);
                    if (event.isPrimaryButtonDown()) {
                        if (imageView.getImage().equals(pozadi_mina)) {
                            imageView.setImage(kliknuta_mina);
                            prohral(grid);
                        } else {
                            zjistiSouradnice(imageView);
                            if (checkMinesAround(x, y) == 0) {
                                showFree(x, y);
                            }
                            try {
                                imageView.setImage(vratImage(checkMinesAround(x, y)));
                            } catch (Exception ex) {
                                Logger.getLogger(IPOG2_HledaniMin.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    }
                });
                visualniMatice[i][j] = imageView;
                grid.add(imageView, i, j);
            }
        }
        for (int i = 0; i < pocetMin; i++) {
            int x = generujNahodneCislo(0, pocetRadku);
            int y = generujNahodneCislo(0, pocetSloupcu);
            visualniMatice[x][y].setImage(pozadi_mina);
        }
    }

    private void zjistiSouradnice(ImageView imageView) {
        boolean konecCyklu = false;
        for (int k = 0; k < pocetRadku; k++) {
            if (konecCyklu == true) {
                break;
            }
            for (int l = 0; l < pocetSloupcu; l++) {
                if (visualniMatice[k][l].equals(imageView)) {
                    this.y = k;
                    this.x = l;
                    konecCyklu = true;
                    break;
                }
            }
        }
    }

    private void prohral(GridPane grid) {
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle("Prohrál jsi!");
        alert.showAndWait();
        vyplnHraciPole(grid);
    }

    private void klikSecButtonDown(MouseEvent event, ImageView imageView) {
        if (event.isSecondaryButtonDown()) {
            if (imageView.getImage().equals(vlajka)) {
                imageView.setImage(pozadi);
            } else {
                imageView.setImage(vlajka);
            }
        }
    }

    private int generujNahodneCislo(int min, int max) {
        return (int) (min + (Math.random()) * (max - min));
    }

    private Image vratImage(int pocet_min) throws Exception {
        switch (pocet_min) {
            case 0:
                return kliknuto0min;
            case 1:
                return jednaMina;
            case 2:
                return dveMiny;
            case 3:
                return triMiny;
            default:
                return ctyriMiny;
        }
    }

    public static void main(String[] args) {
        launch(args);
    }

    private int checkMinesAround(int x, int y) {
        int count = 0;
        for (int i = -1; i < 1; i++) {
            for (int j = -1; j < 1; j++) {
                if (((x + i) < 0) || (x + i) >= visualniMatice[0].length || ((y + j >= visualniMatice[1].length)) || ((x + i) == x && (y + j == y))) {
                    continue;
                }

                if (visualniMatice[x + i][y + j].getImage().equals(pozadi_mina)) {
                    count++;
                }
            }
        }
        return count;
    }

    private void showFree(int x, int y) {
        for (int i = -1; i <= 1; i++) {
            for (int j = -1; j <= 1; j++) {
                if (((x + i < 0) || (x + i >= visualniMatice[0].length)) || ((y + j < 0) || (y + j >= visualniMatice[1].length)) || ((x + i == x) && (y + j == y))) {
                    continue;
                }

                if ((this.checkMinesAround(x + i, y + j) == 0)) {
                    this.visualniMatice[x + i][y + j].setImage(kliknuto0min);
                    this.showFree(x + i, y + j);
                }
            }
        }
    }
 
Odpovědět
29.4.2018 11:51
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.