2017-02-02 7 views
0

私はRPGゲームを作っていて、旅行先を選択したこのマップシステムを持っていて、移動ごとに1つのタイルを移動します。一文字の行を一括置換する

私は、プレイヤーがどこにあるのか私のマップ上にどのように表示することができるのだろうと思います。 より具体的には、2つの変数があります。 posXおよびposY。行posYの文字「posX」を、そのプレイヤーを表す新しい文字で置き換えたいとします。

私はvariable:~int,intを使用して行を編集しようとしましたが、行の長さが違うため動作しませんでした。

EDIT:これは私が下で取り組んでいるコードです。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 
+0

このゲームをバッチファイルとして書いている理由は何ですか?あなたが考えることができる他のほとんどの言語を選ぶことは、それをより簡単にするでしょう。 –

+3

個人的には、言語を学ぶのは良い方法だと思うし、それもクールだと思う。どうして? –

+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 "[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 

あなたは、あなたの状況に合わせてsourcedirの設定を変更する必要があります。

テスト用にデータが入っているq42009080.txtというファイルを使用しました。

マップファイルは、 dをfindstrに入力し、すべての行を検索します。 /nは、delims=:と解析し、トークン1*を使用して、の行番号との行番号を入れて、sequencenumber:の各行に接頭辞を付けます。

行番号がposyと一致しない場合は、単に行テキストを実行します。一致する場合は、lineにテキストを転送し、メタ変数の部分文字列は使用できません。posxの文字をmeに置き換え、3つの必要な部分文字列を連結して結果を実行します。

このルーチンは、変更値が必要な場合に使用される唯一の値であるdelayedexpansion - lineを使用することに注意してください。 %repl%,%me%および%tail%は、その時の電流値によって解析されるときに置き換えられるので、ブロック内でreplが変更されるという事実は、コードが元の値のreplで動作している瞬間ではありません。

もちろん、replは、行に置き換えられる文字を受け取るために使用することは重要ではありません。 (line以外の)任意の通常の変数が選択されている可能性があります - 私は、将来の読者のための「オリジナルの価値」概念を実証しています...

関連する問題