2

ロボコードというプログラミングゲームのプログラムを書いています。問題はここにあります:

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

robocode.Robot を拡張するため、ほとんどのコードを理解できないかもしれませんが、私の問題は変数にありますWhile。メソッドが引数を1回取得するとループが終了せず、それが真であるため、メソッドは永久ループになりますが、これを呼び出すたびに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 に答える