如何批量保存进度
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%
输出(没有一些 echo
s 和 cls
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 . . .
==>
我建议保留一个字符或字符串作为您想要 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 子例程以保存新字符的默认值。
我正在使用 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%
输出(没有一些 echo
s 和 cls
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 . . .
==>
我建议保留一个字符或字符串作为您想要 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
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 子例程以保存新字符的默认值。