2016-11-17 7 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に設定されています。

なぜこれを行うのですか?どのように修正できますか?

問題は、それが IFコマンドは、プライマリ文字列を比較4または3 * 3

+1

'if'文で演算を行うことはできません。単一の値しか比較できないので、' set/A'文で '%lvl%*%lvl%'をあらかじめ計算しておき、その結果比較のために; 'if'ステートメントに' 2 * 2'がある場合、それは文字列として比較されます。 – aschipfl

+0

ありがとう、あなたは@aschipflを働かせました。 – bymdal

答えて

2

9としてとして2 * 2を読んでいないです。

両方の文字列は、32ビット符号付き整数とコマンドの拡張に正常に内部変換することができる場合も整数を比較する場合、デフォルトでとして有効と比較演算子EQU、又はNEQ、又はLSS、又はLEQとして使用されていますまたはGTRまたはGEQである。

しかし IFは、パラメータ/AとコマンドSETのような式を評価しません。

このコマンドのヘルプについては、コマンドプロンプトウィンドウif /?で実行してください。左列は右列よりも大きいかどうかを評価するための文字列比較を実行している場合、文字列2*2として

コマンド、文字列であるため*の整数に変換できません。

文字列の比較は、2つの文字列のバイトのどちらかが2つの文字列のどちらかに到達するまで、または現在比較されている2つの文字列のバイトが等しくないように比較します。二つの文字列のバイト

小数点値は、次のとおり

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

51は50より大きく、従って、あります文字列3が文字列2*2より大きく、バッチ実行がラベルlvlupにジャンプして続行されます。

%lvl%*%lvl%を最初に評価してset /Aとする必要があります。結果を環境変数に代入し、次に結果を整数値を持つ別の環境変数と比較する必要があります。コマンドSET出力の助けとして

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ビット符号付き整数に変換する必要があります。

関連する問題