2016-11-20 56 views
0

我跑进一个游戏,我正在做一个错误,就会通过这个命令行造成的:为什么随机数始终为50,但在批处理脚本中它应该介于0和5之间?

set mdmg=%rdm% %%5 +1 

结果总是50,但它意味着是0到5 Rdm%random%由办法。

这是怎么发生的?

这里是它在运行块:

REM////////////////BATTLE\\\\\\\\\\\\\\\\\\ 

:prebattle 
setlocal enabledelayedexpansion 
set rdm=%random% 

if "!weapon!" EQU "1" (
set /a pdmg=!rdm! %%25 +1 
) 

if "!armor!" EQU "1" (
set /a php=100 
) 

set mhp=50 
set mdmg=!rdm! %%5 +1 

set /p %c%=user 

if %c% EQU 1 (
echo !mhp! 
) 
if %c% EQU 2 (
echo !mdmg! 
) 
if %c% EQU 3 (
echo !mlvl! 
) 
pause 

if "!lvl!" EQU "1" if "!lvl!" LEQ "5" (
set /a enemyno=!rdm! %%3 +1 
set /a mhp+=!rdm! %%20 +1 
set /a mdmg+=!rdm! %%20 +1 
set /a mlvl=!rdm! %%5 +1 
) 

set /p %c%=user 

if %c% EQU 1 (
echo !mhp! 
) 
if %c% EQU 2 (
echo !mdmg! 
) 
if %c% EQU 3 (
echo !mlvl! 
) 
pause 

if "!lvl!" GEQ "6" if "!lvl!" LEQ "10" (
set /a enemyno=!rdm! %%6 +1 
set /a mhp+=!rdm! %%20 +1 
set /a mdmg+=!rdm! %%15 +1 
set /a mlvl=!rdm! %%10 +1 
) 
if "!lvl!" GEQ "11" if "!lvl!" LEQ "15" (
set /a enemyno=!rdm! %%9 +1 
set /a mhp+=!rdm! %%20 +1 
set /a mdmg+=!rdm! %%15 +1 
set /a mlvl=!rdm! %%16 +1 
) 
if "!lvl!" GEQ "16" if "!lvl!" LEQ "20" (
set /a enemyno=!rdm! %%12 +1 
set /a mhp+=!rdm! %%20 +1 
set /a mdmg+=!rdm! %%15 +1 
set /a mlvl=!rdm! %%22 +1 
) 
if "!lvl!" GEQ "21" if "!lvl!" LEQ "25" (
set /a enemyno=!rdm! %%15 +1 
set /a mhp+=!rdm! %%20 +1 
set /a mdmg+=!rdm! %%15 +1 
set /a mlvl=!rdm! %%30 +1 
) 
if "!lvl!" GEQ "26" if "!lvl!" LEQ "30" (
set /a enemyno=!rdm! %%18 +1 
set /a mhp+=!rdm! %%20 +1 
set /a mdmg+=!rdm! %%15 +1 
set /a mlvl=!rdm! %%35 +1 
) 

set /p %c%=user 

if %c% EQU 1 (
echo !mhp! 
) 
if %c% EQU 2 (
echo !mdmg! 
) 
if %c% EQU 3 (
echo !mlvl! 
) 
pause 


if "!enemyno!" EQU "1" goto enemy1 
if "!enemyno!" EQU "2" goto enemy2 
if "!enemyno!" EQU "3" goto enemy3 
if "!enemyno!" EQU "4" goto enemy4 
if "!enemyno!" EQU "5" goto enemy5 
if "!enemyno!" EQU "6" goto enemy6 
if "!enemyno!" EQU "7" goto enemy7 
if "!enemyno!" EQU "8" goto enemy8 
if "!enemyno!" EQU "9" goto enemy9 
if "!enemyno!" EQU "10" goto enemy10 
if "!enemyno!" EQU "11" goto enemy11 
if "!enemyno!" EQU "12" goto enemy12 
if "!enemyno!" EQU "13" goto enemy13 
if "!enemyno!" EQU "14" goto enemy14 
if "!enemyno!" EQU "15" goto enemy15 
if "!enemyno!" EQU "16" goto enemy16 
if "!enemyno!" EQU "17" goto enemy17 
if "!enemyno!" EQU "18" goto enemy18 
if "!enemyno!" EQU "19" goto enemy19 
if "!enemyno!" EQU "20" goto enemy20 
if "!enemyno!" EQU "21" goto enemy21 
if "!enemyno!" EQU "22" goto enemy22 
if "!enemyno!" EQU "23" goto enemy23 
if "!enemyno!" EQU "24" goto enemy24 
if "!enemyno!" EQU "25" goto enemy25 
if "!enemyno!" EQU "26" goto enemy26 
if "!enemyno!" EQU "27" goto enemy27 
if "!enemyno!" EQU "28" goto enemy28 
if "!enemyno!" EQU "29" goto enemy29 
if "!enemyno!" EQU "30" goto enemy30 

