2

我正在为一个名为 robocode 的编程游戏编写程序。问题在这里:

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

您可能不理解大部分代码,因为它扩展了 robocode.Robot,但我的问题在于变量While. 循环不会结束,因为方法获取参数一次并且它是正确的,因此该方法成为一个永恒的循环,但是有没有办法刷新方法参数,因为我不想每次调用它时都创建一个 while 循环方法?

4

2 回答 2

6

你不应该用大写字母写你的参数。所以它会是while而不是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 循环终止的条件。

于 2010-07-01T06:31:26.030 回答
1

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

public interface ContinueChecker {
  boolean shouldContinue();
}

(可怕的名字,但希望你能想出更好的名字。)然后你可以写:

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

另一种形式是通用接口,例如Provider<T>来自Guice的接口:

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

您的方法可以Provider<Boolean>用于相同的目的。

就我个人而言,我更喜欢这种方法而不是 Sebi 的方法——它允许你的类表示板本身(或其他)的状态——一个特定的机器人是否应该停止并不觉得它应该是同一状态的一部分。据我所知,它实际上是这种方法的本地化。

于 2010-07-01T06:32:09.970 回答