2016-03-27 2 views
0

Ich versuche einen Roboter in der Robocode-Umgebung zu machen. Meine Frage ist, ob ich zum Beispiel die Methode "fire()" außerhalb meiner Roboterklasse aufrufen möchte (also die Klasse, die Robot erweitert und die Methoden run, onHitBybullet, ... hat), wie mache ich das? ?Ist es möglich, eine Robotermethode außerhalb der Roboterklasse "Haupt" aufzurufen?

Dies ist nur eines der Dinge, die ich versucht (meine letzte):

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()); 
} 
} 

Interpreter Code:

Paket Probe;

public class Interpretator extends MyFirstRobot 
{ 
public Interpretator(){ 

} 

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

Ich bin kein Experte in Java überhaupt, vielleicht bin ich etwas fehlt, aber ich versuchte, eine andere Klasse zu schaffen und macht es meine Roboter-Klasse erweitern (daher der Roboter Methoden vererben), aber dann java warf Fehler seit einer Klasse, die erweitert wird Robot benötigt die Methoden run, onHitByBullet ..

+1

zeigen Bitte einen entsprechenden Code und Fehler usw. – OldProgrammer

+0

Ich habe sie hinzugefügt – Dominus

Antwort

1

Dies scheint ein Design-Problem.

Ihre Lösung funktioniert, aber wenn Sie mehr Methoden als onScan hinzufügen, müssen Sie this passieren zu jeder Sie von MyFirstRobot machen rufen

Stattdessen einen Verweis auf this in Interpretater Konstruktor übergeben.

Ihr Fehler tritt auf, weil Interpretator MyFirstRobot erweitert. Wenn Sie fire(1) ohne die Robotereferenz aufrufen, ruft es es auf Interpretator auf, das run() noch nicht ausgeführt hat. Es sieht so aus, als ob Sie Interpretator nur als Referenz verwenden, um Entscheidungen basierend auf dem Roboter zu treffen. Der Interpretator ist also kein Roboter.

diese Änderungen zu machen (zusammen mit Formatierung) erhält:

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()); 
    } 
} 

und

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

Ah ja, das sieht ja gut , vielen Dank ! – Dominus

0

Eine mögliche Antwort, die ich gefunden habe, ist Intepreter.onScan zu ändern(), so dass es wie

public class Interpretator extends MyFirstRobot 
{ 
public Interpretator(){ 

} 

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

Und im onScannedRobot sieht einfach als Parameter setzen diese.

Geben Sie eine bessere Antwort, wenn Sie eine haben.