【问题标题】:Save and Load .bat game保存和加载 .bat 游戏
【发布时间】:2011-12-02 15:17:13
【问题描述】:

我正在制作一个用bat编写的文字游戏,并且游戏已经完成,(或者更多,它的一个很好的部分,例如命令,并且在你可以玩它的阶段);但是,我想添加保存游戏的功能,然后重新加载。

我认为可以通过让 .bat 文件写入需要保存的变量(例如项目变量)来做到这一点;但是,我不知道该怎么做。任何帮助将不胜感激,谢谢。

我应该说,我可以让它加载,通过使用:

 for /f "delims=" %%x in (config.txt) do (set "%%x")

但是,我不知道如何让 .bat 写入文件并“保存”。

【问题讨论】:

  • 我为你尝试 .bat 游戏的努力鼓掌 :) 但不幸的是没有解决方案
  • @Ell,谢谢,正如我所说的游戏本身运行良好,这只是意味着您必须一口气完成游戏。
  • 很久没用windows了,你管不着?例如echo "mysavedata" >> save.dat
  • 谢谢大家!有兴趣的可以在这里下载游戏副本,db.tt/WYR7Ok0z 随意制作 cmets 并在您认为合适的时候提出建议。另外,只想说这个网站有多好,感谢 Mat 的回答,我在我的代码中使用了这个回答。
  • 太伤心了,链接失效了。如果你想与世界分享,你可以为它创建一个 github 存储库。对如此英勇的努力表示敬意。

标签: batch-file


【解决方案1】:

您也可以仅使用值保存/加载,例如

(
  echo %highscore%
  echo %playername%
  echo %points%
) > savegame.sav

并加载它们

< savegame.sav (
  set /p highscore=
  set /p playername=
  set /p points=
)

第一部分只是将echo 输出重定向到一个文件。
加载部分也使用文件重定向,但在这种情况下作为输入源。
set /p 块中的命令可以从文件中连续读取行。

【讨论】:

    【解决方案2】:

    试试这样的:

    @echo @ECHO OFF           > savegame.cmd
    @echo SET ITEMS=%ITEMS%   >> savegame.cmd
    @echo SET HEALTH=%HEALTH% >> savegame.cmd
    @echo SET MONEY=%MONEY%   >> savegame.cmd
    

    会将这三个变量“保存”在savegame.cmd 中。然后你可以call那个文件重新加载变量。

    (用for /f 来做这件事有点棘手。)

    【讨论】:

      【解决方案3】:

      或


      @echo 关闭
      > savegame.bat echo.SET ITEMS=%ITEMS%
      >> savegame.bat echo.SET HEALTH=%HEALTH%
      >> savegame.bat echo.SET MONEY=​​%MONEY%
      >> savegame.bat echo.SET LEVEL=%LEVEL%


      粗体字是要写入bat文件的变量。

      “savegame.bat”是您将保存变量的文件名的位置。

      最后 > 箭头意味着它将删除所有内容并从文件的开头开始,因为 >> 箭头告诉它将该行添加到文件最底部所有写入的最后.

      我希望这会有所帮助,以及帮助其他有相同问题的人:D

      【讨论】:

        【解决方案4】:

        这是我目前正在研究的一个。

        您将 INI 文件用于保存游戏,并使用 dir 命令加载它们。

        这就是我加载存档游戏列表的方式。 这 ”。”分隔符是为了不显示 .ini 扩展名,以免混淆用户。但是,这不允许用户在存档游戏名称中添加句点。

        set randomDirIndex=%random%dirindex
        dir /b savegames\>%temp%\%randomDirIndex%
        for /f "delims=." %%a in (%temp%\%randomDirIndex%) do (
            echo %%a
        )
        

        以下是存档游戏 INI 文件的示例:

        [PlayerStats]
        health=100
        energy=75
        mana=50
        [Inventory]
        sword=1
        key=0
        [Info]
        name=John Doe
        

        我还使用this question(查看第一个答案)来获取加载 INI 脚本。

        现在要加载它,您将使用一系列 for /f 命令:

        for /f "delims=" %%a in ('call ini.bat savegames\%~1.ini PlayerStats health') do (
            set health=%%a
        )
        for /f "delims=" %%a in ('call ini.bat savegames\%~1.ini PlayerStats energy') do (
            set energy=%%a
        )
        for /f "delims=" %%a in ('call ini.bat savegames\%~1.ini PlayerStats mana') do (
            set mana=%%a
        )
        for /f "delims=" %%a in ('call ini.bat savegames\%~1.ini Inventory sword') do (
            set hasSword=%%a
        )
        for /f "delims=" %%a in ('call ini.bat savegames\%~1.ini Inventory key') do (
            set hasKey=%%a
        )
        for /f "delims=" %%a in ('call ini.bat savegames\%~1.ini Info name') do (
            set playerName=%%a
        )
        

        最后,要保存游戏,您只需将所有内容回显到一个文件中,实质上就是重写 INI 文件。 (参考其他人的答案。)

        【讨论】:

          【解决方案5】:

          我曾经在 DOS 5 时代写过一个批处理游戏(类似文字冒险游戏)。然后,我选择将游戏中的每个位置都设置为磁盘上的单独文件夹。每个位置都有自己的 bat 文件来初始化位置,例如显示其描述并初始化可以从那里移动到的位置。

          对象和人都有自己的 bat 文件。因此,当与一个人交谈时,该人的 bat 文件需要处理并保存对话信息。拾取对象就像将 object.bat 从 location 目录移动到 inventory 目录一样简单。

          这样,我不仅可以轻松地将位置、对象和人物添加到游戏中,而且大部分信息都可以自动保存,因为状态保存在文件中,或者保存在文件的位置中。其余部分通过将相关值保存到加载时运行的批处理文件来保存,其方式与 Mat 在他的回答中描述的方式类似。

          我必须说,当时我不知道所有 for 循环技巧和字符串操作的可能性,如果它们甚至可能在 MSDOS 5 中出现,否则它可能会更容易一些,更不用说更快了。 ;)

          【讨论】:

            【解决方案6】:

            试试这个:

             (echo items=%items%) >> gamesave.txt
             (echo money=%money%) >> gamesave.txt
            

            等等

            【讨论】:

              【解决方案7】:

              为保存创建文件路径:

               `If not exist "%userprofile%\Saves" md "%userprofile%\saves"`
              

              将变量分配给文件夹文件路径:

              `set saveLoc="%userprofile%\saves"`
              

              在目标位置创建空白文件:

              `If not exist "%saveLoc%\data.sav" break>%saveLoc%\data.sav"`
              

              为你的文件路径分配一个变量

              `set Gamesave="%saveLoc%\data.sav`
              

              为了高效编码... 将所有数据块到单个变量中,前缀为 delims 字符。

              `set data=+%var1%+%var2%+%var3%+%var4%`
              

              然后保存:

              `ECHO %data% >%Gamesave%`
              

              为了高效编码... 为 For /F 循环组件分配一个变量,以记录您希望检索的每个令牌...

               `Set lo=For /f "usebackq tokens=`
                  `Set ad= delims=+" %%a IN (%Gamesave%) DO SET`
              

              然后加载:

              `%lo%1%ad% var1=%%a`
              `%lo%2%ad% var2=%%a`
              `%lo%3%ad% var3=%%a`
              `%lo%4%ad% var4=%%a`
              

              这种方法节省了大量的打字时间。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-09-30
                • 1970-01-01
                • 2011-06-12
                • 1970-01-01
                相关资源
                最近更新 更多