Minesweeper

N

Nyk

Gast
Hallo, hier mein Code:

Code:
import java.util.ArrayList;
import java.util.Collection;


public class Board {
    
    private Collection<Field> felder = new ArrayList<Field>();
   
    private Field[][] spielfeld;
    private int mineCount;
    private int width;
    private int height;
    private int flagCount;
    public Board(int width, int height, Collection<Coordinate> mines) {
        this.spielfeld = new Field[width][height];
        this.mineCount = mines.size();
        this.width = width;
        this.height = height;
        // Felder initialisieren...
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                spielfeld[x][y] = new Field(new Coordinate(x, y));
            }
        }
        // Spielfeld mit Minen versehen
        for (Coordinate c : mines) {
            spielfeld[c.getX()][c.getY()].setHasMine(true);
        }
        // NeighboursMineCount setzen
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                spielfeld[x][y].setNeighbourMineCount(checkNeighbours(x, y));
            }
        }
    }
    public boolean hasWon() {
        if (getRemainingMines() == 0) {
            return true;
        }
        return false;
    }
    public void flagMine(Coordinate coord) {
        if (!spielfeld[coord.getX()][coord.getY()].isOpened()) {
            if (spielfeld[coord.getX()][coord.getY()].hasFlag()) {
                spielfeld[coord.getX()][coord.getY()].setHasFlag(false);
            } else {
                spielfeld[coord.getX()][coord.getY()].setHasFlag(true);
            }
        }
    }
    public int getRemainingMines() {
        flagCount = 0;
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                if (spielfeld[x][y].hasFlag()) {
                    flagCount++;
                }
            }
        }
        return mineCount - flagCount;
    }
    public Collection<Field> getMines() {
        Collection<Field> mines = new ArrayList<Field>();
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                if (spielfeld[x][y].hasMine()) {
                    mines.add(spielfeld[x][y]);
                }
            }
        }
        return mines;
    }
    public Collection<Field> getFields() {
        Collection<Field> temp = new ArrayList<Field>();
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                temp.add(spielfeld[x][y]);
            }
        }
        return temp;
    }
    public RevealFieldsResult revealFields(Coordinate coord) {
        Collection<Field> offeneFelder = new ArrayList<Field>();
        spielfeld[coord.getX()][coord.getY()].setOpened(true);
        offeneFelder.add(spielfeld[coord.getX()][coord.getY()]);
        if (spielfeld[coord.getX()][coord.getY()].hasMine()) {
            return new RevealFieldsResult(offeneFelder);
        }
       if (spielfeld[coord.getX()][coord.getY()].getNeighbourMineCount() == 0) {
               offeneFelder.addAll(openFields(coord.getX(), coord.getY(), false));
             
              
           }
        return new RevealFieldsResult(offeneFelder);
    }
    public RevealFieldsResult revealMultiClickFields(Coordinate coord) {
        Collection<Field> checkedFields = new ArrayList<Field>();
        Field thisField = spielfeld[coord.getX()][coord.getY()];
//         Ist das Feld noch nicht geöffnet oder ist das Feld geöffnet und es grenzt an keine Mine an, passiert nichts
//         (FIELD_NOT_REVEALED).
        if (!thisField.isOpened() || (thisField.isOpened() && thisField.getNeighbourMineCount() == 0)) {
            return new RevealFieldsResult(checkedFields);
        }
//        Stimmt die Anzahl der Flaggen auf den Nachbarfeldern mit der Anzahl der Minen
//        überein, werden alle Felder die KEINE Flagge haben aufgedeckt (siehe revealFields-Methode).
        int neighbourFlags = countFlags(coord.getX(), coord.getY());
        if (neighbourFlags == thisField.getNeighbourMineCount()) {
            thisField.setOpened(true);
            checkedFields.add(thisField);
         
            checkedFields.addAll(openFields(coord.getX(), coord.getY(), true));
           
        }
//        Stimmt die Anzahl der Flaggen auf den Nachbarfeldern nicht mit der Anzahl der Minen
//        überein, passiert nichts (FIELD_NOT_REVEALED)
        if (neighbourFlags != thisField.getNeighbourMineCount()) {
            return new RevealFieldsResult(checkedFields);
        }
        return new RevealFieldsResult(checkedFields);
    }
    private int checkNeighbours(int x, int y) {
        int counter = 0;
        for (int hx = x - 1; hx <= x + 1; hx++) {
            for (int hy = y - 1; hy <= y + 1; hy++) {
                if (!(hx == x && hy == y) && hx >= 0 && hy >= 0 && hx < width
                        && hy < height) {
                    if (spielfeld[hx][hy].hasMine()) {
                        counter++;
                    }
                }
            }
        }
        return counter;
    }
    private int countFlags(int x, int y) {
        int counter = 0;
        for (int hx = x - 1; hx <= x + 1; hx++) {
            for (int hy = y - 1; hy <= y + 1; hy++) {
                if (!(hx == x && hy == y) && hx >= 0 && hy >= 0 && hx < width
                        && hy < height) {
                    if (spielfeld[hx][hy].hasFlag()) {
                        counter++;
                    }
                }
            }
        }
        return counter;
    }
    private Collection<Field> openFields(int x, int y, Boolean checkFlag) {
        Collection<Field> felder = new ArrayList<Field>();
        for (int hx = x - 1; hx <= x + 1; hx++) {
            for (int hy = y - 1; hy <= y + 1; hy++) {
                if (!(hx == x && hy == y) && hx >= 0 && hy >= 0 && hx < width
                        && hy < height) {
                    if (checkFlag) {
                        if (spielfeld[hx][hy].hasFlag()) {
                            continue;
                        }
                    }
                    spielfeld[hx][hy].setOpened(true);
                    felder.add(spielfeld[hx][hy]);
                }
            }
        }
        return felder;
    }
    private Collection<Field> openFieldNoFlag(int x, int y, Collection<Field> felder) {
        for (int hx = x - 1; hx <= x + 1; hx++) {
            for (int hy = y - 1; hy <= y + 1; hy++) {
                if (hx != x && hy != y && hx >= 0 && hy >= 0 && hx < width
                        && hy < height) {
                    if (!spielfeld[hx][hy].hasMine()) {
                        spielfeld[hx][hy].setOpened(true);
                        felder.add(spielfeld[hx][hy]);
                    }
                }
            }
        }
        return felder;
    }
}


