如何批量减去变量

时间:2014-06-09 01:03:11

标签: batch-file

我正在制作一个基于文本的游戏,我需要从武器/装甲的成本中减去玩家的金币......有人可以查看我的代码并告诉我他们是否看到了这个问题?

@echo off 
set gold= 20

echo %gold%
pause >nul
goto blacksmith
:blacksmith
set /p weaponch=  Purchase: 

if %weaponch%==1s (
set  weaponch= 10
set a/ gold=%gold%-10
echo.
echo Gold: %gold% You have purchased the Light Sword
pause 
)

3 个答案:

答案 0 :(得分:1)

您的代码中存在两个问题。

第一个问题由user328430s回答修复,您使用a/代替/a,而且 - =更容易。

另一个问题是,批次一旦填写,就会立即填写%gold%setlocal enabledelayedexpansion 的所有实例,因此直到之后它才会识别出更改。我想这是为了优化,但它会导致问题。要解决此问题,您必须在程序中启用延迟扩展,然后在必须提醒它使用延迟扩展黄金变量的情况下。首先使用以下命令完成此操作:

echo Gold: %gold% You have purchased the Light Sword

然后切换

echo Gold: !gold! You have purchased the Light Sword

@echo off 
setlocal enabledelayedexpansion
set gold= 20

echo %gold%
pause >nul
goto blacksmith
:blacksmith
set /p weaponch=  Purchase 

if %weaponch%==1s ( 
set  weaponch= 10
set /a gold-=10
echo.
echo Gold: !gold! You have purchased the Light Sword
pause 
)

使用更正后的减法线添加:

{{1}}

我在我的计算机上测试了这个,并且购买了1s,它可以正常工作。希望有所帮助。

答案 1 :(得分:1)

[补充资料]

批量认识所有变量字符串至关重要。没有例外。

可能会有所不同的是解释字符串的方式

set gold= 20

gold的值设为20 空格 20

设定/ A金=%金%-10

(将a/更正为/a - 强调上限(批次在很大程度上不区分大小写))将作为

执行

设置/ A gold = 空格 20-10

并设置 / a 会激发此值并将10分配给gold

注意

会发生什么
set gold= 20
if "%gold%"=="20" echo ("gold" is "20") else (echo "gold" is NOT "20")
if %gold%==20 echo (gold is 20) else (echo gold is NOT 20)

这种问题很难找到,尤其是线路上的尾随空格。 set /a为数字作业克服了此问题,而set "var=value"用于字符串作业 - 指定值中唯一的空格"rabbits' ears"

之间的空格

另请注意=左侧的空格可能很重要 - 分配给var 空格 - 而不是var

简而言之,=set两侧的空格非常重要;但在set /a中忽略了。

同样,set /p是字符串赋值。无法控制用户输入的内容,因此分配的值可能为1,也可能为duck soup and waffles

因此,

if %userinput%==1 goto somewhere

会对1(或2399hello ...感到满意,但不喜欢{{1}这将被解释为

duck soup and waffles

这显然是语法错误。

对此的部分解决方案是

if duck soup and waffles==1 goto somewhere

如果输入为if "%userinput%"=="1" goto somewhere ,它至少不会崩溃,但它不是防弹的;有些字符可能会被输入(对duck soup and waffles解释器具有特殊含义的字符)可能会导致问题 - 但通常只有在用户故意尝试使程序崩溃的情况下才会输入。

答案 2 :(得分:0)

试试这个:

@echo off 
set gold= 20

echo %gold%
pause >nul
goto blacksmith
:blacksmith
set /p weaponch=  Purchase: 

if %weaponch%==1s ( 
set  weaponch= 10
set /a gold-=10
echo.
echo Gold: %gold% You have purchased the Light Sword
pause 
)
但是,Haven没有试过这段代码。