Last active
August 29, 2015 14:17
-
-
Save ralfw/f23c807fb54ceacec47d to your computer and use it in GitHub Desktop.
Kata Minesweeper - Ein Versuch mit Groovy
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import daten.* | |
import adapter.* | |
import domain.* | |
def (String spielfelddateiname, String mogelzetteldateiname) = CLIadapter.kommandozeilenparameter_lesen(args) | |
def spielfeldPM = Dateiadapter.lese_Spielfeld(spielfelddateiname) | |
def mogelzettelPM = berechne_Mogelzettel(spielfeldPM) | |
Dateiadapter.schreibe_Mogelzettel(mogelzetteldateiname, mogelzettelPM) | |
def berechne_Mogelzettel(String[] spielfeldPM) { | |
def mogler = new Mogler(spielfeldPM: spielfeldPM) | |
def mogelzettel = new Mogelzettel() | |
mogler.mogeln( | |
mogelzettel.&hinzufügen) | |
return mogelzettel.serialisieren() | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package domain | |
import daten.* | |
class Mogler { | |
private String[] spielfeldPM; | |
void mogeln(beiMogelzelle) { | |
zellen_klassifizieren( | |
{Spielfeldkoordinate minenzelle -> | |
def mogelzelle = behandle_Mine(minenzelle) | |
beiMogelzelle(mogelzelle) | |
}, | |
{Spielfeldkoordinate leereZelle -> | |
def mogelzelle = ermittle_Anzahl_umliegender_Minen(leereZelle) | |
beiMogelzelle(mogelzelle) | |
}) | |
} | |
private void zellen_klassifizieren(beiMinenzelle, beiLeererZelle) { | |
def y = 0 | |
this.spielfeldPM.each {zeile -> | |
def x = 0 | |
zeile.chars.each {feld -> | |
if (feld == "*") | |
beiMinenzelle(new Spielfeldkoordinate(x:x, y:y)) | |
else | |
beiLeererZelle(new Spielfeldkoordinate(x:x, y:y)) | |
x++ | |
} | |
y++ | |
} | |
} | |
private static Mogelzelle behandle_Mine(Spielfeldkoordinate koord) { | |
new Minenmogelzelle(koordinate:koord) | |
} | |
private Mogelzelle ermittle_Anzahl_umliegender_Minen(Spielfeldkoordinate koord) { | |
def anzahlMinen = 0 | |
[-1,0,1].each {dy -> | |
[-1,0,1].each {dx -> | |
if (dy == 0 && dx == 0) return | |
def y = koord.y + dy | |
def x = koord.x + dx | |
if (y < 0 || x < 0) return | |
if (y >= this.spielfeldPM.size() || x >= this.spielfeldPM.first().size()) return | |
if (this.spielfeldPM[y][x] == "*") anzahlMinen++ | |
} | |
} | |
new Hinweismogelzelle(koordinate:koord, anzahlUmliegenderMinen:anzahlMinen) | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package daten | |
import javax.swing.text.html.Option | |
class Mogelzelle { | |
Spielfeldkoordinate koordinate | |
} | |
class Minenmogelzelle extends Mogelzelle { | |
String mogelwert() {"*"} | |
} | |
class Hinweismogelzelle extends Mogelzelle { | |
int anzahlUmliegenderMinen | |
String mogelwert() {anzahlUmliegenderMinen} | |
} | |
class Mogelzettel { | |
private List<Mogelzelle> mogelzellen = [] | |
void hinzufügen(Mogelzelle zelle) { | |
this.mogelzellen.add(zelle) | |
} | |
List<String> serialisieren() { | |
mogelzellen.sort {z -> z.koordinate.y * 100 + z.koordinate.x} | |
def grouped = mogelzellen.groupBy {it.koordinate.y} | |
return grouped.collect {g -> g.value.inject("", {s, z -> s += z.mogelwert()})} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package daten | |
class Spielfeldkoordinate { | |
int x, y | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package adapter | |
class CLIadapter { | |
static def kommandozeilenparameter_lesen(String[] args) { | |
return [args[0], args[1]] | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package adapter | |
class Dateiadapter { | |
static void schreibe_Mogelzettel(String dateiname, List<String> mogelzettel) { | |
def f = new File(dateiname) | |
f.withWriter { w -> mogelzettel.each { l -> w << "$l\n" } } | |
} | |
static String[] lese_Spielfeld(String dateiname) { | |
def f = new File(dateiname) | |
return f.readLines().toArray() | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment