我正在使用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
请注意,这些只是测试,但你明白了。
答案 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%
输出(没有echo
和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 . . .
==>
答案 1 :(得分:0)
我建议将一个字符或字符串保留为要保存/重新加载的变量的前缀。这样,您的保存例程和重新加载例程就大大简化了。
例如,选择$
作为保存/重载变量保留的前缀,然后选择
set $>filename
是您的保存例程(每个以$
开头的变量都会以[{1}}格式保存在filename
中作为单独的行)
varname=value
你的重装例程就是
$money=700
然后从文件中重新加载变量。
这样,当您想要保存另一个变量时,您不需要更改任何内容 - 只要变量名称启动for /f "delims=" %%a in (filename) do set "%%a"
,它就会在执行保存行并由重新加载行重新加载时保存描述
同时,请注意$
引入了/
中的切换,cmd
是目录分隔符。 “引用可能包含空格的字符串”(如果它们用作文件名) - 如果变量\
包含值Fred Bloggs
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子例程以保存新字符的默认值。