创建一家商店。不会正确减去钱

时间:2019-07-23 06:31:24

标签: windows batch-file

我希望能够在商店中购买商品并进行正确的减法。在下面的代码中,您从10个金币(gp)开始,但是每当选择24时,就花费5 gp或1输入gp,它将占用所有10 gp。我知道这是因为它没有超出第一个if %input%== 1的范围,但是我不知道如何解决它,我几乎尝试了所有操作,包括if / else陈述,但我可能做得不好

:shop
cls
echo You see a middle aged man behind the counter
echo of the shop as well as a younger man sweeping the floors.
echo "Hello young travelers. Welcome, is there anything
echo I can help you find?"
:purchase
echo --------------------------------------------------------
echo %name%
echo Gold: %gp%
echo --------------------------------------------------------
echo.
echo 1) Battleaxe   10gp  Stats: 1d8(S) Versatile(1d10)
echo 2) Mace         5gp  Stats: 1d6(B)
echo 3) L.Crossbow  20gp  Stats: 1d8(P) Range 80/320
echo 4) 5 Bolts      1gp  Equip with Crossbow
echo 5) Go Back
echo.
set /p input=Enter:

if %input%== 5 goto main
if %input%== 1
if %gp% LSS 10 goto nofunds
set /a gp= %gp% - 10
goto shopcont
if %input%== 2
if %gp% LSS 5 goto nofunds
set /a gp= %gp% - 5
goto shopcont
if %input%== 3
if %gp% LSS 20 goto nofunds
set /a gp= %gp% - 20
goto shopcont
if %input%== 4
if %gp% LSS 1 goto nofunds
set /a gp= %gp% - 1
goto shopcont
goto shop

:nofunds
cls
echo You don't have enough gold to purchase that item.
pause >nul
goto shop

:shopcont
cls
echo Would you like to purchase anything else?
goto purchase

我仍然很陌生,因此示例和解释会很棒!

请不要告诉我使用choice.exe而不是Set /P,除非它可以解决实际问题。

2 个答案:

答案 0 :(得分:0)

对于简单选择菜单,建议不要使用命令set /P。批处理文件的用户一个简单的键入错误,很容易在Windows命令处理器检测到的批处理文件的进一步处理上导致语法错误,从而导致批处理文件执行的意外退出。双击玩此批处理文件游戏的用户不愿意输入错误的示例,例如错误地用"而不是2,突然关闭了控制台窗口,因为cmd.exe退出了批处理文件"引起的严重语法错误,并且批处理文件编码不正确。

另请参阅:

但是,主要问题是所有 IF 命令使用的语法。通过打开command prompt,运行if /?并阅读输出帮助,可以看到命令 IF 的语法。如果if %input%== 1没有以(开头并以)开头并符合条件的条件执行的命令块,则在同一行上为true会导致批处理文件执行时出现语法错误。可以在debugging the batch file上看到。

缩进对于cmd.exe而言与流程无关。 Windows命令处理器不是Python。 Windows命令处理器将执行一个命令行命令,然后执行另一个命令块,这与使用多少前导空格或制表符来缩进命令行无关。

另请参阅:How does the Windows Command Interpreter (CMD.EXE) parse scripts?

算术表达式是set /A在执行批处理文件时由cmd.exe计算的字符串。运行set /?时获得的帮助输出说明,在算术表达式中,可以通过仅在变量名称周围写上%!而不用其名称来引用环境变量的值。这有两个优点:

  1. 如果根本不存在环境变量,则Windows命令处理器将值0用于不存在的环境变量。在算术表达式中使用%NotExistingVariable%会导致语法错误,因为此字符串不替换任何内容,通常在算术表达式求值时会导致缺少操作数错误。
  2. 可以在命令块中使用算术表达式多次修改环境变量,而无需使用delayed expansion

因此,不建议使用set /a gp= %gp% - 10将环境变量gp减10的语法。最好使用集合/A gp=gp - 10和最佳set /A gp-=10

