如何批量保存进度

How do I save progress in batch

我正在使用 windows 批处理脚本制作互动小说游戏。我大概知道怎么做了,但我一辈子都弄不明白为什么它不起作用。

这是加载程序:

@echo off
cls
:load
set /p s_name=Name:
if not exist "savedata/%s_name%/" goto user_error
set /p %name%= <savedata/%s_name%/name.pok
set /p %money%= < savedata/%s_name%/money.pok
set /p %area%= < savedata/%s_name%/location.pok
echo Name: %name%
echo Money: %money%
echo Location: Area %area%
echo.
pause
exit
:user_error
cls
echo.
echo File Not Found.
echo.
echo.
pause
exit

这是存档创建者:

@echo off
cls
set /p lnm=Your Name:
set m=700
set l=27
md "savedata/%lnm%"
echo %lnm% > savedata/%lnm%/name.pok
echo %m% > savedata/%lnm%/money.pok
echo %l% > savedata/%lnm%/location.pok
echo save complete.
pause

请注意,这些只是测试,但您明白了。

必要的更改:

  • 再次检查set /p %name%=(依此类推)命令;
  • 请注意 >< 重定向器(以及 set 命令中的 = 赋值)周围、前导或尾随空格都没有。

装载机:

set /p name=<savedata/%s_name%/name.pok
set /p money=<savedata/%s_name%/money.pok
set /p area=<savedata/%s_name%/location.pok
echo Name: %name%, echo Money: %money%, echo Location: Area %area%

存档创建者:

md "savedata/%lnm%" 2>nul
echo %lnm%>savedata/%lnm%/name.pok
echo %m%>savedata/%lnm%/money.pok
echo %l%>savedata/%lnm%/location.pok
echo save complete.
echo Name: %lnm%, echo Money: %m%, echo Location: Area %l%

输出(没有一些 echos 和 clss):

==>29036918load
Name:nn
File Not Found.
Press any key to continue . . .

==>29036918save
Your Name:nn
save complete.
Name: nn, echo Money: 700, echo Location: Area 27
Press any key to continue . . .

==>29036918load
Name:nn
Name: nn, echo Money: 700, echo Location: Area 27
Press any key to continue . . .

==>

我建议保留一个字符或字符串作为您想要 save/reload 的变量的前缀。这样,您的保存例程和重新加载例程就大大简化了。

例如,选择$作为为save/reload变量保留的前缀,则

set $>filename

是您的保存例程(每个以 $ 开头的变量都将以 varname=value 格式作为单独的行保存在 filename 中)例如

$money=700

而您的重载程序很简单

for /f "delims=" %%a in (filename) do set "%%a"

然后从文件中重新加载变量。

这样,当您想要保存另一个变量时不需要更改任何内容 - 只要变量名以 $ 开头,它就会在执行保存行并由重新加载线描述。

同时,请注意/cmd中引入了开关,\是目录分隔符。 "quote strings that may contain spaces" 如果它们用作文件名 - 如果变量 filename 包含值 Fred Bloggs

,则“%filename%”将访问文件 Fred Bloggs

这是一个例子:

@ECHO OFF
SETLOCAL

:: initial setup

SET $money=700
SET $location=27
SET $lnm=Fred Bloggs

:: (naturally, you could input LNM with a set/p if you wanted to)

:: Save the values in a file

SET $>"U:\%lnm%.pok"

:: Display values - I

echo Name: %$lnm%
echo Money: %$money%
echo Location: Area %$location%

:: Display values - II (for debugging while programming)

SET $

ECHO ============================================

ECHO Now CHANGE values

SET $money=50
SET $location=99

:: Display values - II (for debugging while programming)

SET $

ECHO ============================================

ECHO Now RELOAD values

for /f "usebackqdelims=" %%a in ("U:\%lnm%.pok") do set "%%a"

:: Display values - II (for debugging while programming)

SET $

GOTO :eof

请注意,我正在创建一个包含 $ 变量的 所有 的文件(为方便起见,在我的 U: 驱动器上)

usebackq 选项是必需的,因为文件名被引用。

注意如何从文件中恢复原始值。如果你 type 文件,它会以明显的方式显示行。

此方法的关键是对感兴趣的变量使用前缀 ($)。

我已经创建了一个与此类似的游戏,并认为我会分享我的解决方案。 我所做的是将我的游戏作为批处理命令,并将每个玩家放在一个名为 "players" 的单独文件夹中,为了保存进度,我将编写批处理命令以在启动备份时调用。例如,如果我只有 location 变量和金钱,每当我想让脚本保存游戏时,例如访问城镇或任何你想要的,我每次想要保存时都会调用这样的函数:

call :SAVE_GAME_DATA

:SAVE_GAME_DATA
echo(
    set location=%location%
    set money=%money%
)>.\Players\%name%.bat

然后每次您 运行 脚本时,它都会询问您的姓名并加载它为您的姓名编写的批处理文件。像这样:

:startup
echo Welcome to whatever game it is!
echo.
set /p name=Please enter your name:
call .\Players\%name%.bat

::rest of your code goes here

当然,如果 .\Players\%name%.bat 不存在,那么它会 运行 用户通过角色创建过程并保存默认变量,例如例如默认位置并设置 money=0,然后调用 save_game_data 子例程以保存新字符的默认值。