提问者:小点点

创建一个商店。我不能正确地减去钱


我希望能够在商店购买物品,并让它做正确的减法。在下面的代码中,您从gold pieces开始,但只要输入用于花费,它就会取消所有的,但我不知道如何修复它,我几乎尝试了所有的方法,包括语句,但我可能没有正确地执行它们。

: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

我还是新的在这方面,所以例子和解释将是美妙的!

请不要告诉我使用而不是,除非它能解决实际问题。


共2个答案

匿名用户

在下面的示例中,我在下使用了,以满足您不使用的不明智规定(我在下使用了该规定)。

: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

请注意,我已尝试复制您在问题中发布的内容,这假设已经在此代码部分之前定义,并且标签存在于未发布代码的其他地方。

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

匿名用户

对于简单的选择菜单,不建议使用命令。用户对批处理文件的简单键入错误很容易导致Windows命令处理器在进一步处理批处理文件时出现语法错误,从而意外退出批处理文件的执行。双击此批处理文件游戏的用户在错误地键入而不是示例时会不高兴,控制台窗口突然关闭,原因是退出批处理文件处理,原因是导致严重语法错误,批处理文件编码不良。

另请参阅:

但是,主要问题是所有IF命令上使用的语法。可以通过打开命令提示符,运行并读取输出帮助来查看命令IF的语法。如果没有以开头并以匹配的结尾的命令或命令块来执行,则在同一行的条件为true时,会导致批处理文件执行时出现语法错误。这可以在调试批处理文件时看到。

缩进对于有关流程流的没有意义。Windows命令处理器不是Python。Windows命令处理器分别执行一个命令行和另一个命令块,与使用多少前导空格或制表符缩进命令行无关。

另请参阅:Windows命令解释器(cmd.exe)如何解析脚本?

算术表达式是执行批处理文件时计算的后的字符串。运行时的帮助输出说明,在算术表达式中,可以通过只写环境变量的名称而不写或在变量名周围写来引用环境变量的值。这样做有两个好处:

    用于不存在的环境变量。在算术表达式中使用会导致语法错误,因为此字符串被nothing替换,这通常会导致算术表达式求值时出现操作数丢失的错误。/LI>

因此,不建议使用语法将环境变量减10。更好的方法是使用set和best

道斯蒂普斯论坛主题回声。无法给出文本或空行-改为使用echo/解释无法将空行打印到控制台窗口,更适合执行此任务。

此任务的一个最小,完整且可验证的示例是以下批处理文件:

@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

另请参见使用Windows批处理文件的单行多命令,以了解该批处理文件中使用的运算符的说明。

当然,可以只使用而不使用。但是完全限定文件名(驱动器+路径+文件名+文件扩展名)的使用使得批处理文件独立于批处理文件外部定义的环境。对于这个批处理文件,启动批处理文件时如何定义并不重要。它只依赖于Windows定义的环境变量,通常应用程序或用户不会修改该变量。

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

另请参阅: