Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Steuerung wsad:
- @echo off
- chcp 65001 >nul
- setlocal enableDelayedExpansion
- :init
- rem die Dimensionierung des Speilfeldes muss nur einmal eingerichtet werden
- set "GameFieldDimensionY=10"
- set "GameFieldDimensionX=20"
- set /a "GameFieldSize=GameFieldDimensionX*GameFieldDimensionY"
- rem lineare Position des PositionsMarkers
- set "currentPos=1"
- rem so würde die Mitte festgelegt
- :::set /a "currentPos=GameFieldSize / 2"
- rem Spaltentrenner
- set "colDelimiter=|"
- rem Zeichen für leere Felder (oder Leerzeichen)
- set "emptyMarker=_"
- set "posMarker=X"
- rem Erklärung in der Subroutine
- call :initMacroGameField
- rem zum Anzeigen der initialisierten Variablen ::: entfernen
- :::set "field"
- :::set "macroDrawGameField"
- :::pause
- :GameLoop
- cls
- echo:
- %macroDrawGameField%
- :reask
- choice /c WSADx /n >nul
- rem richtungen: top,down,left,right
- if %errorlevel% equ 1 call :userMove -%GameFieldDimensionX%
- if %errorlevel% equ 2 call :userMove %GameFieldDimensionX%
- if %errorlevel% equ 3 call :userMove -1
- if %errorlevel% equ 4 call :userMove 1
- if %errorlevel% equ 5 goto verloren
- rem -1 wird wird von :userMove gesetzt (wenn nichts verändert wurde müssen wir auch nichts neu Schreiben)
- if %errorlevel% equ -1 goto :reask
- goto GameLoop
- pause
- exit /b
- ::::::::::::::::: Subroutinen ::::::::::::::::::::
- :verloren
- cls
- echo verloren
- pause
- exit /b
- :userMove
- set /a "newPos=currentPos+%1"
- rem einfach nur prüfen ob Zeile oder Spalte angesteuert wird (__dummy nur um evtl. das Vorzeichen zu entfernen)
- set "__dummy=%~1"
- if %__dummy:-=% lss %GameFieldDimensionX% (
- rem Zeilen überlauf/wrapp Vehindern aus der linearen Position die aktuelle und Neue Zeile berechnen (mehrere Berchnungen mit einem Set /a sind schneller)
- set /a "curY=(currentPos+GameFieldDimensionx-1) / GameFieldDimensionx , nwY=(newPos+GameFieldDimensionx-1) / GameFieldDimensionx "
- if !curY! equ !nwY! (
- rem wenn Gleiche Zeile, in alte Speicherzelle ein Leerfeld schreiben
- set "field!currentPos!=%colDelimiter%%emptyMarker%"
- rem und in die neue unseren Positionsmarker
- set "field!newPos!=%colDelimiter%%posMarker%"
- set "currentPos=!newPos!"
- exit /b 0
- )
- ) else (
- rem dito für Zeilenänderungen nur prüfen ob der Zeiger überhaupt noch im Array ist...
- rem (ein Goto habe ich aus Geschwindigkeitsgünden nicht setzen wollen, deshalhalb der gleiche Code in jedem if-Zweig)
- if !newPos! gtr 0 (
- if !newPos! leq %GameFieldSize% (
- set "field!currentPos!=%colDelimiter%%emptyMarker%"
- set "field!newPos!=%colDelimiter%%posMarker%"
- set "currentPos=!newPos!"
- exit /b 0
- )
- )
- )
- rem Dem Aufrufer per Errorlevel mitteilen das nichts verändert wurde (0 und Negative werden garantiert nicht von Choice generiert)
- exit /b -1
- rem hier musst Du nichts mehr verändern
- :initMacroGameField
- rem Zeilenvorschub in einer Variable, Bei DelayeExpansion werwende !LFD! sonst %LF% (außer innerhalb einer Variablenzuweisung, dann !LF!)
- rem das ganze ist etwas Tricky (gegebenenfalls hilft einfach mal Probieren was wann funktioniert)
- (set LFD=^
- %=this line is empty=%
- )
- set LF=^^^%LFD%%LFD%^%LFD%%LFD%
- rem es wird Automatisch ein Macro erzeugt, welches das Spielfeld anzeigt egal wo und wann
- rem auch Batch eigentlich keine Zeiger (Pointer) kennt kann mann durch geschicktes maskieren von Variablen, diese simulieren
- rem Im Ergebnis enthällt die MacroVariable dann die Zeile: echo !field1!!field2!!field3!!field4!....
- rem die Variablen werden erst bei Ausführung aufgelöst (DelayedExpansion).
- rem die Vorteile: erzeugt automatisch das gesammte Spielfeld als abrufbares Macro, die ZeichenRoutine muss nicht für jeden Fall neu geschrieben werden.
- rem ..., Die Steuerung der Darstellungen erfolgt allein über Variablen, das schreiben erfolgt bis Anzahl der Zeilen schneller als einzelne echo-Aufrufe...
- rem Nachteil: In dieser Form idt die Anzahl der Felder auf maximal 818 beschränkt. (Batch-Befehlslänge =8191 Zeichen) könnte man jedoch durch verteilen auf mehrere Macros fixen
- rem echo in Macro schreiben
- set "macroDrawGameField=echo "
- for /l %%Y in (1,1,%GameFieldDimensionY%) do (
- for /l %%X in (1,1,%GameFieldDimensionX%) do (
- rem aus X und Y lineare Adresse für PseudoArray field berechnen...
- set /a "__num=(%%Y-1)*GameFieldDimensionX+%%X"
- rem Trennzeichen und Marker für Leeres Feld in ArrayZelle schreiben
- set "field!__num!=^%colDelimiter%%emptyMarker%"
- rem String zB. !field1! an macro anhängen die Carrets^ verhindern, dass die Ausrufezeichen sofort als Steuerzeichen ausgewertet werden
- set "macroDrawGameField=!macroDrawGameField!^!field!__num!^!"
- )
- if !__num! lss %GameFieldSize% (
- rem an jedes Zeilenend ein das Trennzeichen eine Zeilenvorschub anhängen (die Carrets stellen sicher, das man auch Sonderzeichen in das Makro einfügen kann )
- set "macroDrawGameField=!macroDrawGameField!^^%colDelimiter%!LF!"
- ) else (
- rem an die Letzte Zeile kein Zeilenvorschub
- set "macroDrawGameField=!macroDrawGameField!^^%colDelimiter%"
- )
- )
- rem letzten Endes noch den Marker für die aktuelle Position an die Startpossition schreiben...(hat aber nichts mit dem Macro selbst zu tun)
- set "field!currentPos!=^%colDelimiter%%posMarker%"
- exit /b
- :: Ende initMacroGameField
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement