我正在进行批量游戏,而我正在开店。我正在做出选择'购买'以及我的问题。
在此命令块中:
if %ans% == 1 (
if %inv% LEQ %maxinv%-=0.8 (
set /a inv=%inv%+=0.8
set deaglespace=1
if %money% GEQ 800 (
set /a money=%money%-=800
set deaglemoney=1
) else (goto eamount)
) else ( goto tooinv )
if deaglespace==1 (
if deaglemoney==1 (
goto deagleseccbuy
)
)
)
我试图检查您是否有足够的money
和足够的inventory
空间,但它无法正常工作......无法找到解决方法这个问题......
感谢您的尝试!
答案 0 :(得分:1)
if %ans% == 1 (
if %inv% LEQ %maxinv%-=0.8 (
set /a inv=%inv%+=0.8
SET /A
仅适用于整数,因此set /a inv=%inv%+=0.8
无效。
if %inv% LEQ %maxinv%-=0.8
这将导致字符串比较。IF
命令不进行计算,因此您需要第二个变量:
if %ans% == 1 (
set /a temp_var=maxinv-=8
if %inv% LEQ %temp_var% (
set /a inv=inv+=8
答案 1 :(得分:0)
除了整数问题之外,你的代码还有很多问题。
在一个区块(带括号的系列语句)中,var
的任何变体不可见,直到退出eblock - 并且这适用于来自开括号的整个块最后一条匹配关闭的第一行。
有一种方法可以克服这个问题 - 您需要调用delayed expansion
选项。这意味着您需要包含命令
setlocal enabledelayedexpansion
问题是 - 在哪里?
执行setlocal
后,对环境的任何更改都将是暂时的 - 当匹配的endlocal
或程序到达终止时,它将被撤消文件。有一些方法可以克服这个问题,但在程序一开始就直接在setlocal enabledelayedexpansion
之后简单地调用@echo off
会更容易。
如果你这样做,那么在一个块中,%var%
似乎包含外部块开头的变量值(在嵌套块的情况下不包含任何内部块)但{ {1}}将包含更改后的值。
您的下一个问题是!var!
这样的陈述。 if deaglespace==1 (
永远不会等于deaglespace
。如果变量1
的值为%deaglespace%
,则1
可能等于deaglespace
。如果您调用1
,则delayedexpansion
的值可能为!deaglespace!
。
另一个问题是,如果您使用1
来访问!deaglespace!
的当前值,那么可能包含哪些内容?它可以从之前的一些操作中设定吗?它根本没有价值吗?如果它没有值,deaglespace
将被评估为if !deaglespace!==1
,这将产生语法错误。您应该在代码中明确设置值。
你的变量可能有一些对你来说很明显的名字,但它们对我来说没有任何意义,所以你想要做的事情远离我。如果你的意思是你必须拥有8个单位的空间和800个单位的钱,那么你需要在一个临时变量中建立你的自由空间(不要使用 temp 或 tmp - 这些对命令处理器有特殊含义)你可以使用
if ==1
(我经常使用if "%ans%"=="1" (
set /a $1=%maxinv%-%inv%
set /a $2=%money% - 800
)
if "%ans%"=="1" (
if %$1% lss 0 (echo Insufficient inventory space&goto tooinv)
if %$2% lss 0 (echo Insufficient money&goto eamount)
set /a money=$2
set /a inv+=8
goto deagleseccbuy
)
作为临时变量名的前缀。其中有两个,与您使用的$
和deaglespace
相同
注意deaglemoney
语法使对象变量名周围的set /a
可选。
另外:%
分隔命令
并且:您没有说明&
是如何设置的。如果它使用ans
设置,那么请记住用户可以在响应中键入任何内容,因此最好引用双方并执行字符串比较。如果您确定set /p
不为空并且它不包含空格或其他对命令解释器具有特殊含义的字符,请随意使用原始表单。