Batch file 文本冒险RPG在批处理。一般问题

Batch file 文本冒险RPG在批处理。一般问题,batch-file,Batch File,所以我决定学习批处理,我正在尝试编写一个小的RPG/冒险游戏,该游戏由办公室里的RPG鼻烟故事驱动。所以我有一些问题和疑问 @echo off color F0 title The Kingdom of Kovalor type Titlescreen.txt pause >nul goto MainMenu :MainMenu cls type mainmenu.txt echo. echo Type in option and press Enter. Set /p menu= if

所以我决定学习批处理,我正在尝试编写一个小的RPG/冒险游戏,该游戏由办公室里的RPG鼻烟故事驱动。所以我有一些问题和疑问

@echo off
color F0
title The Kingdom of Kovalor
type Titlescreen.txt
pause >nul
goto MainMenu

:MainMenu
cls
type mainmenu.txt
echo.
echo Type in option and press Enter.
Set /p menu=
if "%menu%" equ "new game" goto NewGame
if %menu% equ credits goto Credits
if "%menu%" equ "load game" goto LGame
echo Try again.
if %menu% neq new game goto MainMenu
if %menu% neq credits goto MainMenu
if %menu% neq load game goto MainMenu
pause >nul

:Credits
cls
echo Made by XXXXXXXXX
echo.
echo.
echo Press any key to return to Main Menu.
pause >nul
goto MainMenu

:NewGame
cls
echo What is your name, adventurer?
echo.
Set /p name=
echo.
echo %name%, are you a man or woman?
echo.
Set /p sex=
goto Stats

:SaveGame
@echo @ECHO OFF                 > save%name%.bat
@echo SET name=%name%           >> save%name%.bat
@echo SET sex=%sex%             >> save%name%.bat
@echo SET playerHP=%playerHP%   >> save%name%.bat
@echo SET playerATK=%playerATK% >> save%name%.bat
@echo SET playerDEF=%playerDEF% >> save%name%.bat
@echo SET playerLVL=%playerLVL% >> save%name%.bat
echo.
echo Game saved correctly.
echo Press any key to continue.
pause >n
exit

:LGame
cls
echo.
echo What's your name?
echo.
Set /p name=
echo Load successful.
pause >nul
exit

:Stats
cls
set /a playerHP = 25
set /a playerATK = 5
set /a playerDEF = 0
set /a playerLVL = 1
echo These are your stats.
echo Health, when it depletes, you die.                       %playerHP%
echo Attack. The ammount of damage you deal.                  %playerATK%
echo Defense. Armor which reduces the damage you take.        %playerDEF%
echo Level dictates the experience you have as an adventurer. %playerLVL%
echo You can improve these as you go.
echo For now you have no weapons nor armor.
pause >nul
if %sex% equ man goto StartAdventureMan
if %sex% equ woman goto StartAdventureWoman


:StartAdventureMan
cls
echo Kovalor wasn't always like this. There was a time where one could
echo walk around town without being disturbed. The so-called king has
echo placed himself on the throne with the help of twisted creatures.
echo.
echo TUTORIAL *Press Space Bar to continue narrative.*
pause >nul
echo.
echo There have been talks about a coup or silent assasinations but 
echo nothing has been proven to be but a rumor.
echo Nonetheless, the King must fall.
pause >nul
echo.
echo %name% got out of bed that morning with a headache born from heavy
echo drinking the previous night. He got dressed and left for the tool
echo shed outside his house. The cold early-spring air snipping at his 
echo bare arms. His best hoe laid on the floor.
pause >nul
goto PickUpHoe

:StartAdventureWoman
cls
echo Kovalor wasn't always like this. There was a time where one could
echo walk around town without being disturbed. The so-called king has
echo placed himself on the throne with the help of twisted creatures.
echo.
echo TUTORIAL *Press Space Bar to continue narrative.*
pause >nul
echo.
echo There have been talks about a coup or silent assasinations but 
echo nothing has been proven to be but a rumor.
echo Nonetheless, the King must fall.
pause >nul
echo.
echo %name% got out of bed that morning with a headache born from heavy
echo drinking the previous night. She got dressed and left for the tool
echo shed outside her house. The cold early-spring air snipping at her 
echo bare arms. Her best hoe laid on the floor.
pause >nul
goto PickUpHoe

:PickUpHoe
echo.
echo TUTORIAL *Type take followed by an object and press enter in order 
echo to pick it up and add it to your inventory.*
set /p action1=
if "%action1%" neq "take hoe" echo TUTORIAL *Type take hoe followed by Enter.*
goto PickUpHoe
echo *Picked up hoe.*
pause >nul
goto SaveTutorial

:SaveTutorial
echo.
echo TUTORIAL *You can save progress whenever you can type by typing Save Game.*
echo *Try saving now.*
Set /p action2=
if "%action2%" equ "Save Game" goto SaveGame
if "%action2%" neq "Save Game" goto SaveTutorial
pause >nul  
exit
正如你可能注意到的,这并不是很遥远。当我添加代码时,我正在测试它。 所以问题是,我不能得到LGame方法,我不知道你如何称之为批处理,完全是编程初学者,所以请容忍我。目前,它应该只是打印消息,但如果我运行它,它就会崩溃。其他一切都正常工作

现在回答问题

我怎么能这样当你保存游戏时,你又回到 你在哪里? 当我让LGame工作时,您将如何准确地调用保存文件?
如果可能的话,你可以在库存系统上找到一些指针和一个暂停菜单,你可以随时打开它,然后回到你以前的屏幕上。一般有指针吗?

首先,我建议在浏览器中添加书签:

SS64 通过在命令提示符窗口中运行带/?作为参数,例如如果/?,则设置/

第二,我建议避免回声。并改为使用echo/输出空行。请查看DosTips论坛主题以获取解释

第三,阅读我的答案。比较运算符EQU用于整数比较,而不是字符串比较。如果Windows命令解释器识别出要比较的两个参数中的一个不是整数,则它还可以作为回退用于字符串比较。但更好的方法是使用==来比较两个字符串

第四,如果用户需要从几个选项中选择一个,则不要使用set/p。提示用户输入字符串并将其分配给环境变量时,必须考虑多个事实:

使用set/p MyVar=您的选择:如果用户有意或错误地按RETURN或ENTER键,则不会修改环境变量MyVar。这意味着,如果在用户提示之前还没有定义环境变量MyVar,那么在用户提示完成后,只要按回车键,仍然没有定义环境变量MyVar。若在用户提示之前已经定义了MyVar,则在用户按RETURN或ENTER键的情况下,MyVar将保持其值不变

用户可以在收到set/p提示时自由键入任何字符串。批处理文件编写器无法控制用户真正输入的内容。因此,批处理文件编写器必须考虑到,用户错误地或有意地输入了一个字符串,该字符串可能由于语法错误而导致批处理文件执行的退出,或者它执行的操作与定义的完全不同

一个简单的例子:

@echo on
:MainMenu
@set /P "menu=Your choice: "
if "%menu%" == "new game" goto NewGame
if %menu% == credits goto Credits
goto MainMenu

:NewGame
@echo Start a new game ...
goto :EOF

:Credits
@echo Made by XXXXXXXXX
出于调试目的,此批处理文件顶部的echo打开而不是echo关闭是从命令提示符窗口中启动的

第一次运行时,在用户提示下按Just RETURN。Windows命令解释器退出批处理,因为第二个IF条件是在执行IF命令之前预处理的:

if  == credits goto Credits
显然缺少了第一个论点。cmd.exe遇到此语法错误并退出批处理,并显示相应的错误消息。原因是在用户提示之前没有定义环境变量菜单,在用户提示之后仍然没有定义环境变量菜单

在命令提示窗口内第二次运行批处理文件时,输入信用,批处理文件按预期工作

在同一命令提示窗口中再次运行批处理文件时,在用户提示下按RETURN键。批处理文件再次打印信用。为什么?环境变量菜单仍然是使用该字符串从第二批文件执行中定义的,并且在按RETURN键时未修改该变量

好的,让我们将示例批处理文件修改为:

@echo on
:MainMenu
@set "menu=credits"
@set /P "menu=Your choice: "
if /I "%menu%" == "new game" goto NewGame
if /I "%menu%" == "credits" goto Credits
goto MainMenu

:NewGame
@echo Start a new game ...
goto :EOF

:Credits
@echo Made by XXXXXXXXX
这已经更好了,因为现在环境变量菜单总是用值积分预定义的。因此,如果用户不输入任何内容,则会显示积分。此外,“上一次运行变量”菜单的值对批处理文件的执行不再有影响。现在字符串比较不区分大小写

