Advertisement
Guest User

Untitled

a guest
Sep 10th, 2020
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.53 KB | None | 0 0
  1.  
  2. Steuerung wsad:
  3.  
  4. @echo off
  5. chcp 65001 >nul
  6. setlocal enableDelayedExpansion
  7.  
  8.  
  9. :init
  10.  
  11.  
  12. rem die Dimensionierung des Speilfeldes muss nur einmal eingerichtet werden
  13. set "GameFieldDimensionY=10"
  14. set "GameFieldDimensionX=20"
  15. set /a "GameFieldSize=GameFieldDimensionX*GameFieldDimensionY"
  16. rem lineare Position des PositionsMarkers
  17. set "currentPos=1"
  18. rem so würde die Mitte festgelegt
  19. :::set /a "currentPos=GameFieldSize / 2"
  20. rem Spaltentrenner
  21. set "colDelimiter=|"
  22. rem Zeichen für leere Felder (oder Leerzeichen)
  23. set "emptyMarker=_"
  24. set "posMarker=X"
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31. rem Erklärung in der Subroutine
  32. call :initMacroGameField
  33.  
  34.  
  35. rem zum Anzeigen der initialisierten Variablen ::: entfernen
  36. :::set "field"
  37. :::set "macroDrawGameField"
  38. :::pause
  39.  
  40.  
  41. :GameLoop
  42. cls
  43. echo:
  44. %macroDrawGameField%
  45. :reask
  46. choice /c WSADx /n >nul
  47. rem richtungen: top,down,left,right
  48. if %errorlevel% equ 1 call :userMove -%GameFieldDimensionX%
  49. if %errorlevel% equ 2 call :userMove %GameFieldDimensionX%
  50. if %errorlevel% equ 3 call :userMove -1
  51. if %errorlevel% equ 4 call :userMove 1
  52. if %errorlevel% equ 5 goto verloren
  53. rem -1 wird wird von :userMove gesetzt (wenn nichts verändert wurde müssen wir auch nichts neu Schreiben)
  54. if %errorlevel% equ -1 goto :reask
  55. goto GameLoop
  56. pause
  57. exit /b
  58.  
  59.  
  60.  
  61.  
  62. ::::::::::::::::: Subroutinen ::::::::::::::::::::
  63.  
  64.  
  65. :verloren
  66. cls
  67. echo verloren
  68. pause
  69. exit /b
  70.  
  71.  
  72.  
  73.  
  74. :userMove
  75. set /a "newPos=currentPos+%1"
  76. rem einfach nur prüfen ob Zeile oder Spalte angesteuert wird (__dummy nur um evtl. das Vorzeichen zu entfernen)
  77. set "__dummy=%~1"
  78. if %__dummy:-=% lss %GameFieldDimensionX% (
  79. rem Zeilen überlauf/wrapp Vehindern aus der linearen Position die aktuelle und Neue Zeile berechnen (mehrere Berchnungen mit einem Set /a sind schneller)
  80. set /a "curY=(currentPos+GameFieldDimensionx-1) / GameFieldDimensionx , nwY=(newPos+GameFieldDimensionx-1) / GameFieldDimensionx "
  81. if !curY! equ !nwY! (
  82. rem wenn Gleiche Zeile, in alte Speicherzelle ein Leerfeld schreiben
  83. set "field!currentPos!=%colDelimiter%%emptyMarker%"
  84. rem und in die neue unseren Positionsmarker
  85. set "field!newPos!=%colDelimiter%%posMarker%"
  86. set "currentPos=!newPos!"
  87. exit /b 0
  88. )
  89. ) else (
  90. rem dito für Zeilenänderungen nur prüfen ob der Zeiger überhaupt noch im Array ist...
  91. rem (ein Goto habe ich aus Geschwindigkeitsgünden nicht setzen wollen, deshalhalb der gleiche Code in jedem if-Zweig)
  92. if !newPos! gtr 0 (
  93. if !newPos! leq %GameFieldSize% (
  94. set "field!currentPos!=%colDelimiter%%emptyMarker%"
  95. set "field!newPos!=%colDelimiter%%posMarker%"
  96. set "currentPos=!newPos!"
  97. exit /b 0
  98. )
  99. )
  100. )
  101. rem Dem Aufrufer per Errorlevel mitteilen das nichts verändert wurde (0 und Negative werden garantiert nicht von Choice generiert)
  102. exit /b -1
  103.  
  104.  
  105.  
  106.  
  107. rem hier musst Du nichts mehr verändern
  108. :initMacroGameField
  109. rem Zeilenvorschub in einer Variable, Bei DelayeExpansion werwende !LFD! sonst %LF% (außer innerhalb einer Variablenzuweisung, dann !LF!)
  110. rem das ganze ist etwas Tricky (gegebenenfalls hilft einfach mal Probieren was wann funktioniert)
  111. (set LFD=^
  112. %=this line is empty=%
  113. )
  114. set LF=^^^%LFD%%LFD%^%LFD%%LFD%
  115.  
  116.  
  117. rem es wird Automatisch ein Macro erzeugt, welches das Spielfeld anzeigt egal wo und wann
  118. rem auch Batch eigentlich keine Zeiger (Pointer) kennt kann mann durch geschicktes maskieren von Variablen, diese simulieren
  119. rem Im Ergebnis enthällt die MacroVariable dann die Zeile: echo !field1!!field2!!field3!!field4!....
  120. rem die Variablen werden erst bei Ausführung aufgelöst (DelayedExpansion).
  121. rem die Vorteile: erzeugt automatisch das gesammte Spielfeld als abrufbares Macro, die ZeichenRoutine muss nicht für jeden Fall neu geschrieben werden.
  122. rem ..., Die Steuerung der Darstellungen erfolgt allein über Variablen, das schreiben erfolgt bis Anzahl der Zeilen schneller als einzelne echo-Aufrufe...
  123. 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
  124.  
  125.  
  126. rem echo in Macro schreiben
  127. set "macroDrawGameField=echo "
  128. for /l %%Y in (1,1,%GameFieldDimensionY%) do (
  129. for /l %%X in (1,1,%GameFieldDimensionX%) do (
  130. rem aus X und Y lineare Adresse für PseudoArray field berechnen...
  131. set /a "__num=(%%Y-1)*GameFieldDimensionX+%%X"
  132. rem Trennzeichen und Marker für Leeres Feld in ArrayZelle schreiben
  133. set "field!__num!=^%colDelimiter%%emptyMarker%"
  134. rem String zB. !field1! an macro anhängen die Carrets^ verhindern, dass die Ausrufezeichen sofort als Steuerzeichen ausgewertet werden
  135. set "macroDrawGameField=!macroDrawGameField!^!field!__num!^!"
  136. )
  137. if !__num! lss %GameFieldSize% (
  138. 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 )
  139. set "macroDrawGameField=!macroDrawGameField!^^%colDelimiter%!LF!"
  140. ) else (
  141. rem an die Letzte Zeile kein Zeilenvorschub
  142. set "macroDrawGameField=!macroDrawGameField!^^%colDelimiter%"
  143. )
  144. )
  145. rem letzten Endes noch den Marker für die aktuelle Position an die Startpossition schreiben...(hat aber nichts mit dem Macro selbst zu tun)
  146. set "field!currentPos!=^%colDelimiter%%posMarker%"
  147. exit /b
  148. :: Ende initMacroGameField
  149.  
  150.  
  151.  
  152.  
  153.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement