graphen:breitensuche:lee:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
graphen:breitensuche:lee:start [2023/10/18 13:52] – Martin Pabst | graphen:breitensuche:lee:start [2023/10/23 09:24] (aktuell) – Martin Pabst | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Exkurs zu Game Development: | ====== Exkurs zu Game Development: | ||
- | {{ : | + | {{ : |
- | Ausgangsproblem: | + | Ausgangsproblem: |
+ | {{ : | ||
+ | |||
+ | Die schwarzen Striche sind die Kanten des Graphen. Ausgehend von dem Knoten, an dem sich der Diamant befindet, traversieren wir den Graphen mittels Breitensuche solange, bis wir bei der Biene angelangt sind. Bei jedem Knoten speichern wir dabei, wie viele Schritte der Breitensuche wir bereits durchgeführt haben. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Jetzt muss die Biene nur noch in absteigender Reihenfolge den Zahlen folgen um zum Diamanten zu finden. | ||
+ | |||
+ | <WRAP center round tip 80%> | ||
+ | Haben Sie gestutzt, als Sie gelesen haben, dass wir die Breitensuche beim Diamanten und nicht bei der Biene beginnen? Welches Problem würde entstehen, wenn wir bei der Biene beginnen? | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | new World(1600, 640); | ||
+ | new Level(); | ||
+ | |||
+ | class Level extends Actor { | ||
+ | |||
+ | | ||
+ | |||
+ | Figur biene; | ||
+ | Figur diamant; | ||
+ | |||
+ | int spaltenAnzahl; | ||
+ | int zeilenAnzahl; | ||
+ | |||
+ | int t = 0; | ||
+ | |||
+ | |||
+ | | ||
+ | levelAufbauen(); | ||
+ | diamant = new Figur(23, 1, 186); | ||
+ | biene = new Figur(5, 3, 264); | ||
+ | felderBewerten(); | ||
+ | | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Die Methode felderBewerten() wird vom Programm zu Beginn aufgerufen. Sie soll | ||
+ | * via felder[spalte][zeile].setEntfernung(int e) in jedem Feld die Entfernung | ||
+ | * zum Diamanten speichern. | ||
+ | * * | ||
+ | * istWand(spalte, | ||
+ | * biene.geheZu(spalte, | ||
+ | * biene.spalte, | ||
+ | * felder[spalte][zeile].setEntfernung(int e) können Sie benutzen, um jedem Feld einen Wert zuzuweisen. | ||
+ | * | ||
+ | */ | ||
+ | void felderBewerten() { | ||
+ | |||
+ | for (int spalte = 0; spalte < spaltenAnzahl; | ||
+ | for (int zeile = 0; zeile < zeilenAnzahl; | ||
+ | felder[spalte][zeile].setEntfernung(-1); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Breitensuche vom Feld des Diamanten aus | ||
+ | LinkedList< | ||
+ | Block aktuellesFeld = felder[diamant.spalte][diamant.zeile]; | ||
+ | warteschlange.addLast(felder[diamant.spalte][diamant.zeile]); | ||
+ | aktuellesFeld.setEntfernung(0); | ||
+ | |||
+ | while (!warteschlange.isEmpty()) { | ||
+ | | ||
+ | int aktuelleEntfernung = aktuellesFeld.getEntfernung(); | ||
+ | |||
+ | // linkes Nachbarfeld: | ||
+ | | ||
+ | Block linkerNachbar = felder[aktuellesFeld.spalte - 1][aktuellesFeld.zeile]; | ||
+ | if(!linkerNachbar.istWand() && linkerNachbar.getEntfernung() < 0) { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // rechtes Nachbarfeld: | ||
+ | | ||
+ | Block rechterNachbar = felder[aktuellesFeld.spalte + 1][aktuellesFeld.zeile]; | ||
+ | if(!rechterNachbar.istWand() && rechterNachbar.getEntfernung() < 0) { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // oberes Nachbarfeld: | ||
+ | | ||
+ | Block obererNachbar = felder[aktuellesFeld.spalte][aktuellesFeld.zeile - 1]; | ||
+ | if(!obererNachbar.istWand() && obererNachbar.getEntfernung() < 0) { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // unteres Nachbarfeld: | ||
+ | | ||
+ | Block linkerNachbar = felder[aktuellesFeld.spalte][aktuellesFeld.zeile + 1]; | ||
+ | if(!linkerNachbar.istWand() && linkerNachbar.getEntfernung() < 0) { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | void schritt() { | ||
+ | if(biene.spalte == diamant.spalte && biene.zeile == diamant.zeile) { | ||
+ | | ||
+ | } | ||
+ | |||
+ | |||
+ | // Bei allen Feldern ist jetzt der Abstand zum Diamanten hinterlegt. Wir suchen jetzt ein | ||
+ | // Nachbarfeld der Biene, das einen um eins geringeren Abstand hat als das Feld der Biene. | ||
+ | |||
+ | Block bienenfeld = felder[biene.spalte][biene.zeile]; | ||
+ | int bienenAbstand = bienenfeld.getEntfernung(); | ||
+ | |||
+ | if(felder[bienenfeld.spalte - 1][bienenfeld.zeile].getEntfernung() == bienenAbstand - 1) { | ||
+ | | ||
+ | } else | ||
+ | if(felder[bienenfeld.spalte + 1][bienenfeld.zeile].getEntfernung() == bienenAbstand - 1) { | ||
+ | | ||
+ | } else | ||
+ | if(felder[bienenfeld.spalte][bienenfeld.zeile - 1].getEntfernung() == bienenAbstand - 1) { | ||
+ | | ||
+ | } else | ||
+ | if(felder[bienenfeld.spalte][bienenfeld.zeile + 1].getEntfernung() == bienenAbstand - 1) { | ||
+ | | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | | ||
+ | t++; | ||
+ | if(t == 30) { | ||
+ | t = 0; | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | | ||
+ | return felder[spalte][zeile].istWand(); | ||
+ | } | ||
+ | |||
+ | |||
+ | void levelAufbauen() { | ||
+ | String level = """ | ||
+ | wwwwwwwwwwwwwwwwwwwwwwwww | ||
+ | w w w | ||
+ | w | ||
+ | w | ||
+ | wwwwwww | ||
+ | w w w | ||
+ | w w | ||
+ | w w w | ||
+ | wwwwwwwwwwwwwwwwwwwwwwwww | ||
+ | """; | ||
+ | |||
+ | String[] lines = level.split(" | ||
+ | | ||
+ | zeilenAnzahl = lines.length; | ||
+ | spaltenAnzahl = lines[0].length(); | ||
+ | | ||
+ | felder = new Block[spaltenAnzahl][zeilenAnzahl]; | ||
+ | |||
+ | for (int zeile = 0; zeile < zeilenAnzahl; | ||
+ | | ||
+ | for (int spalte = 0; spalte < spaltenAnzahl; | ||
+ | char buchstabe = line.charAt(spalte); | ||
+ | felder[spalte][zeile] = new Block(spalte, | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | <script type=" | ||
+ | class Block extends Sprite { | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | |||
+ | int spalte; | ||
+ | int zeile; | ||
+ | |||
+ | | ||
+ | super(32 + 64 * spalte, 32 + 64 * zeile, SpriteLibrary.Plattforms, | ||
+ | |||
+ | this.art = art; | ||
+ | this.spalte = spalte; | ||
+ | this.zeile = zeile; | ||
+ | |||
+ | if(art == " | ||
+ | | ||
+ | } | ||
+ | |||
+ | this.entfernungsText = new Text(16 + 64 * spalte, 16 + 64 * zeile, 32, "" | ||
+ | this.entfernungsText.setFillColor(Color.black); | ||
+ | } | ||
+ | |||
+ | | ||
+ | return art == " | ||
+ | } | ||
+ | |||
+ | void setEntfernung(int entfernung) { | ||
+ | this.entfernung = entfernung; | ||
+ | this.entfernungsText.setText(entfernung); | ||
+ | } | ||
+ | |||
+ | int getEntfernung() { | ||
+ | return entfernung; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | <script type=" | ||
+ | class Figur extends Sprite { | ||
+ | |||
+ | int spalte; | ||
+ | int zeile; | ||
+ | |||
+ | | ||
+ | super(32 + 64 * spalte, 32 + 64 * zeile, SpriteLibrary.Plattforms, | ||
+ | this.spalte = spalte; | ||
+ | this.zeile = zeile; | ||
+ | } | ||
+ | |||
+ | | ||
+ | moveTo(32 + 64 * spalte, 32 + 64 * zeile); | ||
+ | this.spalte = spalte; | ||
+ | this.zeile = zeile; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | </ | ||
+ | </ | ||
graphen/breitensuche/lee/start.1697637168.txt.gz · Zuletzt geändert: 2023/10/18 13:52 von Martin Pabst