Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Text 自动保存基于批处理的文本冒险游戏?_Text_Batch File_Autosave_Adventure - Fatal编程技术网

Text 自动保存基于批处理的文本冒险游戏?

Text 自动保存基于批处理的文本冒险游戏?,text,batch-file,autosave,adventure,Text,Batch File,Autosave,Adventure,我正在使用批处理脚本制作一个文本冒险游戏,我想知道是否有办法对其进行编程,以便在某一点自动保存。 我问这个问题是因为我最近读到一个youtuber曾经将他的一个RPG编码为autosave,尽管他从未公开披露过 那么有没有办法让批量RPG/text adventure发布autosaves?如果是,你怎么做 与MS-DOS批处理脚本相比,许多语言(可能有数百种)更适合冒险游戏。尝试Python、TCL、Lua、Java、C#或批处理之外的任何其他语言。面向对象的语言通常用于幻想冒险游戏,因为它们

我正在使用批处理脚本制作一个文本冒险游戏,我想知道是否有办法对其进行编程,以便在某一点自动保存。
我问这个问题是因为我最近读到一个youtuber曾经将他的一个RPG编码为autosave,尽管他从未公开披露过


那么有没有办法让批量RPG/text adventure发布autosaves?如果是,你怎么做

与MS-DOS批处理脚本相比,许多语言(可能有数百种)更适合冒险游戏。尝试Python、TCL、Lua、Java、C#或批处理之外的任何其他语言。面向对象的语言通常用于幻想冒险游戏,因为它们能够很好地建模。使用带有持久性框架的语言(如Hibernate)进行自动保存可能很方便。但这往往涉及将数据存储在关系数据库中,这也有利于建模。但不要一次咬太多


因为你正在尝试一个基于文本的游戏,用一种非常简单的语言。您可能会很好地使用TCL。但正如我所说,有很多好的选择。巴奇不被认为是他们中的一员。

没有理由为了追求其他人对他们唯一真实方式的痴迷而去分享。与任何语言一样,batch也有其独特之处,但基本的方法是通用的

对于过程语言,我几十年来一直遵循类似的结构。关键是只需要有一个与用户交互的过程。程序的其余部分随后成为一个状态机,根据用户的输入从一个状态指向下一个状态。这可能需要一点时间来适应,但我已经成功地(并且很快地)开发了批处理、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只是建立一个“重复直到退出”结构,其中exit`是state=999999。我用过各州的数字,但那只是选择的问题

对于任何特定的状态,您(可选地)执行一些操作,然后设置一条提示消息(不要称之为
prompt
——这是一个批处理关键字)和一组有效响应(
vr
valid\u responses
)然后转到
:userio
过程(在接受响应后返回到
:mainloop

:userio
保存整个当前环境(因此具有“自动保存”功能),然后提示消息并接收响应。
Set/p
如果按enter键,将保持
response
不变,因此将
response
设置为[无]first将确保enter不会重复前面的响应

我选择用下划线替换输入的任何空格字符-这使处理更容易,因为您不必担心字符串中的空格(它不完整-逗号、制表符和分号;重定向器和符号也可能有问题…)

接下来,如果用户进入退出或退出,则分配退出状态

否则,有效的响应将与接收到的响应匹配。
vr
字符串

nextstate ifthisresponse nextstate ifthisresponse nextstate ifthisresponse nextstateotherwise
NextStateOther不需要显示,如果不显示,将生成
无效响应
消息,并重新请求输入

所以-从0州开始,你将被提示输入你的名字,下一个州将是100

State100将
savefile
设置为用户的响应(名称)如果该文件存在,保存文件上记录的任何变量都会重新加载到环境中,将游戏恢复到上次程序退出时的精确状态。如果该文件不存在,则您有机会建立所需的任何游戏数据-我刚刚设置了一个变量
示例
,作为示例e

State1000启动游戏。我刚刚展示了
example
的值,用于演示。它应该以state100中建立的
exampledata
开始。无保存文件。 因此-如果您的响应是(1或1),您将获得场景描述,建立提示消息,并且
vr
将下一个状态定义为1001;1002表示(2或2)

选择1、2、3或4会将您切换到下一个状态;
示例
字符串已更改,并且-好吧,我已强制state1000作为目标。您只需跟随state1000中的弹跳球即可

现在-如果键入
exit
,程序将结束。重新运行并键入相同的用户名,
example
的值将显示为上次建立的值,并从保存文件还原

作为一个小小的扩展,您可以添加一个
帮助
系统-只需添加

IF /i %response%==help call :help&goto useriolp
在%%r的
输入(退出退出)…
行之后。请注意,您可以使
: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的,然后在游戏开始时调用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
echo set /a money=%money%>>save.bat
echo set /a health=%health%>>save.bat
echo set /a mana=%mana%>>save.bat