我需要遍历一个数字(xx)。 xx始终从零开始。我的问题是,如果moveDirection
变量为+1,则xx会增加,直到达到range
的正数。如果moveDirection
为-1,则xx会减小,直到达到range
的负数。
在下面的代码中,我首先对moveDirection进行了if语句测试,然后我复制了for循环,并编辑了每个case的值。我的代码恰好在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循环?如果有任何其他建议,将不胜感激。
答案 0 :(得分:10)
for (xx = 0; xx != range; xx += moveDirection)
{
if (hitTestPoint(xx, yy))
{
return true;
}
}
这假设moveDirection分别为1或-1,分别为up或down。此外,您必须稍微改变您的范围才能使!=正常工作。但是,它确实减少了代码。
答案 1 :(得分: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;
答案 2 :(得分:1)
另一种可能性:
int i;
for (i = abs(range), xx = 0; --i >= 0; xx += moveDirection){
if (hitTestPoint(xx, yy) return true;
}
答案 3 :(得分:0)
这是Java中的一个例子(see also on 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
如果您想要适应非单位步骤,最简单的方法是定义第三个参数,如下所示:
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