4

番号(xx)をループする必要があります。xxは常にゼロから始まります。私の問題は、moveDirection変数が+1の場合、正の値に達するまでxxが増加することですrange。が-1の場合moveDirection、xxはの負の値に達するまで減少しrangeます。

以下のコードでは、最初にmoveDirectionのifステートメントテストを実行してこれを実行し、次にforループを複製して、それぞれの場合の値を編集しました。私のコードはたまたまActionScript3にありますが、言語は関係ありません。

var p:Point;
var xx:int;

if (moveDirection > 0)
{
    for (xx = 0; xx < range; xx++)
    {
        if (hitTestPoint(xx, yy))
        {
            return true;
        }
    }
}
else 
{
    for (xx = 0; xx > range; xx--)
    {
        if (hitTestPoint(xx, yy))
        {
            return true;
        }
    }
}

forループを複製せずに、これを行うためのより良い方法はありますか?他にアドバイスがありましたら、よろしくお願いします。

4

4 に答える 4

10
for (xx = 0; xx != range; xx += moveDirection)
{
    if (hitTestPoint(xx, yy))
    {
        return true;
    }
}

これは、moveDirectionが上または下にそれぞれ1または-1になることを前提としています。また、!=が正しく機能するには、範囲を少し変更する必要があります。しかし、それはコードを削減します。

于 2010-07-06T22:19:28.790 に答える
1

別の可能性:

int i;
for (i = abs(range), xx = 0; --i >= 0; xx += moveDirection){
  if (hitTestPoint(xx, yy) return true;
}
于 2010-07-07T13:17:10.210 に答える
1

コードの見た目からは、ループがどちらの方向に実行されるかは実際には重要ではありません。範囲内の値が返されたtrue場合hitTestPointに返されるだけです。trueその場合、別の可能性は次のようになります。

var start:int = min(0, range);
var stop:int = max(0, range);

for (xx = start; xx!=stop; xx++)
    if (hitTestPoint(xx,yy)
        return true;
于 2010-07-06T22:31:29.920 に答える
0

これがJavaの例です(ideone.comも参照してください)。

static void go(final int range, final int direction) {
    for (int i = 0; i != direction*range; i += direction) {
        System.out.println(i);
    }       
}

次に、次のことができます。

        go(5, +1); // 0, 1, 2, 3, 4
        go(5, -1); // 0, -1, -2, -3, -4

非単位ステップに対応する場合は、次のように3番目のパラメーターを定義するのが最も簡単です。

static void go(final int range, final int step, final int direction) {
    for (int i = 0; i < range; i += step) {
        System.out.println(i * direction);
    }       
}

次に、次のことができます。

        go(10, 3, +1); // 0, 3, 6, 9
        go(10, 3, -1); // 0, -3, -6, -9
于 2010-07-06T22:19:01.900 に答える