我试图为我正在制作的一个小游戏建立一个无限的平衡系统,但是它不起作用。这就是看起来的样子。
if %exp% gtr %lvl%*%lvl% goto lvlup
:lvlup
set /a exp=%exp%-%lvl%*%lvl%
set /a cmhealth=%cmhealth%+5
set /a cchealth=%cchealth%+5
set /a cattack=%cattack%+3
set /a cDefence=%cDefence%+4
set /a cspeed=%cspeed%+2
set /a lvl=%lvl%+1
set /a SP=%SP%+1
goto decisions它运行良好,直到达到以下目的:
if 3 GTR 2*2 goto lvlup
set /a exp=3-2*2
set /a cmhealth=25+5
set /a cchealth=18+5
set /a cattack=8+3
set /a cDefence=15+4
set /a cspeed=8+2
set /a lvl=2+1
set /a SP=1+1
goto decisions然后将exp设置为-1。
它为什么要这样做,我怎样才能解决它?
问题是它没有将2*2读为4或3*3读为9。
发布于 2016-11-18 07:41:10
IF命令比较主字符串。
如果两个字符串可以在内部成功转换为32位有符号整数,则(如果也比较整数),则默认启用命令扩展名,并将其用作比较运算符EQU、NEQ、LSS、LEQ、GTR或GEQ。
但是,如果不计算像命令这样的表达式,则使用参数/A设置。
在命令提示符窗口if /?中运行此命令的帮助。
由于字符串2*2由于字符串中的*而不能转换为整数,因此命令 if 运行字符串比较来计算左字符串是否大于右字符串。
字符串比较是通过逐字节比较两个字符串的字节来完成的,直到到达两个字符串的任一端,或者两个字符串的当前比较字节不相等为止。
这两个字符串的字节的十进制值是:
3……512*2 . 50 42 5051大于50,因此字符串3大于字符串2*2,批处理执行继续跳转到标签lvlup。
因此,首先需要用%lvl%*%lvl%计算表达式set /A,然后将结果赋值给一个环境变量,然后再与另一个包含整数的环境变量进行比较。
set /A result=lvl * lvl
if %exp% GTR %result% goto lvlup
:lvlup
set /A exp-=result
set /A cmhealth+=5
set /A cchealth+=5
set /A cattack+=3
set /A cDefence+=4
set /A cspeed+=2
set /A lvl+=1
set /A SP+=1
goto decisions正如命令通过在命令提示符窗口中运行来设置输出一样,set /?解释说,在set /A之后的表达式中的变量名通常不能也不应该通过使用%VariableName% (立即展开)或!VariableName! (延迟扩展)来引用。分隔空格的字符串(肯定不是整数或算术表达式中的运算符)将自动解释为变量名,当前字符串值应在内部转换为32位有符号整数,以求算术表达式。
https://stackoverflow.com/questions/40666649
复制相似问题