b2aat6n
b2aat6n
b2aat6n
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
[Abb. 4] Der Flow<br />
für die Vorgehens-<br />
weise nach Mine.<br />
[Abb. 5] Die bewährte Projektstruktur.<br />
muss. Ich erstelle die Verzeichnisse, lege<br />
Projekte an, setze Referenzen, ändere Ausgabepfade,<br />
alles ist immer gleich. Wenn Sie<br />
jetzt denken, dass das eine Wiederholung<br />
ist, welche gegen das Prinzip Don't Repeat<br />
Yourself (DRY) verstößt, dann haben Sie<br />
mich erwischt. Eigentlich sollte ich diese<br />
immer wiederkehrenden Handgriffe automatisieren.<br />
Ein Vorteil der immer gleichen Struktur<br />
ist, dass ich mich in allen Projekten sofort<br />
zurechtfinde. Alles liegt immer am gleichen<br />
Platz. Um eine solche Konvention zu etablieren,<br />
muss sie sich allerdings zunächst in<br />
der Praxis bewähren. Denn wenn das nicht<br />
der Fall ist, nützt die schönste Konvention<br />
nichts.Wenn ich regelmäßig Projektstrukturen<br />
anlege und verwende, zeigt sich, ob im<br />
Detail noch Verbesserungen möglich sind.<br />
Die in Abbildung 5 gezeigte Struktur hat<br />
sich in vielen Projekten, Übungen und Seminaren<br />
bewährt. Die Pfeile zeigen, welche<br />
Projekte referenziert werden. Beim Mogelzettel<br />
habe ich mich für zwei Implementierungsprojekte<br />
sowie ein Testprojekt entschieden.<br />
Bei der Implementierung unterscheide<br />
ich zwischen der Logik und dem<br />
Host. Im Host wird lediglich die Konsolenschnittstelle<br />
zur Verfügung gestellt. Die beiden<br />
Parameter der Kommandozeile werden<br />
als Dateinamen interpretiert. Durch<br />
die Abtrennung des Hosts lässt sich die Logik<br />
des Mogelzettels auch einmal in einem<br />
GUI-Host verwenden.<br />
Diesmal habe ich keine komponentenorientierte<br />
Architektur gewählt, da ich mich<br />
auf das Problem der Indizes konzentrieren<br />
wollte. Dennoch sind in der Solution mehrere<br />
Projekte mit klar definierten Aufgaben<br />
vorhanden. Für eine komponentenorientierte<br />
Lösung kämen die Kontrakte hinzu,<br />
Listing 4<br />
Den Rand beim Rand-Trick entfernen.<br />
internal static int[,] RandEntfernen(int[,] array) {<br />
var result = new int[array.GetLength(0) - 2,array.GetLength(1) - 2];<br />
for (var i = 1; i < array.GetLength(0) - 1; i++) {<br />
for (var j = 1; j < array.GetLength(1) - 1; j++) {<br />
result[i - 1, j - 1] = array[i, j];<br />
}<br />
}<br />
return result;<br />
}<br />
Listing 5<br />
Erst Indizes bestimmen, dann prüfen.<br />
LÖSUNG<br />
und die einzelnen Komponenten würden je<br />
eine eigene Solution erhalten.<br />
internal static int[,] MogelzettelBerechnen(Size groesse, IEnumerable minenKoordinaten) {<br />
var result = new int[groesse.Height,groesse.Width];<br />
foreach (var mine in minenKoordinaten) {<br />
var indizes = new[] {<br />
new Point(mine.X - 1, mine.Y - 1),<br />
new Point(mine.X - 1, mine.Y),<br />
new Point(mine.X - 1, mine.Y + 1),<br />
new Point(mine.X, mine.Y - 1),<br />
new Point(mine.X, mine.Y + 1),<br />
new Point(mine.X + 1, mine.Y - 1),<br />
new Point(mine.X + 1, mine.Y),<br />
new Point(mine.X + 1, mine.Y +1),<br />
};<br />
foreach (var index in indizes) {<br />
if ((index.X >= 0) && (index.X < groesse.Width) && (index.Y >= 0) &&<br />
(index.Y < groesse.Height)) {<br />
result[index.Y, index.X]++;<br />
}<br />
}<br />
}<br />
return result;<br />
}<br />
www.dotnetpro.de dotnetpro.dojos.2011 25<br />
Fazit<br />
Der Minesweeper-Mogelzettel ist eine zeitlich<br />
überschaubare Übung. Der Umgang<br />
mit den Indizes bietet ein reichhaltiges Betätigungsfeld.<br />
Falls Sie es also bislang noch<br />
nicht selbst versucht haben: Mogeln Sie<br />
mal wieder beim Minesweeper, aber nicht<br />
beim Übungspensum! [ml]<br />
[1] Stefan Lieser: Mogeln mit EVA, Daten umformen,<br />
dotnetpro 6/2010, Seite 116ff.<br />
www.dotnetpro.de/A1006dojo<br />
[2] Golo Roden: yield return, yield break, yield...<br />
Golos scharfes C, dotnetpro 5/2010, S. 122f.<br />
www.dotnetpro.de/A1005ScharfesC<br />
[3] Stefan Lieser: Kettenreaktion, INotifyProperty-<br />
Changed-Logik automatisiert testen,<br />
dotnetpro 5/2010, S. 108ff.<br />
www.dotnetpro.de/A1005dojo