2014-01-20 30 views
0

值a1到a9等於一些數字,即模數13(0-12),並且值0到12然後等於卡範圍2-A。我試圖從8從A1與此代碼調用一個從A3 0或7:使用變量的批量難度

for %%R in (1 3) do (for %%S in (!a%%R!) do if !b%%R!==4 echo P1 has a !%%S! 4 of a kind 
if !b%%R!==3 echo P1 has a !%%S! 3 of a kind 
if !b%%R!==2 echo P1 has a !%%S! pair) 
for %%T in (2 4) do (for %%U in (!a%%T!) do if !b%%T!==4 echo CP has a !%%U! 4 of a kind 
if !b%%T!==3 echo CP has a !%%U! 3 of a kind 
if !b%%T!==2 echo CP has a !%%U! pair) 

但輸出是簡單的或者「P1具有一對」或「CP具有的種類的3」沒有我需要的價值。 b1到b4不重要,它們只是表示重複卡片的數量,以便識別對等。

我如何收到我的願望,也是輸出,我怎麼能簡化這一點:

set 0=A 
set 1=2 
set 2=3 
set 3=4 
set 4=5 
set 5=6 
set 6=7 
set 7=8 
set 8=9 
set 9=10 
set 10=J 
set 11=Q 
set 12=K 

回答

1

您的代碼有幾個問題。首先,第二個for命令不適當嵌套,因爲它僅適用於第一個if命令。這樣,在第二個和第三個if命令%%S可替換參數是而不是定義。您編寫代碼的方式很難區分這類錯誤,因此我的第一個建議是始終在嵌套命令中使用對齊方式,並以明確標記每個forif構造的末尾的方式放置括號中的括號。下面有一個這樣的格式的例子。

排在第二位,你的代碼會導致在這些動作的痕跡:

%%R = 1 
%%S = !a%%R! = !a1! = a numeric value between 0 and 12 
if !b1!==4 echo P1 has a !%%S! 4 of a kind 

在最後一行%%S有一個數值,所以!%%S!試圖替換其名稱的變量的值是多少!我想你忘記了一個數組在這裏,所以我插入card作爲存儲卡的名稱的數組名,你看到前面:

@echo off 
setlocal EnableDelayedExpansion 

rem Define names of cards 
set i=0 
for %%a in (A 2 3 4 5 6 7 8 9 10 J Q K) do (
    set card!i!=%%a 
    set /A i+=1 
) 

rem The values a1 through a9 are equal to some number that is modulus 13 (0-12) 
for /L %%i in (1,1,9) do set /A a%%i=!random! %% 13 

rem b1 through b4 ... signify the number of repeated cards there are to identify pairs and such. 
set "b1=2" // two cards of b1 type 
set "b2=0" // no cards of b2 type 
set "b3=4" // four cards of b3 type 
set "b4=1" // one card of b4 type 

rem I am trying to call A from 0 from a3 or the 7 from 8 from a1 with this code: 
for %%R in (1 3) do for %%S in (!a%%R!) do (
    if !b%%R!==4 echo P1 has a !card%%S! 4 of a kind 
    if !b%%R!==3 echo P1 has a !card%%S! 3 of a kind 
    if !b%%R!==2 echo P1 has a !card%%S! pair 
) 
for %%T in (2 4) do for %%U in (!a%%T!) do (
    if !b%%T!==4 echo CP has a !card%%U! 4 of a kind 
    if !b%%T!==3 echo CP has a !card%%U! 3 of a kind 
    if !b%%T!==2 echo CP has a !card%%U! pair 
) 

輸出例如:

C:\> test 
P1 has a A pair 
P1 has a Q 4 of a kind 

你也可以做一個進一步的簡化是這樣的:

for %%R in (1 3) do for %%S in (!a%%R!) do (
    if !b%%R! gtr 1 echo P1 has a !card%%S! !b%%R! of a kind 
) 
for %%T in (2 4) do for %%U in (!a%%T!) do (
    if !b%%T! gtr 1 echo CP has a !card%%U! !b%%T! of a kind 
) 

在過去的簡化,還可以定義的「倍數的名稱」的陣列,如「2 =對」,「一種3 = 3」,如果你想要等展現更多精確的結果。

1

要縮短命令集的順序 -

setLocal enableDelayedExpansion 
set i=0 
for %%a in (A 1 2 3 4 5 6 7 8 9 10 J Q K) do (
    set !i!=%%a 
    set /a i+=1 
) 
+0

這似乎並沒有工作,當我嘗試實施它。 – user3093536

+0

由於它使用延遲擴展,爲了顯示變量,你需要回顯'!0!' - '!13!'。 – unclemeat

+0

我的整個腳本都處於延遲擴展狀態,所以我應該將每個%a%更改爲!a !? – user3093536

0

我不能保證你的代碼的邏輯。但是你在每個內部FOR循環中缺少一組括號。正如目前所寫,%%S%%U只是爲每個IF語句定義的。你需要它們分別用於三個語句,就像這樣:

for %%R in (1 3) do (
    for %%S in (!a%%R!) do (
    if !b%%R!==4 echo P1 has a !%%S! 4 of a kind 
    if !b%%R!==3 echo P1 has a !%%S! 3 of a kind 
    if !b%%R!==2 echo P1 has a !%%S! pair 
) 
) 
for %%T in (2 4) do (
    for %%U in (!a%%T!) do (
    if !b%%T!==4 echo CP has a !%%U! 4 of a kind 
    if !b%%T!==3 echo CP has a !%%U! 3 of a kind 
    if !b%%T!==2 echo CP has a !%%U! pair 
) 
) 

或者可以按如下縮短了一點:

for %%R in (1 3) do for %%S in (!a%%R!) do (
    if !b%%R!==4 echo P1 has a !%%S! 4 of a kind 
    if !b%%R!==3 echo P1 has a !%%S! 3 of a kind 
    if !b%%R!==2 echo P1 has a !%%S! pair 
) 
for %%T in (2 4) do for %%U in (!a%%T!) do (
    if !b%%T!==4 echo CP has a !%%U! 4 of a kind 
    if !b%%T!==3 echo CP has a !%%U! 3 of a kind 
    if !b%%T!==2 echo CP has a !%%U! pair 
) 

請注意,有沒有必要不斷地改變用於每個獨立的字母FOR塊。它會同樣使用

for %%R in (1 3) do for %%S in (!a%%R!) do (
    if !b%%R!==4 echo P1 has a !%%S! 4 of a kind 
    if !b%%R!==3 echo P1 has a !%%S! 3 of a kind 
    if !b%%R!==2 echo P1 has a !%%S! pair 
) 
for %%R in (2 4) do for %%S in (!a%%R!) do (
    if !b%%R!==4 echo CP has a !%%S! 4 of a kind 
    if !b%%R!==3 echo CP has a !%%S! 3 of a kind 
    if !b%%R!==2 echo CP has a !%%S! pair 
)