Anzahl der benachbarten Minen berechnen und setzen

Diskutiere Anzahl der benachbarten Minen berechnen und setzen im Java Basics - Anfänger-Themen Bereich.
L

LucaToni

Hab eine Methode, welche die Anzahl der benachbarten Minen berechnet und dann mit einer anderen Setter Methode setzt.

Ich bin grad etwas hilflos.
Würde mich über Ideen und Hilfen freuen.

Java:
/**Methode die ich versuche zu implementieren
*/
private void berechneAnzahl(final IKoordinate Koordinate) {
      
  }
 
Kirby_Sike

Kirby_Sike

Ich welcher Form speicherst du die Koordinaten deiner Mienen? In einem 2D Array?
 
Kirby_Sike

Kirby_Sike

Naja sollen nur der exakten Nachbarn gezählt werden oder möchtest du einen gewissen Radius abdecken?
 
L

LucaToni

Naja sollen nur der exakten Nachbarn gezählt werden oder möchtest du einen gewissen Radius abdecken?
eigentlich nur die direkten Nachbar... beispielweise...wenn ich bei x=4; y=2....3 Minen als nachbar habe dann will ich da die 3 herausbekommen und mit hilfe meiner Settermethode die 3 setzen...
Ich dachte an eine doppelte for-Schleife... aber ich weiß nicht wie ich das hier implementieren soll, da ich in dieser Klasse keine Koordinaten habe... und nicht weiß wie ich die übergebenen Parameter dafür benutzen kann.

Vorher habe ich halt Minen gesetzt mit der Methode:

Code:
private void setzeMinen() {
   Random zufallszahl=new Random();
        int zufallsx=zufallszahl.nextInt(breite);
        int zufallsy=zufallszahl.nextInt(hoehe);
        board[zufallsy][zufallsy].vermint();
    }
 
Kirby_Sike

Kirby_Sike

Also eigentlich brauchst du dafür keine For-Schleife ;) Du musst nur nach oben, unten, links und rechts schauen und als Ausgangspunkt verwendest du dein Koordinaten Kontainer ;)
Schick mal deine Klasse IKoordinate
 
L

LucaToni

Also eigentlich brauchst du dafür keine For-Schleife ;) Du musst nur nach oben, unten, links und rechts schauen und als Ausgangspunkt verwendest du dein Koordinaten Kontainer ;)
Schick mal deine Klasse IKoordinate
Meinst du 4 if abfragen? oder sogar 8 .... da die nachbarn diagonal zur position auch direkte nachbarn sind...

IKoordinate ist nur ein Interface...
Code:
public interface IKoordinate {

  /**
   * Gibt den x Wert zurueck.
   *
   * @return X Wert.
   */
  public int getX();

  /**
   * Setzt eine neue x Position.
   *
   * @param x Neuer x Wert.
   */
  public void setX(final int x);

  /**
   * Gibt den y Wert zurueck.
   *
   * @return Y Wert.
   */
  public int getY();

  /**
   * Setzt eine neue y Position.
   *
   * @param y Neuer y Wert.
   */
  public void setY(final int y);
}
 
Kirby_Sike

Kirby_Sike

Naja man könnte es mit den If abfragen machen :) Deine Ausgangswerte holst du dir über getX() und getX()
 
L

lennero

8 if abfragen? meinst du das geht nicht besser mit schleifen ? also einfacher und eleganter
Loop halt von der ersten Nachbarszelle oben links bis rechts, und das 3 mal wobei du die mittlere Zelle weglässt.

Was du untersuchen möchtest ist eine 3x3 Zelle (wobei die mittlere Zelle weggelassen wird). Das ist für mich schöner als 8 Koordinaten zu untersuchen.

Wenn du nicht weiterkommst, schau hier

 
L

LucaToni

wie kann ich denn in eine for schleife eine Anweisung einbauen? nur am Ende der verschachtelten For-Schleife?
 
mihe7

mihe7

wie kann ich denn in eine for schleife eine Anweisung einbauen? nur am Ende der verschachtelten For-Schleife?
@lennero hat Dir ja bereits einen Link geschickt, in dem eine mögliche Lösung zu sehen ist. Ich würde die aber etwas anders gestalten:
Java:
for (int row = 0; row < 3; row++) {
    for (int col = 0; col < 3; col++) {
        // Das Feld, auf dem man steht, ist nicht vermint, daher
        // muss man das mittlere Feld nicht unbedingt auslassen.
        // Wenn man will, kann man das natürlich machen, einfach
        // zusätzlich prüfen, ob col != row gilt:
        // if (col != row && istVermint(col + x - 1, row + y - 1)) {
        if (istVermint(col + x - 1, row + y - 1)) {
            count++;
        }
    }
}
mit
Java:
boolean istVermint(int x, int y) {
    if (y < 0 || y >= board.length || x < 0 || x >= board[0].length) {
        return false; // ausserhalb des Spielfelds ist garantiert nichts vermint
    }
    return board[x][y].istVermint();
}
Der Vorteil ist, dass in den Schleifen nicht überprüft werden muss, ob sich das Koordinatenpaar auf dem Brett findet.
 
L

LucaToni

@lennero hat Dir ja bereits einen Link geschickt, in dem eine mögliche Lösung zu sehen ist. Ich würde die aber etwas anders gestalten:
Java:
for (int row = 0; row < 3; row++) {
    for (int col = 0; col < 3; col++) {
        // Das Feld, auf dem man steht, ist nicht vermint, daher
        // muss man das mittlere Feld nicht unbedingt auslassen.
        // Wenn man will, kann man das natürlich machen, einfach
        // zusätzlich prüfen, ob col != row gilt:
        // if (col != row && istVermint(col + x - 1, row + y - 1)) {
        if (istVermint(col + x - 1, row + y - 1)) {
            count++;
        }
    }
}
mit
Java:
boolean istVermint(int x, int y) {
    if (y < 0 || y >= board.length || x < 0 || x >= board[0].length) {
        return false; // ausserhalb des Spielfelds ist garantiert nichts vermint
    }
    return board[x][y].istVermint();
}
Der Vorteil ist, dass in den Schleifen nicht überprüft werden muss, ob sich das Koordinatenpaar auf dem Brett findet.
Aber was passiert mit den übergebenen Parametern...die muss ich ja benutzen um die aktuelle Koordinate zu ermitteln.
 
Thema: 

Anzahl der benachbarten Minen berechnen und setzen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben