0

以下は、乱数を取り、スプライトが同じ位置で連続して繰り返されるようにする、私が書いたメソッドです。すべての新しいスプライトが他の 2 つの異なる位置を取るように変更したいと考えています。私は本当にそれを正しく理解していません。助けてください。

- (float)randomlyChooseXValue    {
    CGSize s = [[CCDirector sharedDirector] winSize];

    int randX = arc4random() % 3;

    if (oldRandX != randX) {
        if (randX == 0) {
            xPos = xPos1*(s.width/480.0);
        } else if (randX == 1)    {
            xPos = xPos2*(s.width/480.0);
        } else {
            xPos = xPos3*(s.width/480.0);
        }
        oldRandX = randX;
    } else {
        [self randomlyChooseXValue];
    }
    return xPos;
}
4

2 に答える 2

0

シーケンスを繰り返しても問題ないと説明したので、最初の位置と方向の 2 つのランダムな選択を行うだけで済みます。

// somewhere, initialize global oldRandX = -1, dir = -1

- (float)randomlyChooseXValue    {
    CGSize s = [[CCDirector sharedDirector] winSize];

    if (oldRandX < 0) {
        oldRandX = arc4random() % 3;
        dir = arc4random() % 2;
    } else if (dir) {
        oldRandX = (oldRandX + 1) % 3;
    } else {
        oldRandX = (oldRandX + 2) % 3;
    }

    if (randX == 0) {
        xPos = xPos1*(s.width/480.0);
    } else if (randX == 1)    {
        xPos = xPos2*(s.width/480.0);
    } else {
        xPos = xPos3*(s.width/480.0);
    }

    return xPos;
}

これにより、3 つの位置のすべての可能なシーケンスを生成できます。

  • 0、1、2
  • 0、2、1
  • 1、2、0
  • 1、0、2
  • 2、0、1
  • 2、1、0

そしてそれらを繰り返します。

他の答えでも同じ結果が得られますが、元の方法と同様に、それを得るには数回の試行が必要になる場合があります。ランダム関数は、無制限に間違った値を選択し続ける可能性があります。選択できる正しい数字が 1 つしかない場合は、さらに深刻な問題になります。

于 2013-06-10T16:16:24.523 に答える
0

私がこれを正しく理解している場合は、3 つのランダム値を見つける必要があり、3 番目の値は最初の 2 とは異なるはずです。これが当てはまる場合は、最後の 2 つのランダム値を保存し、最初のifステートメントでそれらを比較する必要があります。

- (float)randomlyChooseXValue    {
    CGSize s = [[CCDirector sharedDirector] winSize];

    int randX = arc4random() % 3;

    if ((oldRandX1 != randX) && (oldRandX2 != randX)) { //check for 2 values
        if (randX == 0) {
            xPos = xPos1*(s.width/480.0);
        } else if (randX == 1)    {
            xPos = xPos2*(s.width/480.0);
        } else {
            xPos = xPos3*(s.width/480.0);
        }
        oldRandX2 = oldRandX1; //store 1st value to 2nd place
        oldRandX1 = randX; //store new value to 1st place
    } else {
        [self randomlyChooseXValue];
    }
    return xPos;
}
于 2013-06-10T09:44:36.140 に答える