Skip to content

Instantly share code, notes, and snippets.

@ralfw
Last active August 29, 2015 14:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ralfw/f23c807fb54ceacec47d to your computer and use it in GitHub Desktop.
Save ralfw/f23c807fb54ceacec47d to your computer and use it in GitHub Desktop.
Kata Minesweeper - Ein Versuch mit Groovy
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()
}
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)
}
}
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()})}
}
}
package daten
class Spielfeldkoordinate {
int x, y
}
package adapter
class CLIadapter {
static def kommandozeilenparameter_lesen(String[] args) {
return [args[0], args[1]]
}
}
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