2014-01-14 80 views
-1

我正在編寫一個桌面RPG的商店生成器。根據您選擇的派系生成不同的內容,隨機確定店鋪的效果(差,平均,好,優),然後隨機確定店內物品的數量。我可以在批量顯示中將負值設置爲0嗎?

但是爲了使某些物品或多或少顯示出來,我將它設置爲擁有3d6-5箭頭,這會導致至少-2和最多13個箭頭。當然,商店不能有-2個箭頭。是否有任何方法可以爲變量設置最小和最大範圍,但是0最小,或者將任何負值顯示爲0?

回答

1
if %val% lss 0 set /a val=0 

是單向的

這裏有一個更全面的版本:

@ECHO OFF 
SETLOCAL 

SET val=5 
ECHO ==== :setlt ===== 
CALL :setlt val 3&CALL :showval %val% val 
CALL :setlt val 6&CALL :showval %val% val 
CALL :setlt val 5&CALL :showval %val% val 
CALL :setlt val 3 27&CALL :showval %val% val 
CALL :setlt val 6 1&CALL :showval %val% val 
CALL :setlt val 5 11&CALL :showval %val% val 
ECHO ==== :setgt ===== 
CALL :setgt val 3&CALL :showval %val% val 
CALL :setgt val 6&CALL :showval %val% val 
CALL :setgt val 5&CALL :showval %val% val 
CALL :setgt val 3 27&CALL :showval %val% val 
CALL :setgt val 6 1&CALL :showval %val% val 
CALL :setgt val 5 11&CALL :showval %val% val 
ECHO ==== :setra ===== 
CALL :setra val 3 8&CALL :showval %val% val 
CALL :setra val 8 11&CALL :showval %val% val 
CALL :setra val 2 4&CALL :showval %val% val 
CALL :setra val 3 8 6&CALL :showval %val% val 
CALL :setra val 8 11 6&CALL :showval %val% val 
CALL :setra val 2 4 6&CALL :showval %val% val 
CALL :setra val 3 8 6 7 &CALL :showval %val% val 
CALL :setra val 8 11 6 7&CALL :showval %val% val 
CALL :setra val 2 4 6 7&CALL :showval %val% val 
CALL :setra val 3 8 "" 6&CALL :showval %val% val 
CALL :setra val 8 11 "" 6&CALL :showval %val% val 
CALL :setra val 2 4 "" 6&CALL :showval %val% val 
ECHO ==== add some extras ===== 
SET val=20&CALL :disp val 1 8 "" "" "The strange die rolls " 
SET val=-4&CALL :disp val 0 8 "" "" "" "ghouls flee in fear" 
SET val=-4&CALL :disp val 0 8 "" "" "There are " "arrows in stock" 
SET val=-4&CALL :dispgz val 0 8 "" "" "There are " "arrows in stock" 
SET val=14&CALL :dispgz val 0 8 "" "" "There are " "arrows in stock" 
GOTO :EOF 

:: set a variable %1 to %3 if it is less than %2 
:setlt 
CALL SET $1=%%%1%% 
IF %$1% lss %2 SET "%1=%~3" 
IF NOT DEFINED %1 SET "%1=%~2" 
goto :eof 

:: set a variable %1 to %3 if it is greater than %2 
:setgt 
CALL SET $1=%%%1%% 
IF %$1% gtr %2 SET "%1=%~3" 
IF NOT DEFINED %1 SET "%1=%~2" 
goto :eof 

:: set a variable %1 to %4 if it is less than %2 or %5 if it is greater than %3 
:setra 
CALL ECHO if %%%1%% .lt. %2 SET to "%~4" IF %%%1%% .gt. %3 to "%~5" 
CALL :setlt %1 %2 %~4 
CALL :setgt %1 %3 %5 
goto :eof 

:showval 
CALL ECHO value was %1 is now %%%2%% 
SET %2=%1 
GOTO :eof 

:: Display with limits. 
:disp 
setlocal 
CALL SET $2=%%%1%% 
CALL :setra $2 %2 %3 "%~4" "%~5" 
ECHO %~6%$2% %~7 
endlocal 
GOTO :eof 

:: Display with limits - but only if resolved value is greater than zero 
:dispgz 
setlocal 
CALL SET $2=%%%1%% 
CALL :setra $2 %2 %3 "%~4" "%~5" 
IF %$2% gtr 0 ECHO %~6%$2% %~7 
endlocal 
GOTO :eof 

下面是輸出:

==== :setlt ===== 
value was 5 is now 5 
value was 5 is now 6 
value was 5 is now 5 
value was 5 is now 5 
value was 5 is now 1 
value was 5 is now 5 
==== :setgt ===== 
value was 5 is now 3 
value was 5 is now 5 
value was 5 is now 5 
value was 5 is now 27 
value was 5 is now 5 
value was 5 is now 5 
==== :setra ===== 
if 5 .lt. 3 SET to "" IF 5 .gt. 8 to "" 
value was 5 is now 5 
if 5 .lt. 8 SET to "" IF 5 .gt. 11 to "" 
value was 5 is now 8 
if 5 .lt. 2 SET to "" IF 5 .gt. 4 to "" 
value was 5 is now 4 
if 5 .lt. 3 SET to "6" IF 5 .gt. 8 to "" 
value was 5 is now 5 
if 5 .lt. 8 SET to "6" IF 5 .gt. 11 to "" 
value was 5 is now 6 
if 5 .lt. 2 SET to "6" IF 5 .gt. 4 to "" 
value was 5 is now 4 
if 5 .lt. 3 SET to "6" IF 5 .gt. 8 to "7" 
value was 5 is now 5 
if 5 .lt. 8 SET to "6" IF 5 .gt. 11 to "7" 
value was 5 is now 6 
if 5 .lt. 2 SET to "6" IF 5 .gt. 4 to "7" 
value was 5 is now 7 
if 5 .lt. 3 SET to "" IF 5 .gt. 8 to "6" 
value was 5 is now 5 
if 5 .lt. 8 SET to "" IF 5 .gt. 11 to "6" 
value was 5 is now 8 
if 5 .lt. 2 SET to "" IF 5 .gt. 4 to "6" 
value was 5 is now 6 
==== add some extras ===== 
if 20 .lt. 1 SET to "" IF 20 .gt. 8 to "" 
The strange die rolls 8 
if -4 .lt. 0 SET to "" IF -4 .gt. 8 to "" 
0 ghouls flee in fear 
if -4 .lt. 0 SET to "" IF -4 .gt. 8 to "" 
There are 0 arrows in stock 
if -4 .lt. 0 SET to "" IF -4 .gt. 8 to "" 
if 14 .lt. 0 SET to "" IF 14 .gt. 8 to "" 
There are 8 arrows in stock 

而現在我可以自由地胡扯了一下.. 。

Afte R時val至5中,存在的基本格式

CALL :setlt val 3&CALL :showval %val% val 

例程:showval顯示val的電流值的許多行,然後將其復位到其原始值。這樣一來,我可以報告前CALL的結果並重置價值,任何價值,我選擇(但我沒有使用該功能...)

:setlt調用的參數是可變的,限制, forced_value - 其中forced_value是可選的。如果未指定強制值,則將使用限制。

所以:setltval 3將其當前價值是less than 3val值設置爲3參數 - 但如果參數爲val 6 1那麼如果val當前值小於6,將其值改爲1

因此,:showval例程顯示每種情況下的結果,然後將val重置爲5

:setgt與此類似,只需設置當前值爲greater than而不是less than時的值。

下一頁組是具有參數var minval maxval forceifltmin forceifgtmax:setra - 唯一的扭結是如果不使用forceifltminforceiflmax使用,那麼forceifltmin必須是空的參數("")。

我已經在:setra的開頭添加了call echo...行,純粹是爲了顯示發生了什麼 - 它對調試很有用。只需REM::該行,以便您可以打開或關閉調試。

(提示:與調試線,你可以嘗試

set "debug=REM " 
%debug%echo this is a debug line 

只需設置debug要麼REM或沒有把你的調試線或關閉)

最後是:disp:dispgz程序。這些是非常不同的。他們故意不要更改變量的值,並設計爲顯示該值,就好像它在範圍內一樣,還有另外兩個參數 - 兩個可選參數都是text-before和text-after值。兩者應提供"quoted"

這次只需要顯示text-beforetext-after,這樣您就可以構建如圖所示的消息。

如果你不想顯示包含應用範圍的檢查是>0然後用:dispgz

+0

@Magoo感謝脫線後,除非值的值線,你真的讓我的「DM自動工具套件」項目實際上是可能的:)真的,你已經幫助過Character Creator,Random Encounter Generator和Shop Generator。我對你對這個套件其他部分的激烈問題的迴應作了前言。 –

+0

@ashatte其實它確實提供了我的問題的答案,並完美地工作。問題? –

+0

@SeanMcLain沒問題,只是習慣了審查過程。對不起。 – ashatte

相關問題