2013-04-29 153 views
1

不管在這裏生成什麼數字,我總是得到第一個選項(企鵝)。我似乎無法看到我的代碼有任何問題,其他人看到有什麼問題?if條件中的多個條件

{ 
    srand(time(0)); 
    prand = (rand() % 20); 
    if (prand == 1,5,9,10,14,15,19,20){ 
     entity = "penguins"; 
     srand(time(0)); 
     pquantity = (rand() % 8) + 2; 
    } 
    else if (prand == 2,6,11,16,18){ 
     entity = "troll"; 
     pquantity = 1; 
    } 
    else if (prand == 3,7,12,17){ 
     entity = "goblin"; 
     pquantity = 1; 
    } 
    else if (prand == 4,8,13){ 
     entity = "wizard"; 
     pquantity = 1; 
    } 
} 
+2

哪種語言? – 2013-04-29 14:26:53

+0

這是什麼語言? C也許?請添加一個合適的語言標籤(在您的問題下面有一個編輯鏈接) – 2013-04-29 14:27:03

+0

'1,5,9,10,14,15,19,20'是一個字符串還是一個多值數組? – 2013-04-29 14:27:31

回答

10

的代碼片段prand == 1,5,9,10,14,15,19,20序列的表達(該,通常所知的逗號操作),其中的結果第一(或最後 - 取決於語言)表達式只有用作if語句的條件。其餘的表達式被評估並且它們的值被遺忘(請注意這可能會導致在更復雜的情況下出現嚴重的副作用)。

這不是很清楚你使用的是什麼語言,但是在C#中,你可以使用switch statement實現你想要的:

switch (prand) 
{ 
    // first set of options 
    case 1: 
    case 5: 
    … 
    case 20: 
     // your code here 
     break; 

    // second set of options 
    case 2: 
    case 6: 
    … 
    case 18: 
     // your code here 
     break; 

    default: 
     // all other options not listed above 
     break; 
} 

大多數語言都有這樣的說法。有關一般描述,請參見此wikipedia article

+4

如果是C或C++,那麼使用* last *表達式的結果,這就是爲什麼總是輸入「if」的原因。 – 2013-04-29 14:31:43

+0

@Damien_The_Unbeliever對,謝謝。澄清我的答案是多一點語言中立。 – 2013-04-29 14:33:45

+0

如果代碼是C或C++,那麼* last *表達式的結果是重要的。嘗試'int i = 1; if(i == 1,0){cout <<「1,0!」 << endl; } if(i == 2,99){cout <<「2,99!」 << endl; }' – 2013-04-29 14:35:23

1
if (prand == 1,5,9,10,14,15,19,20) 

雖然這是有效的C++並將編譯,它不會做你的期望。你需要的變量依次比較各值:

if (prand == 1 || prand == 5 || prand == 9 || prand == 10 || prand == 14 || prand == 15 || prand == 19 || prand == 20) 

這是因爲==是一個二元運算符這需要兼容類型的兩個值。

在這種情況下,@Ondrej解釋過,switch ... case語句是首選。

我能想到的至少兩種替代方式來模擬一個骰子(它似乎你正在嘗試做的:

  1. 使用連續的值,爲每個選項:

    if (prand >= 1 && prand <= 8) { 
        // ... 
    } else if (prand >= 9 && prand <= 13) { 
        // ... 
    } else if (prand >= 14 && prand <= 17) { 
        // ... 
    } else if (prand >= 18 && prand <= 20) { 
        // ... 
    } else { 
        // Print an error message 
    } 
    
  2. 將不同的可能性存儲在std::list<std::set<int>>中,然後您可以遍歷列表中的集合並使用std::set.contains()方法來檢查當前集合是否包含該值,這具有可伸縮性的優勢。使用大量可能的值編碼1d100或其他骰子卷的選項。

+0

很好的解決方案。但是'prand'永遠不會等於20,但它可以是0.所以你會得到一個錯誤信息。遲早...... – TrueY 2013-04-30 08:03:23

+0

@真誠的好點。我沒有看到「prand」的初始化,因爲這不是OP問題的核心部分。當然這很容易解決:'int prand =(rand()%20)+1;' – 2013-05-01 02:15:49

1

如果它是「C」那麼您正在測試逗號運算符的結果。所以prand == 1,5,9,10,14,15,19,20的結果是最後一個元素(BTW的第一個元素是prand == 1)。這是20這是永遠是真的。

我建議建立一個數組,並檢查它的元素...

enum Being_t {BEING_PENGUIN, BEING_TROLL, BEING_GOBLIN, BEING_WIZARD}; 
enum Being_t arr[20] = {BEING_PENGUIN, BEING_TROLL, BEING_GOBLIN, BEING_WIZARD, 
    BEING_PENGUIN, BEING_TROLL, BEING_GOBLIN, BEING_WIZARD, ...}; 

那麼你可以使用一個開關

srand(time(0)); 
prand = (rand() % 20); 
switch (arr[prand]) { 
case BEING_PENGUIN: 
    ... 
    break; 
... 
} 
+0

+1 Nice替代解決方案! – 2013-05-01 02:20:39

0

您應該使用或公司或switch語句。例如,如果

if (prand == 1 || prand == 5 || prand == 9 || prand == 10 || prand == 14|| prand == 15|| prand == 19|| prand == 20) 
{ 
     // your code here 
} 

,並與開關

switch (prand) 
{ 
    case 1: 
    { 

     // your code here 

     break; 
    } 
    case 5: 
    { 

     // your code here 

     break; 
    } 
    case 9: 
    { 

     // your code here 

     break; 
    } 
    case 10: 
    { 

     // your code here 

     break; 
    } 
    case 14: 
    { 

     // your code here 

     break; 
    } 
    case 15: 
    { 

     // your code here 

     break; 
    } 
    case 19: 
    { 

     // your code here 

     break; 
    } 
    case 20: 
    { 

     // your code here 

     break; 
    } 
} 
3

你濫用逗號操作符。在第一 表達如果是:

if ((prand == 1), (5), (9), (10), (14), (15), (19), (20)) 

與每個逗號逗號運算符。逗號運算符的定義是評估第一個表達式(對於 可能的副作用),然後評估第二個表達式; 的值是第二個表達式的值。所以,你如果 成爲完全等效:

if (20) 

而且20被隱式轉換爲bool,導致 true

您的編譯器應該已經向您發出警告。有些東西給 一個無用表達式的影響。