PowerShell Game 03
01.02.2016 - Sebastian Pech - ~2 Minuten
Unser PowerShell Game ist langweilig ohne eine Welt in der die Handlung stattfinden kann. Dieser Artikel umfasst die Definition und Darstellung einer kleinen Welt.
Map
Ein einfaches Textformat soll die Karte darstellen. Die Zeilen mit einem Fragezeichen kennzeichnen eine Konfiguration der Rest ist die Beschreibung der Welt. E steht für Erde, # für Wände, W für Wasser usw. Die tatsächliche Formatierung und Einfärbung übernimmt das Skript.
?SIZE 20 18
EEE#EEEEE#GG#EEEEE#E
##########GG########
#LSSSSSSSSSSSSSSSSL#
#LSSBBBBSSSSBBBBSSL#
#LSSBBBBSSSSBBBBSSL#
#LSSBDBBSSSSBDBBSSL#
#LSSSSSSSSSSSSSSSSL#
#LSSSSSSSSSSSSSSSSL#
#LSSSSSSSSBBBBBBSSL#
#LSSJJJJSSBBBBBBSSL#
#LSSLLLLSSBBBBBBSSL#
#LSSLLLLSSBBDDBBSSL#
#LSSSSSSSSSSSSSSSSL#
#LSSSSSSSSJJJJJJSSL#
#LLLWWWWSSLLLLLLSSL#
#LLLWWWWSSLLLLLLSSL#
#LLLWWWWSSSSSSSSSSL#
##LLWWWW############
Welt einlesen
Die Welt besteht aus den einzelnen Zeichen. Jedes Zeichen umfasst dabei ein Spielfeld. Für die Verwaltung werden noch weitere Variablen benötigt.
$mapRaw = "" # Kompletter Dateiinhalt
$map = "" # Spielfelder
$mapWidth = 0 # Breite
$mapHeight = 0 # Höhe
function ReadMap($mapName)
{
# Datei lesen
$global:mapRaw = Get-Content "maps/$mapName"
$global:map = ""
# Zeilenweise durch die Daten bewegen
foreach ($line in $global:mapRaw)
{
# Fängt die Zeile mit einem ? an, handelt es sich um eine Konfigurationsanagbe
if($line[0] -eq "?")
{
$param = $line.Substring(1)
Write-Host "Found parameter: $param"
$paramParts = $param.Split(" ")
# Der SIZE Parameter gibt die Breite und Höhe der Karte an
if($paramParts[0] -eq "SIZE")
{
$global:mapWidth = $paramParts[1]
$global:mapHeight = $paramParts[2]
}
} else {
# Alle Daten ohne Fragezeichen sind Spielfelder
$global:map += $line
}
}
}
Welt zeichnen
Die Welt wird Zeichenweise ausgegeben. Jedes Zeichen der Datei kann als farbiges Feld und Zeichen ausgegeben werden.
function DrawMap()
{
# Write-Host $global:map
for($y = 0; $y -lt $global:mapHeight; $y++)
{
for($x = 0; $x -lt $global:mapWidth; $x++)
{
$char = $global:map[$x + $y * $global:mapWidth]
switch($char)
{
'E' { Write-Host -NoNewline -ForegroundColor Black -BackgroundColor DarkRed '^' }
'#' { Write-Host -NoNewline -ForegroundColor Gray -BackgroundColor DarkGray '#' }
'L' { Write-Host -NoNewline -ForegroundColor DarkGreen -BackgroundColor DarkGreen ' ' }
'S' { Write-Host -NoNewline -ForegroundColor Yellow -BackgroundColor Yellow ' ' }
'B' { Write-Host -NoNewline -ForegroundColor White -BackgroundColor White ' ' }
'D' { Write-Host -NoNewline -ForegroundColor Black -BackgroundColor Black ' ' }
'G' { Write-Host -NoNewline -ForegroundColor DarkGreen -BackgroundColor Green '*' }
'J' { Write-Host -NoNewline -ForegroundColor DarkGray -BackgroundColor Gray '''' }
'W' { Write-Host -NoNewline -ForegroundColor DarkBlue -BackgroundColor Blue '~' }
default { Write-Host -NoNewline -ForegroundColor Black -BackgroundColor White '$char' }
}
}
Write-Host
}
}
Game-Loop
Der Hauptteil ist um die Ausgabe der Welt zu ergänzen.
while($runGame)
{
Clear-Host
DrawMap
[...]
}