0

所以这段代码有一些问题,它可能只是一些我还没有注意到的标点错误,但由于某种原因我找不到它。

我读到这是如何使用Do然后的次数进行循环,在这种情况下是' %dmg%',告诉我这是否不是真的。

我确实有定义变量的部分; set dmgt=0 set /a wl=1000*%upts%/%epts%我确实设置了所有其他人。

使用 pause 命令我发现这是问题所在;

if %upts%*%utroop% LEQ %epts%*%etroopt% ( goto fail
) else ( set /a dmg=%wl%*%etroop%/1000
    set /a dmgt=%dmg%+%dmgt%
do %dmg%
SET /A type=%RANDOM% * 3 / 32768 + 1
if %type% == 1 ( if %snip% GEQ 1 ( set /a dmg=%dmg%-1
        set /a snip=%snip%-1
    )
)
if %type% == 2 ( if %mgs% GEQ 1 ( set /a dmg=%dmg%-2
        set /a mgs=%mgs%-1
    )
)
if %type% == 3 ( if %rif% GEQ 1 ( set /a dmg=%dmg%-1
        set /a rif=%rif%-1
    )
)
enddo
)
4

1 回答 1

0

if %upts%*%utroop% LEQ %epts%*%etroopt%不计算每一边的值,它串在一起the contants of upts*the contents of utroop并将该字符串与 RHS 进行比较。您需要使用 a 将这两个值显式计算为变量SET

您的ELSE子句调用“块语句”,即括号内的语句系列的全部内容,直到结尾)enddo. 批处理解析语句从块的到右IF括号,用 PARSE-TIME 值ELSE替换任何语句,然后执行结果。因此,对于块内的逻辑来说,将看起来没有变化。%var%varTYPE

您需要调用delayedexpansionmode 并使用!var!来访问 RUN-TIME 的值var。这是通过一个SETLOCAL ENABLEDELAYEDEXPANSION语句完成的,通常在批处理开始时插入打开之后(因此在批处理的整个持续时间内@echo off打开延迟扩展和设施)!var!

实际上,不需要一个ELSE子句,因为你有它,因为你GOTO是真实部分的标签。这可能会简化您的代码。

最后,没有DO/ENDDO批量设施——或者至少,不是那种形式。我假设您打算执行中间代码%dmg%时间。您可以通过使用来实现这一点

for /L %%z in (1,1,%dmg%) do (
 intervening code
)

其中元变量%%z将从括号中的第一个元素递增到第二个元素的最后一个元素。%%z可以是任何字母,但它是批量区分大小写的极少数情况之一

于 2013-12-22T08:36:42.377 回答