Skip to content

Instantly share code, notes, and snippets.

@naab
Created December 9, 2012 15:53
Show Gist options
  • Save naab/4245728 to your computer and use it in GitHub Desktop.
Save naab/4245728 to your computer and use it in GitHub Desktop.
Moving Around
//FightCode can only understand your robot
//if its class is called Robot
var arena = {
width: 0,
height: 0,
};
var nb_directions = 4;
var first_launch = true;
var first_launch_clone = true;
var list_robots = new Array();
function my_robot(robot) {
this.robot = robot;
if (robot.parentId == null){ // parent
this.direction = 0;
this.sonar_side = 1;
this.sonar_sens = 1;
this.rotation_inc = 15;
}
else {// clone
this.direction = 2;
this.sonar_side = 0;
this.sonar_sens = 0;
this.rotation_inc = 15;
}
};
my_robot.prototype = {
robot: null,
rotation_inc: 15,
sonar_side: 0, // 0 : right - 1 left
sonar_sens: 0, // 0 - positif - 1 - negatif
direction: 0, // 0 - TOP
// 1 - RIGHT
// 2 - BOT
// 3 - LEFT
last_canon_angle: 0,
pending_soft_turn: false,
soft_angle: 10,
soft_turn_direction: 0, // 0 - TOP
// 1 - RIGHT
// 2 - BOT
// 3 - RIGHT
isParent: function(){
if (this.robot.parentId == null)
return true;
return false;
},
soft_turn: function(direction){
this.robot.log("Soft Turn Asked to :" + direction);
this.soft_turn_direction = direction;
this.pending_soft_turn = true;
this.continue_soft_turn();
},
continue_soft_turn: function(){
this.robot.log("In continue soft turn: " + this.soft_turn_direction);
switch (this.soft_turn_direction){
case 0: // TOP
// try to turn to top
if (this.robot.angle>180){
if (this.soft_angle + this.robot.angle >= 360){
this.pending_soft_turn = false;
if (this.robot.position.x < arena.width/2)
this.sonar_side = 0;
else
this.sonar_side = 1;
this.direction = 0;
this.robot.turnRight(360 - this.robot.angle);
}
else
this.robot.turnRight(this.soft_angle);
}
else {
if (this.robot.angle - this.soft_angle <= 0){
this.pending_soft_turn = false;
if (this.robot.position.x < arena.width/2)
this.sonar_side = 0;
else
this.sonar_side = 1;
this.direction = 0;
this.robot.turnLeft(this.robot.angle);
}
else
this.robot.turnLeft(this.soft_angle);
}
break;
case 1: // RIGHT
if (this.robot.angle > 270 || this.robot.angle < 90){
if (this.robot.angle + this.soft_angle >= 90){
this.pending_soft_turn = false;
if (this.robot.position.y < arena.height/2)
this.sonar_side = 0;
else
this.sonar_side = 1;
this.direction = 1;
this.robot.turnRight(90 - this.robot.angle);
}
else
this.robot.turnRight(this.soft_angle);
}
else {
if (this.robot.angle - this.soft_angle <= 90){
this.pending_soft_turn = false;
if (this.robot.position.y < arena.height/2)
this.sonar_side = 0;
else
this.sonar_side = 1;
this.direction = 1;
this.robot.turnLeft(this.robot.angle - 90);
}
else
this.robot.turnLeft(this.soft_angle);
}
break;
case 2: // BOT
if (this.robot.angle < 180){
if (this.robot.angle + this.soft_angle >= 180){
this.pending_soft_turn = false;
if (this.robot.position.x > arena.width/2)
this.sonar_side = 0;
else
this.sonar_side = 1;
this.direction = 2;
this.robot.turnRight(180 - this.robot.angle);
}
else
this.robot.turnRight(this.soft_angle);
}
else {
if (this.robot.angle - this.soft_angle <= 180){
this.pending_soft_turn = false;
if (this.robot.position.x > arena.width/2)
this.sonar_side = 0;
else
this.sonar_side = 1;
this.direction = 2;
this.robot.turnLeft(this.robot.angle - 180);
}
else
this.robot.turnLeft(this.soft_angle);
}
break;
case 3: // LEFT
if (this.robot.angle > 270 || this.robot.angle < 90){
this.robot.log("FU:" + this.robot.angle);
if (this.robot.angle + this.soft_angle >= 270){
this.pending_soft_turn = false;
if (this.robot.position.y > arena.height/2)
this.sonar_side = 0;
else
this.sonar_side = 1;
this.direction = 3;
this.robot.turnLeft(this.robot.angle - 270);
}
else
this.robot.turnLeft(this.soft_angle);
}
else{
if (this.robot.angle - this.soft_angle <= 270){
this.pending_soft_turn = false;
if (this.robot.position.y > arena.height/2)
this.sonar_side = 0;
else
this.sonar_side = 1;
this.direction = 3;
this.robot.turnRight(270 - this.robot.angle);
}
else
this.robot.turnRight(this.soft_angle);
}
break;
}
},
doWeNeedToTurn: function(){
switch (this.direction){
case 0: // TOP
if (this.robot.position.y < 50){ // we're too close from the wall, turn
if (this.robot.position.x < arena.width/2){
this.soft_turn(1); // TURN RIGHT
}
else
this.soft_turn(3);
}
break;
case 1: // RIGHT
if (this.robot.position.x > arena.width - 50){
if (this.robot.position.y < arena.height /2){
this.soft_turn(2);
}
else
this.soft_turn(0);
}
break;
case 2: // BOT
if (this.robot.position.y > arena.height - 50){
if (this.robot.position.x < arena.width/2)
this.soft_turn(1);
else
this.soft_turn(3);
}
break;
case 3: // LEFT
if (this.robot.position.x < 50){
if (this.robot.position.y < arena.height/2)
this.soft_turn(2);
else
this.soft_turn(0);
}
break;
}
},
adjustDirection: function(){
this.soft_turn(this.direction);
},
getNextPositionToWatch: function(){
if (this.sonar_side == 1){
if (this.sonar_sens == 0){
if (this.robot.cannonRelativeAngle + this.rotation_inc >= 90 && this.robot.cannonRelativeAngle < 90){
this.sonar_sens = 1;
return (90 - this.robot.cannonRelativeAngle);
}
return this.rotation_inc;
}
else {
if (this.robot.cannonRelativeAngle - this.rotation_inc <= 270 && this.robot.cannonRelativeAngle > 90){
this.sonar_sens = 0;
this.robot.log("fu: " + this.robot.cannonRelativeAngle);
return (270 - this.robot.cannonRelativeAngle);
}
return -this.rotation_inc;
}
}
else{
if (this.sonar_sens == 0) {
if (this.robot.cannonRelativeAngle + this.rotation_inc >= 270 && this.robot.cannonRelativeAngle < 270){
this.sonar_sens = 1;
return (270 - this.robot.cannonRelativeAngle);
}
return this.rotation_inc;
}
else {
if (this.robot.cannonRelativeAngle - this.rotation_inc <= 90 && this.robot.cannonRelativeAngle > 90){
this.sonar_sens = 0;
return (90 - this.robot.cannonRelativeAngle);
}
return -this.rotation_inc;
}
}
},
isClone: function(){
return (!this.isParent());
}
};
var isRobotRegistered = function (robot){
var i;
for (i = 0; i < list_robots.length; i++){
if (list_robots[i].robot.id == robot.id)
return true;
}
return false;
};
var updateRobot = function (robot){
var i;
for (i = 0; i < list_robots.length; i++){
if (list_robots[i].robot.id == robot.id) {
list_robots[i] = robot;
return true;
}
}
return false;
}
var registerRobot = function(robot){
if (!isRobotRegistered(robot)){
list_robots[list_robots.length] = new my_robot(robot);
}
else{
var r = getRobot(robot);
r.robot = robot;
updateRobot(r);
}
};
var getRobot = function(robot){
for (i = 0; i < list_robots.length; i++){
if (list_robots[i].robot.id == robot.id) {
return list_robots[i];
}
}
return null;
};
var Robot = function(robot) {
arena.width = robot.arenaWidth;
arena.height = robot.arenaHeight;
};
function look_top(robot){
if (robot.angle>180)
robot.turnRight(360 - robot.angle);
else
robot.turnLeft(robot.angle);
var r = getRobot(robot);
r.direction = 0;
updateRobot(r);
}
function look_bot(robot){
if (robot.angle>180)
robot.turnLeft(robot.angle-180);
else
robot.turnRight(180 + robot.angle);
var r = getRobot(robot);
r.direction = 2;
updateRobot(r);
}
Robot.prototype.onWallCollision = function(ev) {
var robot = ev.robot;
var r = getRobot(robot);
if ( (r.direction == 2 && ev.robot.position.x < arena.width/2) // bot left
|| (r.direction == 1 && ev.robot.position.y > arena.height/2)
|| (r.direction == 3 && ev.robot.position.y < arena.height/2)
|| (r.direction == 0 && ev.robot.position.x > arena.width/2)){
r.sonar_side = 1;
robot.turn(-90);
robot.rotateCannon(-90);
r.direction -= 1;
if (r.direction < 0)
r.direction = nb_directions + r.direction;
updateRobot(r);
return;
}
robot.turn(90);
robot.rotateCannon(90);
r.sonar_side = 0;
r.direction = (r.direction+1)% nb_directions;
updateRobot(r);
};
Robot.prototype.onRobotCollision = function(ev) {
var robot = ev.robot;
var r = getRobot(robot);
robot.back(10);
robot.turn(180);
//r.sonar_side = (r.sonar_side + 1) %2;
r.direction = (r.direction+2)% nb_directions;
updateRobot(r);
};
Robot.prototype.onIdle = function(ev) {
var robot = ev.robot;
registerRobot(robot);
var r = getRobot(robot);
// robot.ahead(100);
// robot.rotateCannon(360);
if (first_launch){
//look_top(robot);
r.soft_turn(0);
first_launch = false;
//robot.clone();
}
if (robot.parentId != null && first_launch_clone){
first_launch_clone = false;
//look_bot(robot);
r.soft_turn(2);
}
// check deplacement to avoid wallcollision (it will slow us)
r.doWeNeedToTurn();
if (r.pending_soft_turn)
r.continue_soft_turn();
else
r.adjustDirection();
canon_angle = r.getNextPositionToWatch();
// robot.log("New angle at: " + canon_angle);
robot.rotateCannon(canon_angle);
robot.ahead(10);
// robot.log("Direction: " + (r.direction));
//robot.log("Position: x: " + robot.position.x + "; y: " + robot.position.y + " ; angle: " + robot.angle + "; cannon_angle: " + robot.cannonRelativeAngle + "; cannon_abs_angle: " + robot.cannonAbsoluteAngle);
// robot.log("Sonar: Side: " + (r.sonar_side == 0? "left":"right") + "; sonar_sens: " + r.sonar_sens);
// robot.log("Arena: width: " + arena.width + "; height: " + arena.height); */
};
Robot.prototype.onScannedRobot = function(ev) {
var robot = ev.robot;
// robot.fire();
robot.stop();
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment