我有一个我正在创建的RPG的游戏屏幕:
:OBJ1
CLS
echo.
echo.
echo The tiger rolls down the steep hill...
echo What do you do?
echo.
echo.
CHOICE /c abc /n /m ">"
IF %errorlevel%==1 (GOTO ATTACK)
IF %errorlevel%==2 (GOTO WALK)
IF %errorlevel%==3 (GOTO COLLECT)
如您所知,一旦您选择一个选项,它就会转到另一个屏幕。在该屏幕之后,您可以选择另一个选项。还有另一个。我有许多类似的代码,每个代码都有不同的情况。我想知道不是为每种情况添加一个用于暂停的选择"q",是否有办法全局检测何时按下字母"q"。
因此,无论屏幕如何,如果您按"q",它都会立即进入暂停菜单。
非常感谢:)
这里有一个小演示:
@ECHO Off
SETLOCAL
SET Posx=15
SET Posy=15
SET Posz=0
CALL :choose awc "ATTACK:Attack" "WALK:Walk" "COLLECT:Collect"
ECHO Jump to %jumpto% as choice made was %choicemade%
CALL :choose eds "EAT:Eat Ration" "DRINK:Drink Potion" "SLEEP:Sleep"
ECHO Jump to %jumpto% as choice made was %choicemade%
CALL :choose news "NORTH:Go North" "EAST:Go East" "SOUTH:Go South" "WEST:Go West"
ECHO Jump to %jumpto% as choice made was %choicemade%
ECHO ---------------------------------------------------
CALL :choose news "GO 0 1:Go North" "GO 1 0:Go East" "GO -1 0:Go West" "GO 0 -1:Go South"
ECHO CALL :%jumpto% as choice made was %choicemade%
CALL :%jumpto%
CALL :choose news "GO 0 1:Go North" "GO 1 0:Go East" "GO -1 0:Go West" "GO 0 -1:Go South"
ECHO CALL :%jumpto% as choice made was %choicemade%
CALL :%jumpto%
CALL :choose newsd "GO 0 1:Go North" "GO 1 0:Go East" "GO -1 0:Go West" "GO 0 -1:Go South" "GO 0 0 1:Down Stairs"
ECHO CALL :%jumpto% as choice made was %choicemade%
CALL :%jumpto%
GOTO :EOF
:: Move in a direction
:GO
ECHO Current position: %posx% %posy% AT level %posz%
SET /a posx+=%1
SET /a posy+=%2
SET /a posz+=%3+0
ECHO Current position: %posx% %posy% AT level %posz%
:: set ERRORLEVEL to 0
CD .
CALL :enc_%posx%_%posy%_%posz% 2>nul
GOTO :eof
:: Encounter at 16,14,1
:enc_16_14_1
ECHO it's dark
GOTO :eof
:choose
SETLOCAL enabledelayedexpansion
SET "params=%*"
SET "choices=q%1qx"
:chooseloop
SET /a choicemade=0
FOR %%Z IN (%params% " :Pause" "ENDGAME:Exit Game") DO (
FOR /f "tokens=1*delims=:" %%X IN ("%%~Z") DO (
IF !choicemade! neq 0 (
CALL ECHO %%choices:~!choicemade!,1%% %%Y
SET "jumpto!choicemade!=%%X"
)
SET /a choicemade +=1
)
)
choice /c %choices:~1% /n /m ">"
SET "jumpto=!jumpto%errorlevel%!"
SET "choicemade=!choices:~%errorlevel%,1!"
IF NOT "%choicemade%"=="q" GOTO exitchoose
:: pause code
PAUSE
GOTO chooseloop
:exitchoose
endlocal&SET "jumpto=%jumpto%"&SET "choicemade=%choicemade%"
GOTO :eof
我不明白为什么你需要一个pause
函数。 批处理将暂停,直到您在任何情况下操作密钥。
:choose
子例程采用n
参数。第一个是有效键的列表(q 和 x 由例程添加(,其余部分按指定有效键的顺序"destination-data: prompt-text"
。
变量choices
设置为指定的选项,加上末尾的q
和x
(因为它们始终有效(加上开头的额外q
。我把这个额外的字符放进去,因为批量子字符串从"字符 0"开始计数,而由choice
建立的errorlevel
从1
计数。
:chooseloop
回显来自choices
的 1 个字符的子字符串,具体取决于choicemade
它只是一个计数器。我们不想在params
中显示第一个参数,所以从choicemade=1
开始,显示从第choicemade
个字符开始的一个字符的字符串和菜单文本,然后设置jumpto1
.。jumpton
到目标数据。
做出选择,设置errorlevel
.
使用errorlevel
将jumpto
设置为jumpto1
中的目标数据。根据需要jumpton
,并将choicemade
设置为实际的选择信。
现在,如果选择字母没有q
,我们需要返回到调用者,但如果是q
,我们执行暂停,并返回到:chooseloop
以重复菜单生成和choice
条目。
如果选择字符不q
,我们只需终止本地环境并设置jumpto
,choicemade
为主例程做好准备。
如果您运行演示,您会发现jumpto
包含目标数据。你可以直接使用它,或者你可以有点鬼鬼祟祟。
请注意,从第 4 个演示开始,将执行CALL :%jumpto%
。:GO
例程接受两个参数(可选 3(以在地图上移动 x,y[,z]。
:GO
例程只是将第一个参数添加到posx
,将第二个参数添加到posy
。第三个参数可能存在,也可能不存在,因此添加0
以满足set /a
语法。我已经报告了x,y,z位置之前和之后。
现在移动后,我们将errorlevel
设置为使用cd .
0
,然后尝试调用:enc_%posx%_%posy%_%posz%
即称为enc_thecubeyouarelocatedin
的内部子例程。这可能存在,也可能不存在。如果存在,它将被执行。如果没有,cmd
将仅发出一条错误消息,2>nul
可以禁止该错误消息,并将errorlevel
设置为1
。请注意,goto nonexistenetlabel
将退出程序并生成一条讨厌的消息。
通过这种方式,可以处理特定位置的特价,但最终它将全部返回到执行call :GO...
的原始位置
如果您正在寻找加载/保存游戏的方法,请尝试以下操作: https://stackoverflow.com/a/50639536/2128947