vendredi 22 mai 2015
Labyrinth mittel FloodFill
Posted on 06:49 by verona
Hallo zusammen,
ich möchte ein Labyrinth mittels des FloodFill - Algorithmus implementieren (siehe Anhang). Dazu habe ich diese Klasse gegeben:
Die searchForKnight-Methode kann erstmal weggelassen werden.
Bis jetzt habe ich leider nur Methode à la
oder ähnliches geschafft. "map[x][y] = true" bedeutet hier immer, dass hier ein freies Feld ist, false bedeutet, dass hier nicht gegangen werde kann. Auch schon aufwendigere Methoden, die ein Labyrinth mit verbunden Gängen erzeugt hat, sind mit gelungen. Aber nichts davon hatte was mit FloodFill oder einem vernünftigen Labyrinth zu tun.
Gegen ist zudem noch eine GUI:
Wie kann ich den FloodFill Algorithmus zur Labyrintherzeugzung implementieren?
ich möchte ein Labyrinth mittels des FloodFill - Algorithmus implementieren (siehe Anhang). Dazu habe ich diese Klasse gegeben:
Java Code:
-
import java.util.List;
-
import java.util.ArrayList;
-
import java.util.Arrays;
-
import java.util.Collections;
-
import java.util.Random;
-
import java.awt.Point;
-
-
public class Labyrinth {
-
// Größe der Karte. Die Karte ist quadratisch
-
private int size;
-
// Karte. true = Feld begehbar, false = Feld blockiert
-
private boolean[][] map;
-
// initiale Position der Prinzessin
-
// Position des Prinzen
-
// aktuelle Position der Prinzessin
-
-
// Richtungen, als int kodiert
-
private static final int kDirUp = 0;
-
private static final int kDirDown = 1;
-
private static final int kDirRight = 2;
-
private static final int kDirLeft = 3;
-
// erste und letzte Richtung (um Richtungen in Schleifen zu durchlaufen
-
// etc.)
-
private static final int kDirFirst = 0;
-
private static final int kDirLast = 3;
-
-
// Interface um die GUI über Updates zu informieren
-
public interface Listener {
-
// aktuelle des Position der Prinzessin (= die Position, die von
-
// getCurrentPosition() zurückgegeben wird) hat sich geändert
-
void princessUpdated();
-
};
-
-
private List<Listener> listeners = new ArrayList<Listener>();
-
-
Labyrinth(int size) {
-
this.size = size;
-
-
-
map = new boolean[size][size];
-
-
// finde freie Start- und Zielkoordinaten
-
List<Point> free = new ArrayList<Point>();
-
for (int x = 0; x < size; x++)
-
for (int y = 0; y < size; y++)
-
if (map[x][y])
-
-
if (free.size() == 0)
-
"There are not free fields in the labyrinth");
-
-
startingPoint = free.get(random.nextInt(free.size()));
-
destinationPoint = free.get(random.nextInt(free.size()));
-
currentPosition = startingPoint;
-
}
-
-
// wird vom GUI Code benutzt, um einen Listener zu installieren
-
public void addListener(Listener listener) {
-
listeners.add(listener);
-
}
-
-
public int getMapSize() {
-
return size;
-
}
-
-
return startingPoint;
-
}
-
-
return destinationPoint;
-
}
-
-
return currentPosition;
-
}
-
-
public boolean tileIsBlocked(int x, int y) {
-
return !map[x][y];
-
}
-
-
// ruft alle Listener auf. Sollte nach jedem Update von
-
// currentPosition aufgerufen werden.
-
private void princessUpdated() {
-
for (Listener listener : listeners)
-
listener.princessUpdated();
-
}
-
-
// berechnet zu einem gegebenen Punkt den nächsten Punkt in
-
// einer bestimmten Richtung. Überprüft NICHT, ob der
-
// Ergebnispunkt auch wirklich auf der Karte liegt!
-
switch (direction) {
-
case kDirUp:
-
case kDirDown:
-
case kDirRight:
-
case kDirLeft:
-
default:
-
}
-
}
-
-
// testet, ob der gegebene Punkt auf der Karte liegt
-
// (testet NICHT dessen Begehbarkeit!)
-
return p.x >= 0 && p.x < size && p.y >= 0 && p.y < size;
-
}
-
-
-
}
-
-
public void searchForKnight() {
-
-
}
-
}
Die searchForKnight-Methode kann erstmal weggelassen werden.
Bis jetzt habe ich leider nur Methode à la
Java Code:
oder ähnliches geschafft. "map[x][y] = true" bedeutet hier immer, dass hier ein freies Feld ist, false bedeutet, dass hier nicht gegangen werde kann. Auch schon aufwendigere Methoden, die ein Labyrinth mit verbunden Gängen erzeugt hat, sind mit gelungen. Aber nichts davon hatte was mit FloodFill oder einem vernünftigen Labyrinth zu tun.
Gegen ist zudem noch eine GUI:
Java Code:
-
package b5P;
-
-
-
// Autoren: Ulrich, Zur, van der Grinten, Lückerath
-
-
import java.awt.BorderLayout;
-
import java.awt.Color;
-
import java.awt.FlowLayout;
-
import java.awt.Graphics;
-
import java.awt.Image;
-
import java.awt.Point;
-
import java.awt.event.ActionEvent;
-
import java.awt.event.ActionListener;
-
import java.awt.image.BufferedImage;
-
import java.io.File;
-
import java.io.IOException;
-
-
import javax.imageio.ImageIO;
-
import javax.swing.JButton;
-
import javax.swing.JFrame;
-
import javax.swing.JPanel;
-
-
public class GUI {
-
private Labyrinth labyrinth;
-
-
private Display display = new Display();
-
-
-
public GUI() {
-
labyrinth = new Labyrinth(15);
-
labyrinth.addListener(new Labyrinth.Listener() {
-
@Override public void princessUpdated() {
-
frame.repaint();
-
-
// damit man die Bewegung sehen kann
-
try{
-
}
-
});
-
-
// initialisiere alle Swing-Komponenten
-
btnStart.setText("Lösen!");
-
// müssen das Labyrinth in einem anderen Thread lösen,
-
// damit die GUI Anwendung reaktionsfähig bleibt.
-
@Override public void run() {
-
labyrinth.searchForKnight();
-
btnStart.setEnabled(true);
-
}
-
};
-
-
btnStart.setEnabled(false);
-
}
-
});
-
-
panelNorth.add(btnStart);
-
-
-
// lade Bilder und skaliere auf richtige GröÃe
-
try{
-
-
-
};
-
-
// zeige das Fenster an
-
frame.setSize(600, 665);
-
frame.setResizable(false);
-
frame.setTitle("Save the prince!");
-
frame.setContentPane(panelMain);
-
frame.setVisible(true);
-
}
-
-
new GUI();
-
}
-
-
// unser Zeichenbereich
-
super.paintComponent(g);
-
-
int height = this.getHeight();
-
int width = this.getWidth();
-
-
// fülle Hintergrund
-
g.fillRect(0, 0, width, height);
-
-
for(int y = 0; y < labyrinth.getMapSize(); y++){
-
for(int x = 0; x < labyrinth.getMapSize(); x++){
-
// zeichne Feld
-
if(labyrinth.tileIsBlocked(x, y)) {
-
g.drawImage(imgRock, x * 40, y * 40, null);
-
}else{
-
g.drawImage(imgGrass, x * 40, y * 40, null);
-
}
-
-
// zeichne Rahmen um die Grafik
-
g.drawRect(x * 40, y * 40, 40, 40);
-
}
-
-
// zeichne Prinz und Prinzessin
-
g.drawImage(imgPrince, labyrinth.getDestinationPoint().x * 40 - 13,
-
labyrinth.getDestinationPoint().y * 40 - 10, null);
-
g.drawImage(imgPrincess, labyrinth.getCurrentPosition().x * 40 - 8,
-
labyrinth.getCurrentPosition().y * 40 - 8, null);
-
}
-
-
// wird eine Lösung gefunden ... naja
-
if(labyrinth.getCurrentPosition().x == labyrinth.getDestinationPoint().x
-
&& labyrinth.getCurrentPosition().y == labyrinth.getDestinationPoint().y)
-
g.drawImage(imgCensored, labyrinth.getCurrentPosition().x * 40 - 20,
-
labyrinth.getCurrentPosition().y * 40 - 10, null);
-
}
-
}
-
}
Wie kann ich den FloodFill Algorithmus zur Labyrintherzeugzung implementieren?
Labyrinth mittel FloodFill
Categories: Labyrinth mittel FloodFill
Inscription à :
Publier les commentaires (Atom)
0 commentaires:
Enregistrer un commentaire