但现在这真的是安全的和故障安全的吗

不,不是。用户仍然可以错误地输入错误的字符串

例如,用户输入错误,而不是2,这在德国键盘上很容易,因为CapsLock+2或Shift+2会导致输入错误。预处理后的第一个IF命令行现在是:

if /I """ == "new game" goto NewGame
这也是一个无效的命令行,由于语法错误导致批处理文件处理退出

假设用户在提示符下输入字符串:

" == "" call dir "%USERPROFILE%\Desktop" & rem 
注意:末尾有一个空格

第一个IF条件由Windows命令解释器预处理为:

if /I "" == "" call dir "%USERPROFILE%\Desktop"   & rem " == "new game" goto NewGame
可以看出,批处理文件现在在两种IF条件下都执行一个根本没有写入批处理文件的命令

如何获得故障安全的用户提示

由usi提供 ng至少在评估用户输入字符串的代码周围延迟环境变量扩展

@echo on
:MainMenu
@setlocal EnableDelayedExpansion
@set "menu=credits"
@set "Label=MainMenu"
@set /P "menu=Your choice: "
if /I "!menu!" == "new game" set "Label=NewGame"
if /I "!menu!" == "credits" set "Label=Credits"
endlocal & goto %Label%

:NewGame
@echo Start a new game ...
goto :EOF

:Credits
@echo Made by XXXXXXXXX
现在,用户输入字符串不再修改Windows命令解释器执行的命令行。因此,由于用户输入引起的语法错误而退出批处理文件处理不再可能。批处理文件从不执行批处理文件中未写入的命令

但对于简单的选择菜单,有一个比set/p更好的命令

用户不再有自由输入批处理文件编写器未定义的内容。用户按下1、2、c、Shift+c、e或Shift+e后,批处理文件将立即继续。除Ctrl+c外,其他所有内容都将被忽略

环境变量ERRORLEVEL具有四个选项,在选择终止后,返回1到4作为调用cmd.exe的退出代码,其值始终在1到4之间

注:if errorlevel X表示if大于或等于X。因此,始终需要从命令选择的最高可能退出代码开始

由于分配给ERRORLEVEL的退出代码是众所周知的,因此可以在较大的菜单上使用适当的标签进一步优化代码:

@echo off
:MainMenu
cls
echo/
echo    1 ... Start a new game
echo    2 ... Load a game
echo    C ... Show credits
echo    E ... Exit
echo/
choice.exe /C 12CE /N /M "Your choice: "
goto Option%ERRORLEVEL%

:Option1
echo Start a new game ...
goto :EOF

:Option2
echo Loading game ...
goto :EOF

:Option3
echo Made by XXXXXXXXX
echo/
pause
goto MainMenu

:Option4
使用命令选择可以使选择菜单的编码变得非常简单

第五,不要在没有选项/B的批处理文件中使用命令退出。没有选项/B的退出始终会立即退出整个命令进程,而不依赖于使用/K启动的cmd.exe,以在运行批处理文件后保持命令进程运行和控制台窗口打开,就像显式打开命令提示窗口和运行批处理文件一样,或者在cmd.exe启动时使用/C在批处理文件执行完成后关闭,原因与双击批处理文件类似

独立于启动选项/K或/C且独立于调用层次结构的命令进程退出不利于从命令提示窗口中调试批处理文件


另请参见

上的答案,不幸的是,这个问题非常广泛,实际上有五个问题,因此它并不适合堆栈溢出。也就是说,你可能会在或上有更好的运气。另外,假设您使用的是Windows XP之后的产品,默认情况下您可以访问batch、PowerShell、VBScript和JScript。最后一个问题是:只需调用save%name%.batI我不完全确定如何操作,但您可以将信息保存到文本文件中,然后稍后再调用它。这可能是最好的解决办法。在线上有许多教程介绍如何从批处理保存到.txt文件。
@echo off
:MainMenu
cls
echo/
echo    1 ... Start a new game
echo    2 ... Load a game
echo    C ... Show credits
echo    E ... Exit
echo/
choice.exe /C 12CE /N /M "Your choice: "
goto Option%ERRORLEVEL%

:Option1
echo Start a new game ...
goto :EOF

:Option2
echo Loading game ...
goto :EOF

:Option3
echo Made by XXXXXXXXX
echo/
pause
goto MainMenu

:Option4