N
Nyk
Gast
Hallo, hier mein Code:
und hier mein Problem:
Kann mir jemand Helfen wie ich das Problem beheben kann? =/
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? =/