Обновить аргумент Java - PullRequest
       23

Обновить аргумент Java

2 голосов
/ 01 июля 2010

Я пишу программу для игры под названием robocode. Проблема здесь:

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

Вы можете не понимать большую часть кода, так как он расширяет robocode.Robot, но моя проблема в переменной While. Цикл не заканчивается, так как метод получает аргумент один раз, и это правда, поэтому метод становится вечным циклом, но есть ли способ обновить аргумент метода, так как я не хочу делать цикл while каждый раз, когда я вызываю метод

Ответы [ 2 ]

6 голосов
/ 01 июля 2010

Не следует указывать параметры заглавными буквами. Так было бы пока вместо Пока. Однако это не разрешено, поскольку 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 голос
/ 01 июля 2010

Мне кажется, что вам не нужно единственное логическое значение - вы хотите что-то, что будет возвращать вам логическое значение каждый раз, когда вы запрашиваете одно.В качестве простого примера:

public interface ContinueChecker {
  boolean shouldContinue();
}

(Ужасные имена, но, надеюсь, вы сможете придумать что-нибудь получше.) Затем вы можете написать:

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

Альтернативной формой этого будетуниверсальный интерфейс, такой как Provider<T> один из Guice :

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

Ваш метод может занять Provider<Boolean> для той же цели.

Лично я предпочитаюэтот подход по сравнению с подходом Sebi - он позволяет вашему классу представлять состояние самой доски (или чего-то еще) - должен ли один конкретный робот остановиться, не похоже, что он должен быть частью того же состояния.Насколько я понимаю, он эффективен для данного метода.

...