# Minesweeper



## Nyk (21. Aug 2015)

Hallo, hier mein 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: 


```
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 (21. Aug 2015)

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  Schreib dir einen eigenen Code


----------



## MWin123 (21. Aug 2015)

@oerrs Warum veröffentlichst du auch deinen Code auf pastebin?

http://pastebin.com/54yVGHjT


> BY: A GUEST ON AUG 20TH, 2015 |  SYNTAX: JAVA |  SIZE: 6.89 KB  |  VIEWS: 187 |  EXPIRES: IN 6 DAYS


----------



## oerrs (21. Aug 2015)

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..


----------



## MWin123 (21. Aug 2015)

Pastebin kannst du schon verwenden, du musst aber "Paste Exposure" auf unlisted (oder private) umstellen.
Sonst wird der Code veröffentlicht und man kann ihn über Google finden.

Hier hat wohl noch einer deiner Kollegen seinen Code veröffentlicht:
http://pastebin.com/yw9vCBbb


> BY: ZOGGA007
> 
> 
> 
> ...


----------



## oerrs (21. Aug 2015)

Achsoo.. Okay danke 

Ja stimmt.


----------

