如何在批处理中保存进度

时间:2015-03-13 16:06:44

标签: windows batch-file save

我正在使用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

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

3 个答案:

答案 0 :(得分:0)

必要的变化:

  • 再次检查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%

输出(没有echocls s):

==>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 . . .

==>

答案 1 :(得分:0)

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

例如,选择$作为保存/重载变量保留的前缀,然后选择

set $>filename

是您的保存例程(每个以$开头的变量都会以[{1}}格式保存在filename中作为单独的行)

varname=value

你的重装例程就是

$money=700

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

这样,当您想要保存另一个变量时,您不需要更改任何内容 - 只要变量名称启动for /f "delims=" %%a in (filename) do set "%%a" ,它就会在执行保存行并由重新加载行重新加载时保存描述

同时,请注意$引入了/中的切换,cmd是目录分隔符。 “引用可能包含空格的字符串”(如果它们用作文件名) - 如果变量\包含值Fred Bloggs

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

以下是一个例子:

Fred Bloggs

请注意,我正在创建一个包含<{strong>全部 @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)。

答案 2 :(得分:0)

我创建了一个类似于此的游戏,并认为我会分享我的解决方案。 我做的是我把我的游戏作为一个批处理命令,我让每个玩家都在一个名为&#34的单独文件夹中;玩家&#34;,以保存进度,我会在开始备份时编写批处理命令来调用。例如,如果我只有位置变量和金钱,每当我想让脚本保存游戏时,例如访问城镇或任何你想要的东西,我每次想要保存时都会调用这样的函数:< / p>

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不存在则必须有逻辑,那么它将通过角色创建过程运行用户并保存默认变量,如默认位置和设置金额=例如,0,然后调用save_game_data子例程以保存新字符的默认值。