我正在使用批处理脚本制作文本冒险游戏,我想知道是否有办法对其进行编程以在某个时间点自动保存。
我问这个问题是因为我最近读到一位youtuber曾经将他的一个 RPG 编码为自动保存,尽管他从未公开透露过。
那么有没有办法让批量 RPG/文本冒险发布自动保存?如果是这样,你怎么做?
我正在使用批处理脚本制作文本冒险游戏,我想知道是否有办法对其进行编程以在某个时间点自动保存。
我问这个问题是因为我最近读到一位youtuber曾经将他的一个 RPG 编码为自动保存,尽管他从未公开透露过。
那么有没有办法让批量 RPG/文本冒险发布自动保存?如果是这样,你怎么做?
没有理由去追求别人对他们的独一真道的痴迷。像任何语言一样,批处理也有其怪癖,但基本的方法是常见的。
对于过程语言,几十年来我一直遵循类似的结构。关键是永远只有一个与用户交互的过程。然后程序的其余部分变成一个状态机,响应用户的输入从一个状态引导到下一个状态。可能需要一点时间来适应,但我已经成功(并且很快)在批处理、cobol、pascal、basic、progress、mantis 等中使用此原理开发了程序。
@ECHO OFF
SETLOCAL
SET state=0
SET "savefile="
:mainloop
CALL :state%state%
IF %state% neq 999999 GOTO mainloop
GOTO :EOF
::
:: USER I/O
::
:userio
IF NOT DEFINED savefile GOTO useriolp
set>%savefile%
:useriolp
SET "response="
SET /p response="%message% ? "
IF NOT DEFINED response GOTO useriolp
SET response=%response: =_%
FOR %%r IN (EXIT quit) DO IF /i %response%==%%r SET state=999999&GOTO :EOF
SET "state="
FOR %%r IN (%vr%) DO IF DEFINED state (
IF /i %%r==%response% GOTO :EOF
SET "state="
) ELSE (SET state=%%r)
IF DEFINED state GOTO :eof
ECHO Invalid response
GOTO useriolp
::State 0 - get username
:state0
SET "vr=100"
SET message=Your name
GOTO userio
:: State 100 - have username.
:: Load user's savefile if it exists
:state100
SET savefile=%response%
IF exist %savefile% GOTO S100.1
:: New game - initialise data
:: set start-state in STATE
SET example=exampledata
SET state=1000
GOTO :eof
:: Load game - including STATE
:S100.1
SET "state="
FOR /f "tokens=1*delims==" %%i IN (%savefile%) DO IF NOT defined %%i SET %%i=%%j
GOTO :eof
:: State 1000 - start game
:state1000
:: ** Just for a demo, show example as loaded from savefile
ECHO example=%example%
ECHO You see a shimmering blue-hued house with four doors numbered 1,2,3 and 4
SET "vr=1001 1 1002 2 1003 3 1004 4 1001 one 1002 two 1003 three 1004 four"
SET message=Which door do you choose
GOTO userio
:: State 1001 - door 1
:state1001
ECHO You see John Lodge
SET example=John Lodge
:: OK, from here, you're on your own. I'll force a state and loop
SET state=1000
GOTO :eof
:: State 1002 - door 2
:state1002
ECHO You see Graeme Edge
SET example=Graeme Edge
:: OK, from here, you're on your own. I'll force a state and loop
SET state=1000
GOTO :eof
:: State 1003 - door 3
:state1003
ECHO You see Justin Hayward
SET example=Justin Hayward
:: OK, from here, you're on your own. I'll force a state and loop
SET state=1000
GOTO :eof
:: State 1004 - door 4
:state1004
ECHO You see Ray Thomas
SET example=Ray Thomas
:: OK, from here, you're on your own. I'll force a state and loop
SET state=1000
GOTO :eof
通过上面的代码,你可以看到一个骨架。:mainloop
简单地建立一个“重复直到退出structure, where
EXIT”是 state=999999。我使用了各州的数字,但这只是一个选择问题。
对于任何特定状态,您(可选)做某事,然后设置一个提示消息(不要调用它prompt
- 这是一个批处理关键字)和一组有效响应(vr
比 更容易键入valid_responses
)然后转到:userio
过程(其中:mainloop
接受响应后返回。
:userio
保存整个当前环境(因此具有“自动保存”功能)然后提示消息并接受响应。如果被推送,Set /p
将response
保持不变,因此首先设置为 [nothing] 将确保不会重复之前的响应。enterresponse
enter
我选择space用下划线替换输入的任何字符 - 这使得处理更容易,因为您不必担心字符串中的空格(它不完整 - 逗号、制表符和分号;重定向器和 & 符号也可能有问题......)
接下来,如果用户输入EXIT或QUIT,则分配退出状态。
否则,valid-responses 字符串与收到的响应相匹配。字符串vr
很简单
nextstate ifthisresponse nextstate ifthisresponse nextstate ifthisresponse nextstateotherwise
nextstateotherwise 不需要出现,如果不需要,invalid response
则会生成一条消息并重新请求输入。
所以 - 从状态 0 开始,系统会提示您输入您的姓名,而下一个状态将是 100。
State100 设置savefile
为用户的响应(名称),如果该文件存在,则将保存文件中记录的任何变量重新加载到环境中,将游戏恢复到上次EXIT
编辑程序时的确切状态。如果该文件不存在,那么您就有机会建立您需要的任何游戏数据 - 我刚刚设置了一个变量example
作为 - 呃示例。
State1000 开始游戏。我刚刚展示了example
用于演示目的的价值。它应该exampledata
按照 state100-no-savefile 中的设置开始。所以 - 你得到一个场景描述,建立提示消息,如果你的响应是(1或一个),vr
则将下一个状态定义为 1001 ;1002(2或2)...
选择 1、2、3 或 4 会切换到下一个状态;字符串已example
更改,并且 - 好吧,我已强制 state1000 成为目的地。你要做的只是跟随 state1000 中的弹跳球。
现在 - 如果您键入exit
,程序结束。重新运行并输入相同的用户名, 的值example
将显示为上次建立的值,从保存文件中恢复。
作为一个小扩展,您可以添加一个help
系统 - 只需添加
IF /i %response%==help call :help&goto useriolp
行后FOR %%r IN (EXIT quit) ...
。请注意,您可以使:help
例程对上下文敏感,因为您有 的价值state
来告诉您您在哪里。
同样,如果你愿意,你可以实现一个look
系统,同样的原则。
都是批量的。根本不需要其他语言... :)
这实际上非常简单,尽管它会占用大量空间,具体取决于您希望保存多少变量。您希望在与您正在运行的批处理文件相同的目录中拥有另一个批处理文件。该批处理文件的名称可以是 save.bat、variables.bat 或其他名称。对于完成的每个操作,您希望它将变量保存到该批处理文件中。例如:
@echo off
call save.bat
:direction
cls
echo.
echo Would you like to
echo 1) go north
echo 2) go south
set /p answer=:
if %answer% equ 1 goto north
if %answer% equ 2 goto south
cls
echo.
echo That command isn't recognized.
echo.
pause
goto direction
:north
echo set /a money=%money%>>save.bat
echo set /a health=%health%>>save.bat
echo set /a mana=%mana%>>save.bat
cls
echo.
echo You head North.
echo.
pause
exit
:south
echo set /a money=%money%>>save.bat
echo set /a health=%health%>>save.bat
echo set /a mana=%mana%>>save.bat
cls
echo.
echo You head South.
echo.
pause
exit
您注意到它如何将变量保存到 save.bat,然后在游戏开始时调用该文件。>> 表示它正在向文件中添加新行。如果您只使用一个 > ,它将删除之前的所有内容,并将变量添加到文件中。尽管您必须在每次操作后保存变量,但这是值得的。如果你想节省空间,你可以这样做:
@echo off
call save.bat
:direction
cls
echo.
echo Would you like to
echo 1) go north
echo 2) go south
set /p answer=:
if %answer% equ 1 goto north
if %answer% equ 2 goto south
cls
echo.
echo That command isn't recognized.
echo.
pause
goto direction
:north
call autosave.bat
cls
echo.
echo You head North.
echo.
pause
exit
:south
call autosave.bat
cls
echo.
echo You head South.
echo.
pause
exit
在 autosave.bat 内部:
echo set /a money=%money%>>save.bat
echo set /a health=%health%>>save.bat
echo set /a mana=%mana%>>save.bat
所以,是的,这就是你可以自动保存游戏的方式。
与 MS-DOS 批处理脚本相比,有几十种甚至数百种语言更适合冒险游戏。尝试 Python、TCL、Lua、Java、C# 或批处理以外的任何其他语言。面向对象的语言通常用于幻想冒险游戏,因为它们能够很好地建模。具有持久性框架的语言(例如 Hibernate)可能对自动保存很方便。但这往往涉及将数据存储在关系数据库中,这也有利于建模。但不要试图一次咬掉太多。
由于您有尝试使用非常简单的语言的文本游戏的想法。你可能会在 TCL 上做得很好。但正如我所说,有很多不错的选择。批处理不被视为其中之一。