批量替换单个字符

时间:2017-02-02 17:52:34

标签: batch-file

我正在制作一个RPG游戏并获得这个地图系统,您可以在其中选择一个旅行目的地,并且每次移动时移动一个更接近它的地块。

我想知道的是我如何在我的地图上显示玩家所在的地方。 更具体地说,我有两个变量; posXposY。并希望用代表玩家的新角色替换posY,角色posX上的角色。

我尝试使用variable:~int,int编辑一行,但这些行的长度不同,因此不起作用。

编辑:这是我在下面一直在处理的代码,我认为IF !vertical!==!downY!永远不会是真的,pause调用是用于测试的。

: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

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.+---------------------------------------------------------------------+

这段代码打印地图:

: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

1 个答案:

答案 0 :(得分: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 "me=@"
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

您需要更改sourcedir的设置以适合您的具体情况。

我使用了一个名为q42009080.txt的文件,其中包含我的测试数据。

地图文件type进入findstr,其参数可以找到每一行。使用/n找到的每一行都会sequencenumber:作为前缀,因此使用delims=:解析并使用令牌1*会将行号放在%%a%%b中的行文字。

如果行号与posy不匹配,则只需执行行文本。如果匹配,则将文本传输到line,因为您可以对元变量进行子字符串,然后将posx个字符替换为me,将所需的三个字符连接起来子串并执行结果。

请注意,此例程使用delayedexpansion - line是在需要更改值时使用的唯一值。 %repl%%me%%tail%将在其当前值解析for/f时被替换,因此repl在块内被更改的事实因为代码使用的是repl的原始值。

当然,repl用于接收线路上替换的角色并不重要。可以选择任何正常变量(line除外) - 我只是展示了原始值&#34;未来读者的概念......