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) )

各コンマはコンマ演算子です。コンマ演算子の定義は、最初の式を評価して (考えられる副作用のために)、次に 2 番目の式を評価することです。式の値は、2 番目の式の値です。したがって、 if は次のものとまったく同じになります。

if ( 20 )

And20は暗黙的に に変換され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)

これは==、互換性のある型の 2 つの値を取る二項演算子であるためです。

この状況では、@Ondrej が説明したように、switch...case ステートメントが推奨されます。

サイコロのロールをシミュレートするための少なくとも2つの代替方法を考えることができます(あなたがやろうとしているようです:

  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 に答える