2016-11-17 78 views
2

我試圖做一個小遊戲的人,我做一個無限的調平系統,但它不工作。這就是它的樣子。爲什麼批處理文件中的IF條件解釋3大於2 * 2?

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.

+1

您不能在'if'語句中進行算術運算,只能比較單個值,因此您必須事先通過'set/A'語句計算'%lvl%*%lvl%'並使用其結果爲了比較;如果你在'if'語句中有'2 * 2',它會被比較爲一個字符串... – aschipfl

+0

謝謝@aschipfl它的工作。 – bymdal

回答

2

IF命令初級串進行比較。

IF也比較整數如果兩個串可以被成功內部轉換爲32位帶符號整數和命令擴展名被啓用作爲默認和使用如比較運算符EQU,或NEQ,或LSS,或LEQ,或GTRGEQ

IF不帶參數/A評估像命令SET表達式。在這個命令的幫助一個命令提示符窗口if /?

運行。

作爲字符串2*2 IF運行字符串比較,以評估如果左字符串比右串更大不能轉換到的,因爲在*串,該命令的整數。

字符串比較是通過比較兩個串的字節完成逐字節直到達到兩個字符串中的一個的任一末端或兩個串的目前所比較的字節不相等。

爲兩個字符串的字節的十進制值是:

  • 3 ... 51
  • 2*2 ... 50 42 50

51大於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!引用後在命令提示窗口set /?說明,運行在表達變量名的幫助(延遲擴張)。在算術表達式中絕對不是整數或運算符的空格分隔字符串會自動解釋爲變量名稱,該字符串值應該在內部轉換爲32位有符號整數以評估算術表達式。