und hier mein Problem:

Code:
java.lang.AssertionError: Revealing field at coordinates (2/1) gave result with wrong number of fields. Board before:

3 3

| | | |
| | | |
| |m|m|

|#|#|#|
|#|#| |
|#|f|f|

Board after:

3 3

| | | |
| | | |
| |m|m|

Status:
|#| | |
|#|2|2|
|#|f|f|
Expected: <5>
     but: was <4>
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
    at org.junit.Assert.assertThat(Assert.java:865)
    at de.uniwue.jpp.minesweeper.tests.model.required.BoardTest.testMultiClickRightGuess(BoardTest.java:421)

Kann mir jemand Helfen wie ich das Problem beheben kann? =/
 

oerrs

Mitglied
lol das ist genau mein Code den ich heute nacht abgegeben hatte, nachdem er endlich funktioniert.
Meine Frage ist, wie bist du an den rangekommen?
Du hast die allergleichen Methodennamen und die gleichen Kommentare, die gleichen Argumente die den Hilfsmethoden uebergeben werden.. Kann nicht sein :D Schreib dir einen eigenen Code
 

oerrs

Mitglied
Ja bin auch drauf gekommen. Wollte kurz zwischenspeichern als ich nochmal alles von neu überarbeiten wollte, war mein Fehler das auf pastebin zu machen. Sorry mein Fehler. Mittlerweile ist der Code sowieso anders..
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...

Ähnliche Java Themen


Oben