sterum
Well-Known Member
Ich hab mich jetzt mal ein wenig mit mehrdimensionalen Arrays beschäftigt und bin dadurch auf Minesweeper gekommen.
Jetzt frage ich mich wie ich nun jedes Element mit der Anzahl der Umliegenden Minen setzte.
Meine Lösung sieht zur Zeit so aus (Perl), jedoch scheint mir das ganze etwas zu "aufgebläht".
@feld = Spielfeld
X bezeichnet ein mit einer Mine belegtes Element
$max = Maximale Spielfeldgröße
Vielleicht gibt es ja eine einfachere (kürzere) Lösung.
Wie würdet ihr das machen?
Jetzt frage ich mich wie ich nun jedes Element mit der Anzahl der Umliegenden Minen setzte.
Meine Lösung sieht zur Zeit so aus (Perl), jedoch scheint mir das ganze etwas zu "aufgebläht".
@feld = Spielfeld
X bezeichnet ein mit einer Mine belegtes Element
$max = Maximale Spielfeldgröße
Code:
# Ecke Links oben
my $zahl = 0;
$zahl+=1 if $feld[0][1] eq 'X';
$zahl+=1 if $feld[1][0] eq 'X';
$zahl+=1 if $feld[1][1] eq 'X';
$feld[0][0] = $zahl if $zahl;
# Ecke Rechts oben
$zahl = 0;
$zahl+=1 if $feld[0][$size] eq 'X';
$zahl+=1 if $feld[1][$size] eq 'X';
$zahl+=1 if $feld[1][$size-1] eq 'X';
$feld[0][$size] = $zahl if $zahl;
# Ecke Links unten
$zahl = 0;
$zahl+=1 if $feld[$size-1][0] eq 'X';
$zahl+=1 if $feld[$size][1] eq 'X';
$zahl+=1 if $feld[$size-1][1] eq 'X';
$feld[$size][0] = $zahl if $zahl;
# Ecke Rechts unten
$zahl = 0;
$zahl+=1 if $feld[$size][$size-1] eq 'X';
$zahl+=1 if $feld[$size-1][$size-1] eq 'X';
$zahl+=1 if $feld[$size-1][$size] eq 'X';
$feld[$size][$size] = $zahl if $zahl;
# Linke Kante
$zahl = 0;
for ($i=1;$i<$size;$i++) {
$zahl+=1 if $feld[0][$i-1] eq 'X';
$zahl+=1 if $feld[0][$i+1] eq 'X';
$zahl+=1 if $feld[1][$i-1] eq 'X';
$zahl+=1 if $feld[1][$i] eq 'X';
$zahl+=1 if $feld[1][$i+1] eq 'X';
$feld[0][$i] = $zahl if $zahl;
}
# Rechte Kante
$zahl = 0;
for ($i=1;$i<$size;$i++) {
$zahl+=1 if $feld[$size][$i-1] eq 'X';
$zahl+=1 if $feld[$size][$i+1] eq 'X';
$zahl+=1 if $feld[$size-1][$i-1] eq 'X';
$zahl+=1 if $feld[$size-1][$i] eq 'X';
$zahl+=1 if $feld[$size-1][$i+1] eq 'X';
$feld[$size][$i] = $zahl if $zahl;
}
# Obere Kante
$zahl = 0;
for ($i=1;$i<$size;$i++) {
$zahl+=1 if $feld[$i-1][0] eq 'X';
$zahl+=1 if $feld[$i+1][0] eq 'X';
$zahl+=1 if $feld[$i-1][1] eq 'X';
$zahl+=1 if $feld[$i][1] eq 'X';
$zahl+=1 if $feld[$i+1][1] eq 'X';
$feld[$i][0] = $zahl if $zahl;
}
# Untere Kante
$zahl = 0;
for ($i=1;$i<$size;$i++) {
$zahl+=1 if $feld[$i-1][$size] eq 'X';
$zahl+=1 if $feld[$i+1][$size] eq 'X';
$zahl+=1 if $feld[$i-1][$size-1] eq 'X';
$zahl+=1 if $feld[$i][$size-1] eq 'X';
$zahl+=1 if $feld[$i+1][$size-1] eq 'X';
$feld[$i][$size] = $zahl if $zahl;
}
# Innenfeld
for ($x=1;$x<$size;$x++) {
for ($y=1;$y<$size;$y++) {
$zahl = 0;
if ($feld[$x][$y] ne 'X') {
$zahl+=1 if $feld[$x-1][$y-1] eq 'X';
$zahl+=1 if $feld[$x][$y-1] eq 'X';
$zahl+=1 if $feld[$x+1][$y-1] eq 'X';
$zahl+=1 if $feld[$x-1][$y] eq 'X';
$zahl+=1 if $feld[$x+1][$y] eq 'X';
$zahl+=1 if $feld[$x-1][$y+1] eq 'X';
$zahl+=1 if $feld[$x][$y+1] eq 'X';
$zahl+=1 if $feld[$x+1][$y+1] eq 'X';
$feld[$x][$y] = $zahl if $zahl;
}
}
}
Vielleicht gibt es ja eine einfachere (kürzere) Lösung.
Wie würdet ihr das machen?