DosTips论坛主题ECHO. FAILS to give text or blank line - Instead use ECHO/解释说echo.可能无法在控制台窗口中打印空行,而echo/echo(对此任务更好。

此任务的minimal, complete, and verifiable example是以下批处理文件:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "gp=50"
set "name=B1u3Soul"

:Shop
cls
echo You see a middle aged man behind the counter
echo of the shop as well as a younger man sweeping the floors.
echo "Hello young travelers. Welcome, is there anything
echo I can help you find?"
:Purchase
echo --------------------------------------------------------
echo %name%
echo Gold: %gp%
echo --------------------------------------------------------
echo/
echo 1) Battleaxe   10gp  Stats: 1d8(S) Versatile(1d10)
echo 2) Mace         5gp  Stats: 1d6(B)
echo 3) L.Crossbow  20gp  Stats: 1d8(P) Range 80/320
echo 4) 5 Bolts      1gp  Equip with Crossbow
echo 5) Go Back
echo/
%SystemRoot%\System32\choice.exe /C 12345 /N /M "Enter: "

if errorlevel 5 goto Main
if errorlevel 4 set "GoldAmount=1"  & goto GoldInPurse
if errorlevel 3 set "GoldAmount=20" & goto GoldInPurse
if errorlevel 2 set "GoldAmount=5"  & goto GoldInPurse
set "GoldAmount=10"

:GoldInPurse
if %gp% LSS %GoldAmount% goto NoFunds
set /A gp-=GoldAmount
echo/
%SystemRoot%\System32\choice.exe /C YN /N /M "Would you like to purchase anything else [Y/N]? "
cls
if errorlevel 2 goto Main
goto Purchase

:NoFunds
echo/
echo You don't have enough gold to purchase that item.
pause >nul
goto Shop

:Main
endlocal

有关此批处理文件中使用的运算符&的说明,另请参见single line with multiple commands using Windows batch file

当然可以只使用choice而不是%SystemRoot%\System32\choice.exe。但是使用完全限定的文件名(驱动器+路径+文件名+文件扩展名)使该批处理文件独立于该批处理文件之外定义的环境。对于此批处理文件,启动批处理文件时如何定义PATHPATHEXT并不重要。它仅取决于Windows定义的环境变量SystemRoot,而通常不会被应用程序或用户修改。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • choice /?
  • cls /?
  • echo /?
  • endlocal /?
  • goto /?
  • if /?
  • pause /?
  • set /?
  • setlocal /?

另请参阅:

答案 1 :(得分:0)

在下面的示例中,我使用了Set /P下的:purchase来满足您不建议使用choice.exe (我在{{1}下使用的代替)

:shopcont

请注意,我已尝试复制您在问题中发布的内容,这是假定在此代码部分之前已经定义了:shop ClS Echo You see a middle aged man behind the shop counter, as well as a Echo younger man sweeping the floor. Echo( Echo "Welcome young travellers, is there anything I can help you with?" :purchase Set "input=" Set "invalid=true" Echo( Echo ------------------------------------------------------------------ Echo(%name% Echo Gold: %gp% Echo ------------------------------------------------------------------ Echo( Echo 1. Battleaxe 10gp [Stats: 1d8(S) Versatile(1d10)] Echo 2. Mace 5gp [Stats: 1d6(B)] Echo 3. L.Crossbow 20gp [Stats: 1d8(P) Range 80/320] Echo 4. 5 Bolts 1gp [Equip with Crossbow] Echo 5. Go Back Echo( Set /P "input=Enter: " For /L %%A In (1,1,5) Do If "%%~A" == "%input:"=%" Set "invalid=" If Defined invalid ClS & GoTo purchase If %input% Equ 5 GoTo main If %input% Equ 4 If %gp% GEq 1 Set /A gp -=1 & GoTo shopcont If %input% Equ 3 If %gp% GEq 20 Set /A gp -=20 & GoTo shopcont If %input% Equ 2 If %gp% GEq 5 Set /A gp -=5 & GoTo shopcont If %input% Equ 1 If %gp% GEq 10 Set /A gp -=10 & GoTo shopcont Echo You do not have enough gold to purchase that item. :shopcont "%__AppDir__%choice.exe" /M "Would you like to purchase anything else" If "%ErrorLevel%"=="1" ClS & GoTo purchase %gp%,并且标签%name%在您未发布的代码中的其他位置。

您要求提供示例和解释,但是可以在每个命令的使用信息下以及通过网络搜索方便地获得这些示例和解释,所以我不会毫无意义地包含此类内容。