无论在这里产生什么数字,我总是得到第一个选项(企鹅)。我似乎无法看到我的代码有任何问题,其他人都看到了什么问题?
{
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;
}
}
答案 0 :(得分:10)
代码片段prand == 1,5,9,10,14,15,19,20
是一个表达式序列(,
通常称为逗号运算符),其结果为: first (或 last - 取决于语言)表达式 only 用作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。
答案 1 :(得分:3)
你误用了逗号运算符。第一个表达式 如果是:
if ( (prand == 1), (5), (9), (10), (14), (15), (19), (20) )
每个逗号都是逗号运算符。的定义 逗号运算符是为了评估第一个表达式(for 可能的副作用),然后评估第二;的价值 表达式是第二个表达式的值。所以你的 如果变得完全等同于:
if ( 20 )
并且20
被隐式转换为bool
,从而导致
true
。
您的编译器应该已经警告过您。要做的事 无用表达的影响。
答案 2 :(得分: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)
这是因为==
是一个二元运算符,它采用两个兼容类型的值。
在这种情况下,最好使用switch ... case语句,正如@Ondrej所解释的那样。
我可以想到至少两种模拟掷骰子的方法(看起来你正试图这样做:
为每个选项使用连续值:
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
}
将不同的可能性存储在std::list<std::set<int>>
中。然后,您可以迭代列表中的集合,并使用std::set.contains()
方法检查当前集合是否包含该值。这具有可伸缩性的优点。例如,它可以更容易地为1d100或其他具有大量可能值的骰子卷进行编码。
答案 3 :(得分: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;
...
}
答案 4 :(得分:0)
您应该使用或者或切换语句。例如,if if
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;
}
}