1

ローグライクのバッチを作成しようとしていますが、3 つの主な問題に直面しています。まず、メッセージ システムが機能していません。次に、移動できない場所に移動しようとすると、選択ステートメントの一番下に W、S、A、および D が書き続けられるという問題があります。第三に、最も重要なことは、画面の点滅が非常に煩わしいことです。ロードにかかる時間を最小限に抑えようとしましたが、役に立ちませんでした。これが私のコードです:

@echo off 
setlocal enableextensions
mode con: cols=54 lines=30
set num=1
set nextVar=1
set oldVar=103
set message=a
cls 
echo Loading...
:startup
if not %num%==1001 (
set b%num%=.
set /a num = %num% + 1
goto startup
)
cls
set b103=@
goto update

:update 
choice /c wsad /n /m ""
if %errorlevel%==1 set /a nextVar = %oldVar% - 50 
if %errorlevel%==2 set /a nextVar = %oldVar% + 50 
if %errorlevel%==3 set /a nextVar = %oldVar% - 1 
if %errorlevel%==4 set /a nextVar = %oldVar% + 1  
if defined b%nextVar% (
set b%nextVar%=@
set b%oldVar%=.
set oldVar=%nextVar%
set message="a"
goto display
)
set message="You can not move there."
goto update

:display
set ln1=%b1%%b2%%b3%...
set ln2=%b51%%b52%%b53%... 
set ln3=%b101%%b102%... 
...
...
...
set ln8=%b351%%b352%... 
set ln18=%b851%%b852%%b853% 
set ln19=%b901%%b902%%b903%%b904%... 
set ln20=%b951%%b952%%b953%%b954%%b955%%b956%...%b1000%
cls
if not "%message%"=="a" (
echo %message%
goto next
)
echo.
:next
echo.
echo %ln1%
echo %ln2%
echo %ln3%
echo %ln4%
echo %ln5%
echo %ln6%
echo %ln7%
echo %ln8%
echo %ln9%
echo %ln10%
echo %ln11%
echo %ln12%
echo %ln13%
echo %ln14%
echo %ln15%
echo %ln16%
echo %ln17%
echo %ln18%
echo %ln19%
echo %ln20%
echo.
goto update 

スペースを節約するためにいくつかのセクションが必要でした。誰かが特にこれらの問題を解決できる場合、画面の点滅は非常に役立ちます. また、ダンジョンのような NetHack の生成に関するアイデアをお持ちの方も歓迎します。ありがとうございました。

4

1 に答える 1

1

したがって、問題 1 と 2 は関連しています。

まず、メッセージ システムが機能していません。次に、移動できない場所に移動しようとすると、選択ステートメントが W、S、A、および D を一番下に書き続けるという不具合があります。

更新セクションのエラーgotoステートメントを変更します。画面が再描画され (古い使用済みの選択プロンプトが削除され)、エラー メッセージが表示されるように、表示セクションに移動します。

set message="You can not move there."
goto display

問題 3 は、バッチの性質上、少し難しくなります。

第三に、最も重要なことは、画面の点滅が非常に煩わしいことです。

点滅は、主に 1 つのコマンドが原因で発生します。clsコマンド。画面を再描画するだけでなく、最初に画面が黒くなり、新しい出力が描画されてちらつきが発生します。

ステップ 1:コマンドを削除しclsます。これは、画面を埋めるために毎回 30 行を出力する必要があることを意味します。

ちらつきをさらに減らすには、スクリプトを大幅に変更する必要があります。各行をエコーする代わりに、コマンド ウィンドウの自然な機能を使用して、行を折り返して画面全体を描画します。これにより、カップルへのエコー コールの量が減少します。キャンバスは 54 x 30 に設定されているため、一度に画面全体を埋めるには 1620 文字に相当します。

ステップ 2:描画/スクロールの遅延を防ぎ、コンソール ウィンドウの自然な行折り返し機能を使用するために、1 回またはできるだけ少ない呼び出しで画面全体を出力します。

この 2 番目のステップを説明するためにまとめた例を次に示します。ご不明な点がございましたら、お知らせください。

@echo off
( if "%~1"=="" start "" /HIGH %0 1 & exit /b 1 )
setlocal enabledelayedexpansion
mode con: cols=80 lines=25
set "mark=0"
set "switch=0"

:next
if %mark% geq 920 set "mark=0" & if %switch% equ 0 ( set "switch=1" ) else set "switch=0"
set top=........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
set bot=........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
if %switch% equ 0 set top=!top:~0,%mark%!^|!top:~%mark%!
if %switch% equ 1 set bot=!bot:~0,%mark%!^|!bot:~%mark%!
goto display

:display
echo %mark%
set /p "=%top:~0,920%" <nul
set /p "=%bot:~0,920%" <nul
ping 192.0.2.2 -n 1 -w 200 >nul
set /a mark+=1
goto next

ステップ 3:役立つ追加のステップは、プロセスの優先度レベルを上げることです。これを上記のサンプル スクリプトの 2 行目に追加しました。

于 2014-03-15T03:35:22.143 に答える