我正在制作一个基于文本的游戏,我需要从武器/装甲的成本中减去玩家的金币......有人可以查看我的代码并告诉我他们是否看到了这个问题?
@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
)
答案 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
(或2
,3
,99
,hello
...感到满意,但不喜欢{{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没有试过这段代码。