2010-07-01 68 views
2

我正在编写一个名为robocode的编程游戏的程序。问题就在这里:刷新Java参数

void wallScan(boolean While){ 
    stop(); 
    getStraight(); 
    turnGunRight(90); 
    if(startabsolute){ 
     straight=true; 
    } 
    while (While){ 
     ahead(10000000); 
     turnRight(90); 
    } 
    resume(); 
} 

,延续robocode.Robot,但我的问题是在变量While你可能不明白大部分代码。循环不会结束,因为方法只获取一次参数,它是真的,所以方法变成了一个永恒的循环,但是有没有办法刷新方法参数,因为我不想每次调用这个循环时都做一个while循环方法?

+0

你能编辑你的问题并描述'wallScan'应该做什么的方法吗?我看到机器人从一开始就停下来,在最后开始恢复并转动,但在方法内部看不到一些“扫描”操作。 – 2010-07-01 07:03:18

回答

6

你不应该用大写字母来写你的参数。所以它会代替While。但是这是不允许的,因为while是一个关键字。所以首先改变你在方法中传递的参数。

然后你的问题是,你用参数调用方法。由于它是您传递的原始布尔值,因此在执行wallScan方法期间无法从其他方法,调用,类等更改该值,因此while循环从未结束。

相反,您应该例如在包含此方法的类中创建一个成员字段,并给它一个有意义的方法。在这个例子中,我只是把它叫做whileCondition。

void wallScan(){ 
    stop(); 
    getStraight(); 
    turnGunRight(90); 
    if(startabsolute){ 
     straight=true; 
    } 
    while (whileCondition()){ 
     ahead(10000000); 
     turnRight(90); 
    } 
    resume(); 
} 



public void setWhileCondition(boolean bool) { 
     whileCondition = bool; 
    } 

    public boolean isWhileCondition() { 
    return whileCondition; 
    } 

因此,您可以设置导致从方法外部终止while循环的条件。

1

在我看来,你不想要一个布尔值 - 你想要的东西,返回你一个布尔值每次你要求一个。举个简单的例子:

public interface ContinueChecker { 
    boolean shouldContinue(); 
} 

(可怕的名字,但我希望你能拿出更好的东西),然后你可以写:

void wallScan(ContinueChecker checker) { 
    ... 
    while (checker.shouldContinue()) { 
    ... 
    } 
} 

这方面的替代形式将是一个通用接口,如从GuiceProvider<T>之一:

public interface Provider<T> { 
    T get(); 
} 

你的方法可能会采取同样的目的Provider<Boolean>

我个人比起Sebi更喜欢这种方法 - 它允许你的班级代表棋盘本身的状态(或其他) - 一个特定的机器人是否应该停下来并不觉得它应该是同一状态的一部分。据我所见,这种方法在本地是有效的。

+0

我会尝试这一个 – Moyamo 2010-07-01 06:52:22

+0

我得到一个问题,我不能给一个布尔值参数 – Moyamo 2010-07-01 06:56:31

+0

@Moyamo:不,你必须给一个'ContinueChecker'实例返回相关变量。你不能只传递一个参数并让Java定期检查它的值:Java中的参数总是按值传递;他们被评估并且该值成为该参数的初始值。 – 2010-07-01 07:29:05