Hallo ich muss für die Uni ein Minesweeper Programm schreiben, jetzt fehlt mir aber noch eine Klasse bevor ich es abgeben kann. Die Aufgabenstellung sieht so aus:
public boolean hasWon()
Signalisiert das Ende eines Spieles: true, falls alle Felder ohne Mine geöffnet wurden.
public int getRemainingMines() Berechnet die Anzahl der noch verbleibenden Minen. Dazu wird von der Gesamtzahl der Minen, die Anzahl der mit einer Flagge versehenen Felder abgezogen.
public RevealFieldsResult revealFields(Coordinate coord) Diese Methode deckt ein vom Benutzer mit einem Linksklick ausgewähltes Feld nach folgenden Regeln auf:
o Feld als aufgedeckt markieren (setOpened)
o Feld ist eine Mine: Game Over <=> FOUND_MINE
o Feld ist keine Mine:
Feld hat keine Nachbarn die vermient sind:
Aufdecken aller Felder die mit diesem Feld benachbart sind
Feld hat Nachbarn die vermient sind (getNeighbourMineCount != 0) -> keine weitere Aktion
public RevealFieldsResult revealMultiClickFields(Coordinate coord)
Mit dieser Methode ist es möglich alle Nachbarn des bereits offenen Feldes an den gegebenen Koordinaten aufzudecken. Dabei gelten folgende Regeln:
o Ist das Feld noch nicht geöffnet, passiert nichts (FIELD_NOT_REVEALED).
o Ist das Feld geöffnet und es grenzt an keine Mine an, passiert nichts (FIELD_NOT_REVEALED).
o Ist das Feld geöffnet und es grenzt an mindestens eine Mine an, wird unterschieden:
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).
Stimmt die Anzahl der Flaggen auf den Nachbarfeldern nicht mit der Anzahl der Minen überein, passiert nichts (FIELD_NOT_REVEALED). Achtung: Ist also mindestens eine Flagge falsch gesetzt, ist das Spiel verloren, da Minen aufgedeckt werden.
Ich hab schon ein Anfang, aber komme nicht mehr weiter.
Vielen Dank im Voraus
public boolean hasWon()
Signalisiert das Ende eines Spieles: true, falls alle Felder ohne Mine geöffnet wurden.
public int getRemainingMines() Berechnet die Anzahl der noch verbleibenden Minen. Dazu wird von der Gesamtzahl der Minen, die Anzahl der mit einer Flagge versehenen Felder abgezogen.
public RevealFieldsResult revealFields(Coordinate coord) Diese Methode deckt ein vom Benutzer mit einem Linksklick ausgewähltes Feld nach folgenden Regeln auf:
o Feld als aufgedeckt markieren (setOpened)
o Feld ist eine Mine: Game Over <=> FOUND_MINE
o Feld ist keine Mine:
Feld hat keine Nachbarn die vermient sind:
Aufdecken aller Felder die mit diesem Feld benachbart sind
Feld hat Nachbarn die vermient sind (getNeighbourMineCount != 0) -> keine weitere Aktion
public RevealFieldsResult revealMultiClickFields(Coordinate coord)
Mit dieser Methode ist es möglich alle Nachbarn des bereits offenen Feldes an den gegebenen Koordinaten aufzudecken. Dabei gelten folgende Regeln:
o Ist das Feld noch nicht geöffnet, passiert nichts (FIELD_NOT_REVEALED).
o Ist das Feld geöffnet und es grenzt an keine Mine an, passiert nichts (FIELD_NOT_REVEALED).
o Ist das Feld geöffnet und es grenzt an mindestens eine Mine an, wird unterschieden:
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).
Stimmt die Anzahl der Flaggen auf den Nachbarfeldern nicht mit der Anzahl der Minen überein, passiert nichts (FIELD_NOT_REVEALED). Achtung: Ist also mindestens eine Flagge falsch gesetzt, ist das Spiel verloren, da Minen aufgedeckt werden.
Ich hab schon ein Anfang, aber komme nicht mehr weiter.
Java:
public class Board {
private int remainingMines;
private Collection<Field> mines;
private Collection<Field> fields;
private int width;
private boolean hasWon;
private int height;
public Board(int width, int height, Collection<Coordinate> mines){
Collection<Field> fields = new ArrayList<Field>();
for(int x = 0; x < width; x++) {
for(int y = 0; y < height; y++) {
Field field = new Field(new Coordinate(x, y));
if(field.hasMine()==true) {
field.setHasMine(true);
} else {
field.setNeighbourMineCount(count);
}
fields.add(field);
}
}
this.fields = fields;
}
public boolean getHasWon(){
return hasWon;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public boolean hasWon(){
if(remainingMines==0){
return true;
}
return false;
}
public void flagMine(Coordinate coord){
for(Field field: getFields()){
if(field.getCoordinate().equals(coord)){
if( field.hasFlag==true&&field.isOpened==false){
field.setHasFlag(false);
}
else if( field.hasFlag==false&&field.isOpened==false){
field.setHasFlag(true);
}
}
}
}
public int getRemainingMines(){
return remainingMines;
}
public Collection<Field> getMines(){
return mines;
}
public Collection<Field> getFields(){
return Collections.unmodifiableCollection(fields);
}
/*Diese letzten Methoden machen die meisten Probleme weil ich nicht weiß wie ich sie umsetzen soll */
public RevealFieldsResult revealFields(Coordinate coord){
for(Field field: getFields()){
if(field.isOpened==false){
field.setOpened(true);
}
if(field.hasMine==true){
return null ; // return null nur provisorisch
}
if(field.hasMine==false){
if(field.getNeighbourMineCount()==0){
}
else{
}
}
}
return null; //return null nur provisorisch
}
public RevealFieldsResult revealMultiClickFields(Coordinate coord){
return null; //return null nur provisorisch
}
}
Vielen Dank im Voraus