2017-02-02 10 views
0

Ich mache ein RPG-Spiel und bekam dieses Kartensystem, wo Sie ein Reiseziel auswählen, und Sie bewegen eine Kachel näher an es pro Zug.Batch ersetzen einzelnes Zeichen in der Zeile

Ich frage mich, wie ich auf meiner Karte anzeigen kann, wo der Spieler ist. genauer gesagt habe ich zwei Variablen; posX und posY. und möchte das Zeichen in Zeile posY, Zeichen posX durch ein neues Zeichen ersetzen, das den Player darstellt.

Ich habe versucht mit variable:~int,int eine Zeile zu bearbeiten, aber die Zeilen haben unterschiedliche Längen, so dass nicht funktioniert.

EDIT: Dies ist der Code, an dem ich unten gearbeitet habe, die IF !vertical!==!downY! ist nie wahr, ich denke, die pause Anrufe sind zum Testen.

:DisplayPlayerPos 
set /a vertical=27 
set /a horizontal=69 
set /a downY=%vertical%-%posY% 
FOR /F "tokens=*" %%L IN (SaveGames\Default\World\Color\WorldMap.txt) DO (
    set /a vertical=!vertical!-1 
    IF !vertical!==!downY! (
     set left=%%L:~-!%horizontal%-%posX%! 
     echo !left! 
     set right=%%L:~!posX! + 1 
     echo !right! 
     set newLine=!%left%X%right%! 
     echo. !newLine! 
     pause 
     Exit /b 
    ) 
) 
pause 
Exit /b 

Die map.txt:

echo.+---------------------------------------------------------------------+ =========// Travel Map //========= 
echo.| 8obo.8:.,-!!::;.::P"-8:,.-P':_,./=,.oodoo-**       | World: !worldName! 
echo.|-+-----+;-+.+++++-+./-::\8-;-8P::P8bP/'        | Region: Far West 
echo.|,8-+---++++-++++++//`=/---_,`:8b8\Y::8....  SENTO    | 
echo.|++-;-'8:`--;`-+++-=:-'  `+.::\_/\--'   X     | !travelTarget! Position: !travelX!,!travelY!; 
echo.|<[/--"--"-::'''+''= GWEN +`+-U'        | Your position: !posX!,!posY!; 
echo.|,// `'"+=/Y=--'+\ FOREST |:/'|         | 
echo.|`8b.  ' '|8P\L|,`.  /|/ :b         | 
echo.||\'b    \\\++'+++-,+'+'---/         | 
echo.|XX8'    ``:-.--+/-._.+-_,\         | 
echo.| "'     /'-+-.``-8+-:dop.        | 
echo.|      '-'++--+-:         | 
echo.|      `-\:"\\'-P>_         | 
echo.|        Y"\=="'     ,-.   | 
echo.|  X THORM          / `.  _.-| 
echo.|          ,--.  /+-. `---''---| 
echo.|          ,-' `-------'/ `-+ -`---'| 
echo.|         ,-' ,. LOGAN  _-'  `----. | 
echo.|        ,' ,-' ; RIVER ,-''    `| 
echo.|       ,--' ,' ; ,---'      | 
echo.|       ,-' ,'  ; /      | 
echo.|      -/ +---'  ,' ,'       | 
echo.|      / `-------' ,'        | 
echo.|      ,' ,----------' X       | 
echo.|     ,' +-'     BENDANIA     | 
echo.|    /,'            | 
echo.|     | ,/            | 
echo.|     ; /;            | 
echo.+---------------------------------------------------------------------+ 

Und dieser Ausschnitt der Karte drucken:

:PrintColorFile 
set ColorEx= 
if /i "%Colors%"=="True" set ColorEx=C 
for /F "tokens=*" %%A in (SaveGames\%saveName%\World\Color\%1%ColorEx%.txt) do %%A 
Exit /b 
+0

Irgendein Grund, den du dieses Spiel als eine Stapeldatei schreibst? Das Auswählen von fast jeder anderen Sprache, die dir einfällt, würde es einfacher machen. –

+3

Ich persönlich denke, es ist ein guter Weg, um die Sprache zu lernen, ich denke auch, dass es cool ist. Warum? –

+0

Ich habe nur darauf hingewiesen, dass das, was du machst, ungewöhnlich ist und wahrscheinlich frustrierend wird, wenn du gegen die Syntax kämpfst ...Es gibt Gründe, warum die meisten textbasierten Spiele nicht als Batch-Skripte geschrieben werden. Aber als Lernübung ist es wahrscheinlich ideal. –

Antwort

1
@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir" 
SET "filename1=%sourcedir%\q42009080.txt" 
:: some random positions 
SET posy=7 
SET posx=14 
:: Add 4 to posx to compensate for "echo." and count-from-0 not 1 
SET /a repl=posx+4 
SET /a tail=repl+1 
SET "[email protected]" 
FOR /f "tokens=1*delims=:" %%a IN ('type "%filename1%" ^|findstr /n "e" ') DO (
IF %%a==%posy% (
    SET "line=%%b" 
    REM just for fun - set `repl` to the character replaced in line 
    SET "repl=!line:~%repl%,1!" 
    SET "line=!line:~0,%repl%!%me%!line:~%tail%!" 
    !line! 
) ELSE (%%b) 
) 
ECHO replaced "%repl%" 
GOTO :EOF 

Sie müssten die Einstellung von sourcedir zu ändern, um Ihre Umstände anzupassen .

Ich habe eine Datei namens q42009080.txt verwendet, die Ihre Daten für meine Tests enthält.

Die Map-Datei ist type d in findstr mit einem Parameter, der jede Zeile finden wird. Der /n Präfix jeder Zeile mit sequencenumber: so Parsing mit delims=: und Tokens verwenden 1 und * wird die Zeilennummer in %%a und die Zeile Text in %%b.

Wenn die Zeilennummer nicht mit posy übereinstimmt, führen Sie einfach den Linientext aus. Wenn dies der Fall ist, übertragen Sie den Text an line, da Sie Metavariablen nicht partitionieren können. Ersetzen Sie dann das posx 'te Zeichen durch me durch Verketten der drei erforderlichen Teilstrings und führen Sie das Ergebnis aus.

Beachten Sie, dass diese Routine delayedexpansion - line den einzigen Wert verwendet, der verwendet wird, wenn der Wert geändert werden muss. %repl%, %me%%tail% und werden ersetzt, wenn die durch ihre for/f dann aktuellen Werte analysiert wird, so dass die Tatsache, dass repl innerhalb des Blockes ist von keinem Moment geändert wird, wie der Code mit dem ursprünglichen Wert von repl arbeiten.

Natürlich ist es nicht kritisch, dass repl verwendet wird, um das Zeichen zu erhalten, das in der Zeile ersetzt wird. jede normale Variable (anders als line) hätte gewählt werden können - ich demonstriere gerade das Konzept der "ursprünglichen Werte" für zukünftige Leser ...

Verwandte Themen