我正在使用批处理脚本制作一个文本冒险游戏,我想知道是否有一种方法可以将其编程为在某一点自动保存。
我问这个,因为我最近读过一个 youtuber 曾经将他的一个RPG编码为自动保存,但他从未公开透露过它。
那么有没有办法让批量RPG /文本冒险发布自动保存?如果是这样,你怎么做?
答案 0 :(得分:2)
没有理由去追求别人对他们的真实方式的痴迷。与任何语言一样,批处理有其怪癖,但基本方法很常见。
使用程序语言,我几十年来一直遵循类似的结构。关键是只需要一个与用户交互的程序。然后程序的其余部分成为状态机,响应用户的输入从一个状态指向下一个状态。可能需要一点时间习惯,但我已经成功(并且很快)使用这个原则开发了批处理,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
退出`状态= 999999。我已经使用了数字用于各州,但这只是一个选择问题。
对于任何特定状态,您(可选)执行某些操作,然后设置提示消息(不要将其称为prompt
- 这是批处理关键字)和一组有效响应(vr
比valid_responses
更容易输入,然后转到:userio
程序(在接受回复后返回:mainloop
。
:userio
保存整个当前环境(因此具有“自动保存”功能),然后提示消息并获得响应。如果推送 enter ,Set /p
将保持response
不变,因此首先将response
设置为[nothing]将确保输入 doesn' t重复之前的回复。
我已选择替换用下划线输入的任何 space 字符 - 这使得处理更容易,因为您不必担心字符串中的空格(它不完整 - 逗号,制表符和分号;重定向器和&符号也可能有问题......)
接下来,如果用户输入退出或退出,则会分配退出状态。
否则,有效响应sting与收到的响应匹配。 vr
字符串只是
nextstate ifthisresponse nextstate ifthisresponse nextstate ifthisresponse nextstateotherwise
nextstateotherwise不需要出现,如果没有,则生成invalid response
消息并重新请求输入。
所以 - 从状态0开始,你的名字就被提前了,下一个状态将是100,无论如何。
State100将savefile
设置为用户的响应(名称),如果该文件存在,则将保存文件上记录的任何变量重新加载到环境中,将游戏恢复到上次程序{{{ 1}}编如果该文件不存在,那么您就有机会建立所需的任何游戏数据 - 我只是将变量EXIT
设置为例如。
State1000开始游戏。我刚刚为演示目的显示了example
的值。它应该以state100-no-savefile中建立的example
开头。
所以 - 你得到一个场景描述,建立提示信息,如果你的回答是(1 或一个),exampledata
将下一个状态定义为1001; 1002 for(2 或 2)......
选择1,2,3或4可切换到下一个状态; vr
字符串已更改,而且 - 我已强制state1000成为目标。你要做的就是跟随州1000的弹跳球。
现在 - 如果您键入example
,程序将结束。重新运行并键入相同的用户名,exit
的值将显示为最后建立的值,从保存文件中恢复。
作为一个小扩展,您可以添加example
系统 - 只需添加
help
在IF /i %response%==help call :help&goto useriolp
行之后。请注意,您可以使FOR %%r IN (EXIT quit) ...
例程具有上下文相关性,因为您具有值:help
来告诉您自己的位置。
同样,如果您愿意,可以实施state
系统,原则相同。
全部批量生产。根本不需要其他语言...... :)
答案 1 :(得分:0)
有许多分数,或许数百种语言比MS-DOS批处理脚本更适合冒险游戏。尝试Python,TCL,Lua,Java,C#或批处理以外的任何其他语言。面向对象语言通常用于幻想冒险游戏,因为它们能够很好地进行建模。具有持久性框架的语言(例如Hibernate)可能非常适合自动保存。但这往往涉及将数据存储在关系数据库中,这也有利于建模。但是不要试图一次咬掉太多。
因为你在思考框架中尝试使用非常简单的语言进行基于文本的游戏。你可能会用TCL做得很好。但正如我所说,有很多好的选择。批次不被视为其中之一。
答案 2 :(得分:0)
这实际上很简单,虽然它占用了大量空间,具体取决于您希望保存多少变量。您希望将另一个批处理文件与正在运行的批处理文件放在同一目录中。该批处理文件的标题可以是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
所以是的,这就是你如何自动保存游戏。