我开始询问Robocode机器人。我有一个代码用于我的机器人和我的26个朋友,它来到了第11位。但是,我想尝试让它变得更好。我查看了网站并调整了我的代码,以便它可以无法预测地移动。这有助于它在十轮中获得第一名。能否请您给我一些想法和建议,以帮助改进这个机器人?然后我可以编辑我的机器人,看看它是如何做的。我希望机器人留在扩展机器人中。
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);
}
}
答案 0 :(得分:3)
首先编写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
}
访问此页面以观看所有robocode API http://robocode.sourceforge.net/docs/robocode/
:D再见,弗兰克
答案 1 :(得分:2)
而不是随意转动,使你的一面朝向你扫描的机器人。通过这种方式,您可以轻松地左右移动并避开子弹。你可以随意地横向移动,也可以只在你注册其他机器人能量等级的变化时移动,因为这可能意味着他们向你射击。
此外,你应该有更好的方法来瞄准敌人。当你看到它们时,你会在子弹到达它们的时候开火,但它们可能已经移动了。你可以使用基本的三角学来猜测当子弹到达时敌人的位置。
答案 2 :(得分:1)
robowiki有关于所有顶级漫游器的信息 - 这应该可以帮到你。我已经完成了一些机器人编码,并发现波浪冲浪以及模式匹配枪可能与你对抗大多数机器人一样好,但是花了我几个月的时间来进行模式匹配和冲浪到足够的在一定程度上拼凑出一个体面的实施。即使这样,当代码丢失时,我也没有足够的知识来重新实现它。