1

我正在尝试制作一批 roguelike,但我遇到了三个主要问题。首先,我的消息系统无法正常工作。其次有一个小故障,如果我试图移动到我不能选择的地方,那么选择语句会一直在底部写 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 有点困难。

第三也是最重要的是屏幕闪烁非常烦人。

闪烁主要是由于一个命令引起的。cls命令。在绘制新输出导致闪烁之前,它首先导致屏幕变黑,而不是仅仅重绘屏幕。

步骤 1:删除cls命令。这意味着您每次必须输出 30 行才能填满屏幕。

进一步减少闪烁将需要对脚本进行更大的检修。不用回显每一行,而是使用命令窗口的自然能力来换行以绘制整个屏幕。这将减少一对夫妇的回声呼叫量。您的画布设置为 54 x 30,因此等于 1620 个字符一次填满整个屏幕。

步骤 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 步:另一个有帮助的步骤是提高进程的优先级。我还在上面第二行的示例脚本中添加了这个。

于 2014-03-15T03:35:22.143 回答