Auf Thema antworten

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;

    }

}[/code]



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)

[/code]


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



Oben