PowerShell Game 03

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
    
        [...]
    }