Нужна помощь, чтобы сделать хороший робот Robocode - PullRequest
2 голосов
/ 16 марта 2012

Я пришел спросить о роботах Robocode. У меня есть код для моих роботов, и против 26 моих друзей он стал 11-м. Однако я хочу попытаться сделать это лучше. Я просмотрел сайты и скорректировал свой код, чтобы он мог двигаться непредсказуемо. Это помогло прийти 1 раз в десять раундов. Не могли бы вы дать мне несколько идей и советов, чтобы помочь улучшить этого робота? Затем я могу отредактировать своего робота и посмотреть, как он работает. Я хочу, чтобы робот оставался в Удлиненном Роботе.

package aaa;
import robocode.*;
//import java.awt.Color;

// API help: http://robocode.sourceforge.net/docs/robocode/robocode/Robot.html

/**  
 *Epictron - a robot by ASHAR ASLAM!!!
 */
public class Epictron extends Robot
{
    /**
     * run: Epictron's default behavior
     */
    public void run() {
        // Initialization of the robot should be put here
        // After trying out your robot, try uncommenting the import at the top,
        // and the next line:
        // setColors(Color.blue,Color.blue,Color.grey,Color.red,Color.green); // body,gun,radar
        // Robot main loop
        while(true) {
            // Replace the next 4 lines with any behavior you would like
            double distance = Math.random()*300;
            double angle = Math.random()*45;
            turnRight(angle);
            ahead(distance);
            ahead(100);
            turnGunRight(90);
            back(100);
            turnGunRight(90);
        }
    }

    /**
     * onScannedRobot: What to do when you see another robot
     */
    public void onScannedRobot(ScannedRobotEvent e) {
        // Replace the next line with any behavior you would like
        double distance = e.getDistance();

        if(distance<200)
        {
           fire(3.5);
        }
        else if(distance<500)
        {
           fire(2.5);
        }
        else if(distance<800)
        {
           fire(1.5);
        }
        else
        {
           fire(0.5);
        }
    }

    /**
     * onHitByBullet: What to do when you're hit by a bullet
     */
    public void onHitByBullet(HitByBulletEvent e) {
        // Replace the next line with any behavior you would like
        back(10);
    }

    /**
     * onHitWall: What to do when you hit a wall
     */
    public void onHitWall(HitWallEvent e) {
        // Replace the next line with any behavior you would like
        back(20);
    }   
}

Ответы [ 3 ]

3 голосов
/ 18 июля 2016

Сначала напишите метод OnScannedRobot.

Не используйте случайные значения, потому что это неточно.

Радар указывает на одинаковый угол наклона пистолета. Итак, когда радар указывает на робота и сканирует его, робот стреляет.

Метод onScanned () вызывается, когда радар сканирует робота.

public void onScannedRobot(ScannedRobotEvent e){
    double distance = e.getDistance(); //get the distance of the scanned robot
    if(distance > 800) //this conditions adjust the fire force according the distance of the scanned robot.
        fire(5);
    else if(distance > 600 && distance <= 800)
        fire(4);
    else if(distance > 400 && distance <= 600)
        fire(3);
    else if(distance > 200 && distance <= 400)
        fire(2);
    else if(distance < 200)
        fire(1);
}

Итак, теперь мы пишем метод run ().

Мы пишем только в цикле. Итак, цикл повторяет одни и те же операции каждую секунду.

Чтобы просканировать всю зону, мы поворачиваем пистолет на 360 градусов.

while(true){
    ahead(100); //Go ahead 100 pixels
    turnGunRight(360); //scan
    back(75); //Go back 75 pixels
    turnGunRight(360); //scan

    //For each second the robot go ahead 25 pixels.
}

Теперь робот будет двигаться вперед со скоростью 25 пикселей в секунду.

Рано или поздно робот достигнет стены карты.

Робот может быть заблокирован, когда достигнет стены.

Мы решим, используя метод onHitWall ().

public void onHitWall(HitWallEvent e){
    double bearing = e.getBearing(); //get the bearing of the wall
    turnRight(-bearing); //This isn't accurate but release your robot.
    ahead(100); //The robot goes away from the wall.
}

Вы хотите создать трус робота: D? Используйте метод onHitByBullet (), чтобы уйти, если энергия мала. Когда робот поражен пулей, этот метод называется.

double energy = getEnergy();
public void onHitByBullet(HitByBulletEvent e){
    double bearing = e.getBearing(); //Get the direction which is arrived the bullet.
    if(energy < 100){ // if the energy is low, the robot go away from the enemy
        turnRight(-bearing); //This isn't accurate but release your robot.
        ahead(100); //The robot goes away from the enemy.
    }
    else
        turnRight(360); // scan
}

посетите эту страницу, чтобы посмотреть все API Robocode http://robocode.sourceforge.net/docs/robocode/

: D до свидания, Фрэнк

2 голосов
/ 21 августа 2012

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

Также у вас должен быть лучший способ нацеливаться на врага.Когда вы видите их, вы стреляете, и к тому времени, как пуля достигает их, они, вероятно, уже сместились.Вы можете использовать базовую тригонометрию, чтобы угадать, где будет находиться противник, когда пуля достигнет его.

1 голос
/ 16 марта 2012

robowiki содержит информацию обо всех лучших ботах - это должно вам помочь.Я провел небольшое робокодирование и обнаружил, что волновой серфинг вместе с пистолетом для сопоставления с образцом, вероятно, так же хорош, как вы собираетесь противостоять большинству ботов, но мне потребовались месяцы, чтобы освоить сопоставление с образцом и волновым серфингом.степень, чтобы собрать воедино полуприличную реализацию.Даже тогда у меня не было достаточно знаний, чтобы заново реализовать их, когда код был утерян.

...