package session2;
import robocode.*;
import robocode.ScannedRobotEvent;
import java.awt.Color;
public class MyFirstRobotClaudiaD extends Robot {
private int numTimes=0;
double currentX;
double currentY;
double[]safety=new double[15];
double distanceToEnemy;
double bearingToEnemy;
double absoluteBearing;
double enemyVelocity;
double enemyTargetX;
double enemyTargetY;
double enemyX;
double enemyY;
double enemyHeading;
double interval;
double enemyEnergy;
double myBearing;
public void run () {
setAdjustRadarForGunTurn(true);
setAdjustGunForRobotTurn(true);
setColors(Color.GREEN, Color.YELLOW, Color.BLUE, Color.ORANGE, Color.GREEN);
updateLocation();
System.out.println(currentX);
System.out.println(currentY);
enemyEnergy=100;
while(true){
turnRadarRight(360);
updateLocation();
if(enemyHeading>315&&enemyHeading<=45||enemyHeading>135&&enemyHeading<=225){
if(enemyX>=currentX){
moveTo(enemyX-100,enemyY);
}else{
moveTo(enemyX+100,enemyY);
}
}else{
if(enemyY>=currentY){
moveTo(enemyX,enemyY-100);
}else{
moveTo(enemyX,enemyY+100);
}
}
}
}
private void moveTo(double x, double y){
updateLocation();
double hypotenuse=EpgyUtil.distanceTo(currentX,currentY,x,y);
double angle=EpgyUtil.bearingToLocation(currentX, currentY, x, y);
turnTo(angle);
ahead(hypotenuse);
}
private void updateLocation(){
currentX=getX();
currentY=getY();
}
private void turnTo (double degrees) {
turnRight (degrees-getHeading ());
}
public void onBulletMissed(BulletMissedEvent e){
e.getBullet();
getHeading();
}
public void onHitByBullet(HitByBulletEvent e){
updateLocation();
double angle=EpgyUtil.bearingToLocation(currentX,currentY,enemyX, enemyY);
System.out.println(angle);
if(angle>=337.5&&angle<=360){
smoothBins(0);
}else if(angle>=315&&angle<337.5){
smoothBins(1);
}else if(angle>=292.5&&angle<315){
smoothBins(2);
}else if (angle>=270&&angle<292.5){
smoothBins(3);
}else if (angle>=247.5&&angle<270){
smoothBins(4);
}else if (angle>=225&&angle<247.5){
smoothBins(5);
}else if (angle>=202.5&&angle<225){
smoothBins(6);
}else if(angle>=180&&angle<202.5){
smoothBins(7);
}else if(angle>=157.5&&angle<180){
smoothBins(8);
}else if(angle>=135&&angle<157.5){
smoothBins(9);
}else if(angle>=112.5&&angle<135){
smoothBins(10);
}else if(angle>=90&&angle<112.5){
smoothBins(11);
}else if(angle>=67.5&&angle<90){
smoothBins(12);
}else if(angle>=45&&angle<67.5){
smoothBins(13);
}else if(angle>=22.5&&angle<45){
smoothBins(14);
}else{
smoothBins(15);
}
}
private void smoothBins(int index){
for(int i=0; i<15; i++){
safety[i]+=1.0/(Math.pow(index-i, 2)+1);
}
}
public void onScannedRobot (ScannedRobotEvent e) {
double radar=getRadarHeading();
stop();
turnLeft(getRadarHeading()-radar);
double distanceToEnemy=e.getDistance();
double bearingToEnemy=e.getBearing();
double absoluteBearing= bearingToEnemy+getHeading();
double enemyDistX=distanceToEnemy*EpgyUtil.sin(absoluteBearing);
double enemyDistY=distanceToEnemy*EpgyUtil.cos(absoluteBearing);
enemyX=getX()+enemyDistX;
enemyY=getY()+enemyDistY;
// System.out.println("Enemy is at("+enemyX+","+enemyY+")");
updateLocation();
enemyVelocity=e.getVelocity();
enemyHeading=e.getHeading();
if(enemyVelocity==0&&distanceToEnemy<150){
turnGunRight(absoluteBearing-getGunHeading());
fire(3);
}else if(enemyVelocity==0){
turnGunRight(absoluteBearing-getGunHeading());
fire(1.5);
}else{
interval=11.25;
double bulletTicks;
if(distanceToEnemy>=250){
bulletTicks=15;
}else{
bulletTicks=5;
}
for(int j=0; j<360/interval; j++){
if(enemyHeading>=interval*j&&enemyHeading<=interval*(j+1)){
enemyTargetX=enemyX+enemyVelocity*bulletTicks*EpgyUtil.sin(enemyHeading);
enemyTargetY=enemyY+enemyVelocity*bulletTicks*EpgyUtil.cos(enemyHeading);
System.out.println(enemyTargetX);
System.out.println(enemyTargetY);
}
}
double distance =EpgyUtil.distanceTo(currentX, currentY, enemyTargetX, enemyTargetY);
double power= (distance/bulletTicks-20)/-3;
if(power<0.1){
power=0.1;
}else if(power>3){
power=3.0;
}
double angle=EpgyUtil.bearingToLocation(currentX, currentY, enemyTargetX, enemyTargetY);
turnGunRight(angle-getGunHeading());
fire(power);
}
double difference=enemyEnergy-e.getEnergy();
enemyEnergy=e.getEnergy();
double lowest=safety[0];
if(difference>=0.1&&difference<=3.0){
for(int j=0; j<15; j++){
if(safety[j]<=lowest){
safety[j]=lowest;
}
}
}
for(int k=0; k<15; k++){
if(safety[k]==lowest){
turnRight(k*22.5);
ahead(100);
}else{
k++;
}
}
ahead(150);
enemyHeading=e.getHeading();
turnRadarRight(absoluteBearing-getRadarHeading());
System.out. println ("I scanned a robot");
numTimes++;
turnRadarRight(45);
turnRadarLeft(45);
scan();
}
public void onHitRobot(HitRobotEvent e){
ahead(-100);
ahead(100);
ahead(-100);
}
public void onHitWall(HitWallEvent e){
turnRight(90);
}
}