1

无论这里生成什么数字,我总是得到第一个选项(企鹅)。我似乎看不到我的代码有任何问题,其他人看到有什么问题吗?

{
    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;
    }
}
4

5 回答 5

10

代码片段prand == 1,5,9,10,14,15,19,20一系列表达式,通常称为逗号运算符),其中第一个(或最后一个- 取决于语言)表达式的结果仅用if语句的条件。剩余的表达式被评估并且它们的值被遗忘(请注意这可能会在更复杂的情况下导致严重的副作用。)

目前还不清楚您使用的是什么语言,但是在 C# 中,您可以使用switch 语句来实现您想要的:

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;
}

大多数语言都有这样的声明。有关一般描述,请参阅此维基百科文章

于 2013-04-29T14:27:59.873 回答
3

您误用了逗号运算符。第一个 if 中的表达式是:

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

每个逗号都有一个逗号运算符。逗号运算符的定义是计算第一个表达式(可能的副作用),然后计算第二个;表达式的值是第二个表达式的值。所以你的 if 完全等同于:

if ( 20 )

And20被隐式转换为 a bool,导致 true.

你的编译器应该已经警告你了。某种无用表达的效果。

于 2013-04-29T14:34:53.583 回答
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 或其他具有大量可能值的掷骰子的选择编码。

于 2013-04-29T14:31:33.417 回答
1

如果它是“C”,那么您正在测试逗号运算符的结果。所以 , 的结果prand == 1,5,9,10,14,15,19,20是最后一个元素(顺便说一句,第一个元素是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;
...
}
于 2013-04-29T14:32:10.697 回答
0

您应该使用 or 或 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;
    }
}
于 2013-04-29T14:34:32.610 回答