Java 你能解释一下机器人代码的意思吗?
我不明白这个方法到底在做什么。有人能给我解释一下这个动作吗Java 你能解释一下机器人代码的意思吗?,java,robocode,Java,Robocode,我不明白这个方法到底在做什么。有人能给我解释一下这个动作吗 public void onScannedRobot(ScannedRobotEvent e) { setTurnRadarLeftRadians(getRadarTurnRemaining()); setTurnRight(e.getBearing() + 90.0D - dir / 33.0D); if (((Guppy.var = var - e.getEnergy()) <= 3) &
public void onScannedRobot(ScannedRobotEvent e)
{
setTurnRadarLeftRadians(getRadarTurnRemaining());
setTurnRight(e.getBearing() + 90.0D - dir / 33.0D);
if (((Guppy.var = var - e.getEnergy()) <= 3) && (var > 0.0D))
{
setMaxVelocity(Math.random() * 9.0D + 3);
setAhead(Guppy.dir = dir * type);
}
setTurnGunRightRadians(Math.sin((Guppy.var = e.getBearingRadians() + getHeadingRadians()) - getGunHeadingRadians() + Math.asin((vel * 0.4D + e.getVelocity() * 0.6D) / 14.0D * Math.sin(e.getHeadingRadians() - var))));
if (getGunHeat() == 0.0D)
{
setFire(2.9D);
vel = e.getVelocity();
}
var = e.getEnergy();
}
CannedRobot上的公共空间(ScannedRobotEvent e)
{
setTurnRadarLeftRadians(getRadarTurnRestaining());
设置右转(例如getBearing()+90.0D-dir/33.0D);
如果(((Guppy.var=var-e.getEnergy())0.0D))
{
setMaxVelocity(Math.random()*9.0D+3);
setAhead(Guppy.dir=dir*type);
}
setTurnGunRightRadians(Math.sin((Guppy.var=e.getBearingRadians()+getHeadingRadians())-getGunHeadingRadians()+Math.asin((vel*0.4D+e.getVelocity()*0.6D)/14.0D*Math.sin(e.getHeadingRadians()-var));
如果(getGunHeat()==0.0D)
{
setFire(2.9D);
vel=e.getVelocity();
}
var=e.getEnergy();
}
public void onScannedRobot(ScannedRobotEvent e)//对于您的机器人看到的每个机器人{
setTurnRadarLeftRadians(getRadarTurnRestaining());//将机器人的雷达设置为向左转弯弧度
setTurnRight(e.getBearing()+90.0D-dir/33.0D);//将机器人的身体设置为逐渐右转,基本上你依赖于你的敌人
如果(((Guppy.var=var-e.getEnergy())0.0D))
{
setMaxVelocity(Math.random()*9.0D+3);//如果机器人的移动速度低于规则,则设置机器人的最大速度(以像素/圈为单位)。最大速度(8像素/圈)。
setAhead(Guppy.dir=dir*type);
}
setTurnGunRightRadians(Math.sin((Guppy.var=e.getBearingRadians()+getHeadingRadians())-getGunHeadingRadians()+Math.asin((vel*0.4D+e.getVelocity()*0.6D)/14.0D*Math.sin(e.getHeadingRadians()-var));
如果(getGunHeat()==0.0D)
{
setFire(2.9D);//子弹的伤害有多大。伤害越大=消耗的能量越大
vel=e.getVelocity();//获取敌人的速度
}
var=e.getEnergy();//获取敌人的能量
}
如果你愿意,你可以玩我的这些小项目:
package sample;
import robocode.*;
import java.awt.Color;
import java.awt.geom.*;
import java.lang.*; // for Double and Integer objects
import java.util.*; // for collection of waves
import robocode.util.Utils;
import robocode.RobotDeathEvent;
import robocode.Rules;
import robocode.ScannedRobotEvent;
import robocode.util.Utils;
/*
A Robocode that implements the smart targeting(always attack on the nearest opponent) and circles around them
*/
public class Tutorial extends AdvancedRobot
{ boolean movingForward;
boolean peek; // Don't turn if there's a robot there
double moveAmount; // How much to move
byte moveDirection= 1;
int tooCloseToWall = 0;
int wallMargin = 60;
static final double GUN_FACTOR = 30;
static final double AIM_FACTOR = 25;
static final int AIM_START = 10;
static final int FIRE_FACTOR = 100;
private long currTime;
static final long RADARTIMEOUT = 20;
static double xForce;
static double yForce;
static double lastDistance;
private boolean radarScan;
private long lastscan;
public void run(){
setAdjustRadarForGunTurn(true);
setAdjustGunForRobotTurn(true);
// Sets these colors (robot parts): body, gun, radar, bullet, scan_arc
setBodyColor(new Color(255, 255, 255));
setGunColor(new Color(255, 255, 255));
setRadarColor(new Color(255, 255, 255));
setBulletColor(new Color(0, 0, 0));
setScanColor(new Color(255, 255, 255));
while(true) {
currTime = getTime();
turnRadarRightRadians(Double.POSITIVE_INFINITY);
turnRadarLeftRadians(Double.POSITIVE_INFINITY);
radarScan = true;
}
}
public void onScannedRobot(ScannedRobotEvent e) {
double absoluteBearing = e.getBearingRadians()+ getHeadingRadians();
double distance = e.getDistance();
double bulletPower ;
double headingRadians = getHeadingRadians();
boolean fired = false;
if(getOthers() >= 2){
xForce = xForce *.80- Math.sin(absoluteBearing) / distance;
yForce = yForce *.80 - Math.cos(absoluteBearing) / distance;
setTurnRightRadians(Utils.normalRelativeAngle(
Math.atan2(xForce + 1/getX() - 1/(getBattleFieldWidth() - getX()),
yForce + 1/getY() - 1/(getBattleFieldHeight() - getY()))
- getHeadingRadians()) );
setAhead(150- Math.abs(getTurnRemaining()));//speed
bulletPower = ( distance > 850 ? 0.1 : (distance > 700 ? 0.49 : (distance > 250 ? 1.9 : 3.0)));
bulletPower = Math.min( getEnergy()/5, Math.min( (e.getEnergy()/4) + 0.2, bulletPower));
if ((getGunHeat() <= 3.0) && (getGunTurnRemaining() == 0.0) && (bulletPower > 0.0) && (getEnergy() > 9.1)) {
// Only fire the gun when it is locked and loaded, do a radarsweep afterwards.
bulletPower=3;
setFire( bulletPower);
fired = true;
}
if ((fired == true) || (currTime >= (lastscan + RADARTIMEOUT))) {
setTurnRadarRightRadians( Double.NEGATIVE_INFINITY * Utils.normalRelativeAngle( absoluteBearing- getRadarHeadingRadians()));
lastscan = currTime;
radarScan = true;
}
// when not firing, lock on target.
//setTurnRadarRightRadians( 2.2 * Utils.normalRelativeAngle( absoluteBearing - getRadarHeadingRadians()));
//radarScan = false;
lastDistance = Double.POSITIVE_INFINITY;
setTurnRadarLeft(getRadarTurnRemaining());
setTurnRadarRight(getRadarTurnRemaining());
if(lastDistance+20 > distance){
lastDistance = distance;
if(getGunHeat() < .1){
setTurnRadarLeft(getRadarTurnRemaining());
setTurnRadarRight(getRadarTurnRemaining());
clearAllEvents();
}
setTurnGunRightRadians(robocode.util.Utils.normalRelativeAngle(absoluteBearing - getGunHeadingRadians() + Math.max(1 - distance / (40), 0) * (e.getVelocity() / (AIM_START + Math.pow(AIM_FACTOR, distance))) * Math.sin(e.getHeadingRadians() - absoluteBearing) ));
}
}
if(getOthers() == 1){
setBodyColor(new Color(255, 0, 0));
setGunColor(new Color(255, 0, 0));
setRadarColor(new Color(255, 0, 0));
setBulletColor(new Color(255, 0, 0));
setScanColor(new Color(255, 0, 0));
double bulletPower1 = 3;
if(distance >= 700){
lastDistance = Double.POSITIVE_INFINITY;
}
else if (distance < 700 && distance > 500){
bulletPower = 3 - (( 24.5- getEnergy()) / 6);
if (getEnergy() >= 3.1 ) {
setFire(bulletPower);
lastDistance = Double.POSITIVE_INFINITY;
}
else{
lastDistance = Double.POSITIVE_INFINITY;
}
}
else if (distance <=500 && distance >=350){
bulletPower = 3 - (( 17.5- getEnergy()) / 6);
if (getEnergy() >= 3.1 ) {
setFire(bulletPower);
lastDistance = Double.POSITIVE_INFINITY;
}
else{
lastDistance = Double.POSITIVE_INFINITY;
}
}
else if (distance < 350 ){
bulletPower = 3 - (( 5- getEnergy()) / 6);
if (getEnergy() >= 3.1 ) {
setFire(bulletPower);
lastDistance = Double.POSITIVE_INFINITY;
}
else{
lastDistance = Double.POSITIVE_INFINITY;
}
}
if(lastDistance+25 > distance){
lastDistance = distance;
if(getGunHeat() < .1){
setTurnRadarLeft(getRadarTurnRemaining());
setTurnRadarRight(getRadarTurnRemaining());
clearAllEvents();
clearAllEvents();
}
setTurnGunRightRadians(robocode.util.Utils.normalRelativeAngle(absoluteBearing - getGunHeadingRadians() + Math.max(1 - distance / (400), 0) * (e.getVelocity() / (AIM_START + Math.pow(AIM_FACTOR, distance))) * Math.sin(e.getHeadingRadians() - absoluteBearing) ));
}
wall();
// always square off against our enemy, turning slightly toward him
setTurnRight(e.getBearing() + 90 - (10 * moveDirection));
// if we're close to the wall, eventually, we'll move away
if (tooCloseToWall > 0) tooCloseToWall--;
// normal movement: switch directions if we've stopped
if (getVelocity() == 0) {
setMaxVelocity(8);
moveDirection *= -1;
setAhead(500 * moveDirection);
}
}
}
public void onHitByBullet(HitByBulletEvent e) {
setTurnRadarLeft(getRadarTurnRemaining());
setTurnRadarRight(getRadarTurnRemaining());
clearAllEvents();
}
public void onBulletMissed(BulletMissedEvent e) {
setTurnRadarLeft(getRadarTurnRemaining());
setTurnRadarRight(getRadarTurnRemaining());
clearAllEvents();
}
public void onHitRobot(HitRobotEvent e) {
setTurnRadarLeft(getRadarTurnRemaining());
setTurnRadarRight(getRadarTurnRemaining());
clearAllEvents();
}
public void wall(){
//close to left, right, bottom, top wall
if(getX() <= wallMargin || getX() >= getBattleFieldWidth() - wallMargin || getY() <= wallMargin || getY() >= getBattleFieldHeight() - wallMargin){
if(tooCloseToWall <= 0){
// coming near the wall
tooCloseToWall += wallMargin;
setMaxVelocity(0); // stop!!!
}
}
}
包装样品;
进口机器人代码。*;
导入java.awt.Color;
导入java.awt.geom.*;
导入java.lang.*;//对于双精度和整数对象
导入java.util.*;//用于收集波浪
导入robocode.util.Utils;
导入robocode.RobotDeathEvent;
进口机器人代码。规则;
导入robocode.ScannedRobotEvent;
导入robocode.util.Utils;
/*
实现智能瞄准(总是攻击最近的对手)并围绕其旋转的机器人代码
*/
公共类教程扩展了AdvancedRobot
{布尔向前移动;
布尔peek;//如果有机器人,不要转身
double moveAmount;//移动多少
字节移动方向=1;
int tooCloseToWall=0;
int wallMargin=60;
静态最终双枪系数=30;
静态最终双瞄准系数=25;
静态最终int AIM_START=10;
静态最终内部火灾系数=100;
私人长时间;
静态最终长RADARTIMEOUT=20;
静态双力;
静态双力;
静态双距离;
专用布尔雷达扫描;
私人长时间扫描;
公开募捐{
setAdjustRadarForGunTurn(真);
setAdjustGunForRobotTurn(真);
//设置这些颜色(机器人零件):身体、枪、雷达、子弹、扫描弧
setBodyColor(新颜色(255、255、255));
setGunColor(新颜色(255、255、255));
setRadarColor(新颜色(255、255、255));
setBulletColor(新颜色(0,0,0));
设置颜色(新颜色(255、255、255));
while(true){
currTime=getTime();
turnRadarRightRadians(双正无穷大);
turnRadarLeftRadians(双正无穷大);
雷达扫描=真;
}
}
CannedRobot上的公共空间(扫描机器人事件e){
双重绝对轴承=e.getBearingRadians()+getHeadingRadians();
双距离=e.getDistance();
双子弹威力;
double headingRadians=getHeadingRadians();
布尔值=假;
如果(getOthers()>=2){
xForce=xForce*.80-数学sin(绝对方位)/距离;
yForce=yForce*.80-数学cos(绝对方位)/距离;
setTurnRightRadians(Utils.normalRelativeAngle(
Math.atan2(xForce+1/getX()-1/(getBattleFieldWidth()-getX()),
yForce+1/getY()-1/(getBattleFieldHeight()-getY())
-getHeadingRadians());
setAhead(150-Math.abs(getturnlaining());//速度
bulletPower=(距离>850?0.1:(距离>700?0.49:(距离>250?1.9:3.0));
bulletPower=Math.min(getEnergy()/5,Math.min((e.getEnergy()/4)+0.2,bulletPower));
如果((getGunHeat()0.0)和&(getEnergy()>9.1)){
//只有在锁定并装弹的情况下才开火,然后进行雷达扫描。
平均功率=3;
package sample;
import robocode.*;
import java.awt.Color;
import java.awt.geom.*;
import java.lang.*; // for Double and Integer objects
import java.util.*; // for collection of waves
import robocode.util.Utils;
import robocode.RobotDeathEvent;
import robocode.Rules;
import robocode.ScannedRobotEvent;
import robocode.util.Utils;
/*
A Robocode that implements the smart targeting(always attack on the nearest opponent) and circles around them
*/
public class Tutorial extends AdvancedRobot
{ boolean movingForward;
boolean peek; // Don't turn if there's a robot there
double moveAmount; // How much to move
byte moveDirection= 1;
int tooCloseToWall = 0;
int wallMargin = 60;
static final double GUN_FACTOR = 30;
static final double AIM_FACTOR = 25;
static final int AIM_START = 10;
static final int FIRE_FACTOR = 100;
private long currTime;
static final long RADARTIMEOUT = 20;
static double xForce;
static double yForce;
static double lastDistance;
private boolean radarScan;
private long lastscan;
public void run(){
setAdjustRadarForGunTurn(true);
setAdjustGunForRobotTurn(true);
// Sets these colors (robot parts): body, gun, radar, bullet, scan_arc
setBodyColor(new Color(255, 255, 255));
setGunColor(new Color(255, 255, 255));
setRadarColor(new Color(255, 255, 255));
setBulletColor(new Color(0, 0, 0));
setScanColor(new Color(255, 255, 255));
while(true) {
currTime = getTime();
turnRadarRightRadians(Double.POSITIVE_INFINITY);
turnRadarLeftRadians(Double.POSITIVE_INFINITY);
radarScan = true;
}
}
public void onScannedRobot(ScannedRobotEvent e) {
double absoluteBearing = e.getBearingRadians()+ getHeadingRadians();
double distance = e.getDistance();
double bulletPower ;
double headingRadians = getHeadingRadians();
boolean fired = false;
if(getOthers() >= 2){
xForce = xForce *.80- Math.sin(absoluteBearing) / distance;
yForce = yForce *.80 - Math.cos(absoluteBearing) / distance;
setTurnRightRadians(Utils.normalRelativeAngle(
Math.atan2(xForce + 1/getX() - 1/(getBattleFieldWidth() - getX()),
yForce + 1/getY() - 1/(getBattleFieldHeight() - getY()))
- getHeadingRadians()) );
setAhead(150- Math.abs(getTurnRemaining()));//speed
bulletPower = ( distance > 850 ? 0.1 : (distance > 700 ? 0.49 : (distance > 250 ? 1.9 : 3.0)));
bulletPower = Math.min( getEnergy()/5, Math.min( (e.getEnergy()/4) + 0.2, bulletPower));
if ((getGunHeat() <= 3.0) && (getGunTurnRemaining() == 0.0) && (bulletPower > 0.0) && (getEnergy() > 9.1)) {
// Only fire the gun when it is locked and loaded, do a radarsweep afterwards.
bulletPower=3;
setFire( bulletPower);
fired = true;
}
if ((fired == true) || (currTime >= (lastscan + RADARTIMEOUT))) {
setTurnRadarRightRadians( Double.NEGATIVE_INFINITY * Utils.normalRelativeAngle( absoluteBearing- getRadarHeadingRadians()));
lastscan = currTime;
radarScan = true;
}
// when not firing, lock on target.
//setTurnRadarRightRadians( 2.2 * Utils.normalRelativeAngle( absoluteBearing - getRadarHeadingRadians()));
//radarScan = false;
lastDistance = Double.POSITIVE_INFINITY;
setTurnRadarLeft(getRadarTurnRemaining());
setTurnRadarRight(getRadarTurnRemaining());
if(lastDistance+20 > distance){
lastDistance = distance;
if(getGunHeat() < .1){
setTurnRadarLeft(getRadarTurnRemaining());
setTurnRadarRight(getRadarTurnRemaining());
clearAllEvents();
}
setTurnGunRightRadians(robocode.util.Utils.normalRelativeAngle(absoluteBearing - getGunHeadingRadians() + Math.max(1 - distance / (40), 0) * (e.getVelocity() / (AIM_START + Math.pow(AIM_FACTOR, distance))) * Math.sin(e.getHeadingRadians() - absoluteBearing) ));
}
}
if(getOthers() == 1){
setBodyColor(new Color(255, 0, 0));
setGunColor(new Color(255, 0, 0));
setRadarColor(new Color(255, 0, 0));
setBulletColor(new Color(255, 0, 0));
setScanColor(new Color(255, 0, 0));
double bulletPower1 = 3;
if(distance >= 700){
lastDistance = Double.POSITIVE_INFINITY;
}
else if (distance < 700 && distance > 500){
bulletPower = 3 - (( 24.5- getEnergy()) / 6);
if (getEnergy() >= 3.1 ) {
setFire(bulletPower);
lastDistance = Double.POSITIVE_INFINITY;
}
else{
lastDistance = Double.POSITIVE_INFINITY;
}
}
else if (distance <=500 && distance >=350){
bulletPower = 3 - (( 17.5- getEnergy()) / 6);
if (getEnergy() >= 3.1 ) {
setFire(bulletPower);
lastDistance = Double.POSITIVE_INFINITY;
}
else{
lastDistance = Double.POSITIVE_INFINITY;
}
}
else if (distance < 350 ){
bulletPower = 3 - (( 5- getEnergy()) / 6);
if (getEnergy() >= 3.1 ) {
setFire(bulletPower);
lastDistance = Double.POSITIVE_INFINITY;
}
else{
lastDistance = Double.POSITIVE_INFINITY;
}
}
if(lastDistance+25 > distance){
lastDistance = distance;
if(getGunHeat() < .1){
setTurnRadarLeft(getRadarTurnRemaining());
setTurnRadarRight(getRadarTurnRemaining());
clearAllEvents();
clearAllEvents();
}
setTurnGunRightRadians(robocode.util.Utils.normalRelativeAngle(absoluteBearing - getGunHeadingRadians() + Math.max(1 - distance / (400), 0) * (e.getVelocity() / (AIM_START + Math.pow(AIM_FACTOR, distance))) * Math.sin(e.getHeadingRadians() - absoluteBearing) ));
}
wall();
// always square off against our enemy, turning slightly toward him
setTurnRight(e.getBearing() + 90 - (10 * moveDirection));
// if we're close to the wall, eventually, we'll move away
if (tooCloseToWall > 0) tooCloseToWall--;
// normal movement: switch directions if we've stopped
if (getVelocity() == 0) {
setMaxVelocity(8);
moveDirection *= -1;
setAhead(500 * moveDirection);
}
}
}
public void onHitByBullet(HitByBulletEvent e) {
setTurnRadarLeft(getRadarTurnRemaining());
setTurnRadarRight(getRadarTurnRemaining());
clearAllEvents();
}
public void onBulletMissed(BulletMissedEvent e) {
setTurnRadarLeft(getRadarTurnRemaining());
setTurnRadarRight(getRadarTurnRemaining());
clearAllEvents();
}
public void onHitRobot(HitRobotEvent e) {
setTurnRadarLeft(getRadarTurnRemaining());
setTurnRadarRight(getRadarTurnRemaining());
clearAllEvents();
}
public void wall(){
//close to left, right, bottom, top wall
if(getX() <= wallMargin || getX() >= getBattleFieldWidth() - wallMargin || getY() <= wallMargin || getY() >= getBattleFieldHeight() - wallMargin){
if(tooCloseToWall <= 0){
// coming near the wall
tooCloseToWall += wallMargin;
setMaxVelocity(0); // stop!!!
}
}
}
setTurnGunRightRadians(Math.sin((Guppy.var = e.getBearingRadians() + getHeadingRadians()) - getGunHeadingRadians() + Math.asin((vel * 0.4D + e.getVelocity() * 0.6D) / 14.0D * Math.sin(e.getHeadingRadians() - var))));
double targetBearing = e.getBearingRadians() + getHeadingRadians();
setTurnGunRightRadians(Math.sin(targetBearing - getGunHeadingRadians() + Math.asin((vel * 0.4D + e.getVelocity() * 0.6D) / 14.0D * Math.sin(e.getHeadingRadians() - targetBearing))));
double targetBearing = e.getBearingRadians() + getHeadingRadians();
double predictedVelocity = vel * 0.4D + e.getVelocity() * 0.6D;
setTurnGunRightRadians(Math.sin(targetBearing - getGunHeadingRadians() + Math.asin(predictedVelocity / 14.0D * Math.sin(e.getHeadingRadians() - targetBearing))));
double targetBearing = e.getBearingRadians() + getHeadingRadians();
double predictedVelocity = vel * 0.4D + e.getVelocity() * 0.6D;
double perpendicularMotionCoefficient = Math.sin(e.getHeadingRadians() - targetBearing);
setTurnGunRightRadians(Math.sin(targetBearing - getGunHeadingRadians() + Math.asin(predictedVelocity / 14.0D * perpendicularMotionCoefficient)));
double targetBearing = e.getBearingRadians() + getHeadingRadians();
double predictedVelocity = vel * 0.4D + e.getVelocity() * 0.6D;
double perpendicularMotionCoefficient = Math.sin(e.getHeadingRadians() - targetBearing);
double firingAngleAdjustment = Math.asin(predictedVelocity / 14.0D * perpendicularMotionCoefficient);
setTurnGunRightRadians(Math.sin(targetBearing - getGunHeadingRadians() + firingAngleAdjustment));
double targetBearing = e.getBearingRadians() + getHeadingRadians();
double predictedVelocity = vel * 0.4D + e.getVelocity() * 0.6D;
double perpendicularMotionCoefficient = Math.sin(e.getHeadingRadians() - targetBearing);
double firingAngleAdjustment = Math.asin(predictedVelocity / 14.0D * perpendicularMotionCoefficient);
setTurnGunRightRadians(targetBearing - getGunHeadingRadians() + firingAngleAdjustment);