2016-03-27 2 views
0

Я пытаюсь создать робота в среде robocode. Мой вопрос: если я хочу (например) вызвать метод «fire()» вне моего класса робота (поэтому класс, который расширяет робот и имеет методы runHitBybullet, ...), как это сделать ?Можно ли вызвать метод робота вне «основного» класса роботов?

Это лишь одна из вещей, которые я пробовал (мой последний):

package sample; 

import robocode.HitByBulletEvent; 
import robocode.Robot; 
import robocode.ScannedRobotEvent; 
import sample.Interpretater; 

public class MyFirstRobot extends Robot { 

Interpretater inter; 

public void run() { 
    intel = new Interpretator(); 
    while (true) { 
     ahead(50); // Move ahead 100 
     //turnGunRight(360); // Spin gun around 
     back(50); // Move back 100 
     //turnGunRight(360); // Spin gun around 
    } 
} 

public void onScannedRobot(ScannedRobotEvent e) { 
    /*If I write fire() here, it will work, but I want to call it 
    from some other class (intel)*/ 
    inter.onScan(); 
} 

public void onHitByBullet(HitByBulletEvent e) { 
    turnLeft(90 - e.getBearing()); 
} 
} 

Переводчик код:

образец пакета;

public class Interpretator extends MyFirstRobot 
{ 
public Interpretator(){ 

} 

public void onScan(){ 
    fire(1); //won't work, throws "you cannot call fire() before run()" 
} 
} 

Я не эксперт в области Java на всех, так что, может быть, я что-то не хватает, но я попытался создать другой класс и сделать его расширить мой класс робот (поэтому наследуя методы Robot), но затем бросил Java ошибки, поскольку класс, который расширяет Robot, нуждается в методах run, onHitByBullet ...

+1

Пожалуйста, покажите соответствующий код и ошибки, и т.д. – OldProgrammer

+0

Я добавил их – Dominus

ответ

1

Это похоже на проблему с дизайном.

Ваше решение работает, но когда вы добавите больше методов, чем onScan, вам нужно будет пройти this на каждый звонок вы сделаете из MyFirstRobot

Вместо передать ссылку на this в конструкторе Interpretater в.

Ошибка возникает из-за того, что Interpretator расширяет MyFirstRobot. Когда вы вызываете fire(1) без ссылки на робот, он вызывает его на Interpretator, который еще не запускал run(). Похоже, вы используете интерпретатор только в качестве ссылки для принятия решений на основе робота, поэтому Interpretator не является роботом.

внесения этих изменений (наряду с форматированием) получает:

package sample; 

import robocode.HitByBulletEvent; 
import robocode.Robot; 
import robocode.ScannedRobotEvent; 
import sample.Interpretater; 

public class MyFirstRobot extends Robot { 

    Interpretater inter; 

    public void run() { 
     inter = new Interpretator(this); // intel looked like a typo 
     while (true) { 
      ahead(50); // Move ahead 100 
      // turnGunRight(360); // Spin gun around 
      back(50); // Move back 100 
      // turnGunRight(360); // Spin gun around 
     } 
    } 

    public void onScannedRobot(ScannedRobotEvent e) { 
     /* 
     * If I write fire() here, it will work, but I want to call it from some 
     * other class (intel) 
     */ 
     inter.onScan(); 
    } 

    public void onHitByBullet(HitByBulletEvent e) { 
     turnLeft(90 - e.getBearing()); 
    } 
} 

и

public class Interpretator { 

    MyFirstRobot robot; 

    public Interpretator(MyFirstRobot robot_arg) { 
     // constructor sets instance variable 
     robot = robot_arg; 
    } 

    public void onScan() { 
     robot.fire(1); // use reference 
    } 
} 
+0

Ах да, что хорошо выглядит на самом деле , Большое спасибо ! – Dominus

0

Возможный ответ, который я нашел, чтобы изменить Intepreter.onScan() таким образом, что она выглядит как

public class Interpretator extends MyFirstRobot 
{ 
public Interpretator(){ 

} 

    public void onScan(MyFirstRobot robot){ 
     robot.fire(1); 
    } 
} 

И в onScannedRobot просто положить в качестве параметра это.

Дайте лучший ответ, если он у вас есть.

Смежные вопросы