goto prebattle 
+3

通常,我会要求查看更多的代码,因为如果没有看到更多的代码,就不可能确定是什么问题。这就是说,我几乎可以保证它是你的结果[不使用延迟扩展](http://stackoverflow.com/questions/9681863/windows-batch-variables-wont-set)。但是,由于您缺乏[最小,完整和可验证的示例](http://stackoverflow.com/help/mcve),因此我会投票结束。 – SomethingDark

+0

我有 – Yoshirou

+0

setlocal enabledelayedexpansion是的,你需要使用'!rdm!'而不是'%rdm%'。尝试实际阅读链接。 – SomethingDark

回答

2

我只是把这个代码在这里为你,这样也许你会终于明白什么是你的代码错误。还有更多的输入有效性检查可以放在那里。我不是很了解你在用USER变量做什么。我纠正的代码使得假设代码块之前和之后的代码是正确的。

REM////////////////BATTLE\\\\\\\\\\\\\\\\\\  

:prebattle 
set rdm=%random%  

if "%weapon%" EQU "1" set /a pdmg=rdm %% 25 +1  

if "%armor%" EQU "1" set /a php=100 


set mhp=50 
set /a mdmg=rdm %% 5 +1 

set "c=" 
set /p c=user 

if %c% EQU 1 echo %mhp% 
if %c% EQU 2 echo %mdmg% 
if %c% EQU 3 echo %mlvl% 

pause 

if "%lvl%" EQU "1" if "%lvl%" LEQ "5" (
    set /a enemyno=rdm %% 3 +1 
    set /a mhp+=rdm %% 20 +1 
    set /a mdmg+=rdm %% 20 +1 
    set /a mlvl=rdm %% 5 +1 
) 

set "c=" 
set /p c=user 

if %c% EQU 1 echo %mhp% 
if %c% EQU 2 echo %mdmg% 
if %c% EQU 3 echo %mlvl% 

pause 

if "%lvl%" GEQ "6" if "%lvl%" LEQ "10" (
    set /a enemyno=rdm %% 6 +1 
    set /a mhp+=rdm %% 20 +1 
    set /a mdmg+=rdm %% 15 +1 
    set /a mlvl=rdm %% 10 +1 
) 

if "%lvl%" GEQ "11" if "%lvl%" LEQ "15" (
    set /a enemyno=rdm %% 9 +1 
    set /a mhp+=rdm %% 20 +1 
    set /a mdmg+=rdm %% 15 +1 
    set /a mlvl=rdm %% 16 +1 
) 

if "%lvl%" GEQ "16" if "%lvl%" LEQ "20" (
    set /a enemyno=rdm %% 12 +1 
    set /a mhp+=rdm %% 20 +1 
    set /a mdmg+=rdm %% 15 +1 
    set /a mlvl=rdm %% 22 +1 
) 

if "%lvl%" GEQ "21" if "%lvl%" LEQ "25" (
    set /a enemyno=rdm %% 15 +1 
    set /a mhp+=rdm %% 20 +1 
    set /a mdmg+=rdm %% 15 +1 
    set /a mlvl=rdm %% 30 +1 
) 

if "%lvl%" GEQ "26" if "%lvl%" LEQ "30" (
    set /a enemyno=rdm %% 18 +1 
    set /a mhp+=rdm %% 20 +1 
    set /a mdmg+=rdm %% 15 +1 
    set /a mlvl=rdm %% 35 +1 
) 

set "c=" 
set /p c=user 

if %c% EQU 1 echo %mhp% 
if %c% EQU 2 echo %mdmg% 
if %c% EQU 3 echo %mlvl% 
pause 

REM SANITY CHECK to make sure the variable is defined and within range. 
REM IF TRUE then goto enemy# 
IF DEFINED enemyno (
    if %enemyno% GEQ 1 (
     if %enemyno% LEQ 30 goto enemy%enemyno% 
    ) 
) 


goto prebattle 
+0

我在OP的代码中没有看到任何USER变量。另一方面,从来没有定义'lvl'变量,但即使定义了“if”!lvl!“如果“!lvl!”等于“1” LEQ“5”等同于“if”!lvl!“ EQU“1”和“if”%lvl%“GEQ”6“if”%lvl%“LEQ”10“** ** never **评估为_true_(字符串与数字的比较)。 – JosefZ

+0

@JosefZ,他只向我们展示了他的一小部分代码。我们只能假设他在此代码块之前定义了所有其他变量。因此,我的代码之前我的意见。 – Squashman

+0

然后,OQ不满足[mcve]规则:它立即太大而且不完整,因此无法验证... – JosefZ

相关问题