# Autonomous Robot ## donmccurdy ```javascript map.defineObject('robot', { // ... 'behavior': function (me) { me.path = me.path || []; if (me.path.length) { me.move(me.path.pop()); } else if (me.canMove('down')) { me.move('down'); } else if (me.canMove('right')) { me.move('right'); } else { me.path = [ 'right', 'right', 'right', 'up', 'up', 'up', 'up', 'up', 'left', 'left', 'left', 'left' ]; } } }); ``` ## Jhack (giacgbj) ```javascript me.move( me.getX() < 25 || me.getX() > 47 ? me.canMove('down') ? 'down' : 'right' : me.canMove('up') ? 'up' : 'right' ); ``` ## esolitos ```javascript if( me.getX() == 1 && me.getY() < 4 ){ me.move('down'); } else if( me.getY() == 4) { if( me.canMove('right') ) { me.move('right'); } else { me.move('down'); } } else if( me.getY() > 4 ) { if( me.canMove('right') ) { me.move('right'); } else if ( me.getX() != map.getWidth() -2 ) { me.move('up'); } else { me.move('down'); } } ``` ## KamiSempai The Sinusoidal droid. ```javascript if(me.canMove("right")) { var x = me.getX()+1; // It's a magic numbers. Don't change!!! var y = Math.sin(x / 7) * 4 + 4.5; if(y - me.getY() > 1) { me.move("down"); } else if(y - me.getY() < -1) { me.move("up"); } else { me.move("right"); } } else { me.move("down"); } ``` # Portal style ## JustBlackBird Just press "R" and go through the portals ```javascript if (player.teleportersAreReady) { // Do not add teleporters more than once return; } // Place two teleporters at the map map.placeObject(player.getX(), player.getY() - 1, 'teleporter'); map.placeObject(map.getWidth() - 2, 7, 'teleporter'); // We need teleporters objects, so find them var objs = map.getDynamicObjects(); var teleporters = []; for (var i = 0, len = objs.length; i < len; i++) { if (objs[i].getType() == 'teleporter') { teleporters.push(objs[i]); } } // Link teleporters one to another teleporters[0].setTarget(teleporters[1]); teleporters[1].setTarget(teleporters[0]); // We need an indicator to know if teleporters already // in place or not. Use "player" object from the closure player.teleportersAreReady = true; ``` # pk Maze solver (works for 11, 12, 13) and any simple connected maze. Follow a wall to the right, turn counterclockwise each turn first. Remember last direction. With debug console output. ```javascript 'behavior': function (me) { var dirs = ['up','right','down','left'] var d = me.dir || 0; d--; d = (d < 0)? 3 : d; var brain = []; while(!me.canMove(dirs[d])) { brain.push("can't "+dirs[d]); d++; d = (d > 3)? 0 : d; } brain.push(dirs[d]+ " ok"); console.log(brain.join(', ')) me.dir = d; me.move(dirs[d]); } ``` # ont.rif Just more simple code for "follow wall to the right". ```javascript me.dir = me.dir || 'up'; var plan = { 'up': ['left', 'right'], 'right': ['up', 'down'], 'down': ['right', 'left'], 'left': ['down', 'up'], }[ me.dir ]; if(me.canMove(plan[0])) me.dir = plan[0]; else if(!me.canMove(me.dir)) me.dir = plan[1]; me.move(me.dir); ``` # civilframe Brute force. ```javascript var r = Math.random(); if (r < 0.25) { me.move('up'); } else if (r < 0.5) { me.move('down'); } else if (r < 0.65) { // slight propensity to go left me.move('left'); } else { me.move('right'); } ``` # mike_perdide Simple down/right/up/left behavior, with a twist to make the problem more simple for the droid by placing blocks wherever we can. ```javascript var directions_delta = { "down": [0, 1], "up" : [0, -1], "left": [-1, 0], "right": [1, 0] } var opposites = { "down": "up", "up":"down", "left":"right", "right":"left" } var prev_x = me.getX(); var prev_y = me.getY(); var move_conditionally = function (direction) { if (!me.canMove(direction) || me.getY()>22) { return false; } me.move(direction); return true; }; // We're aiming down & right first if (!move_conditionally("down")) { if (!move_conditionally("right")) { if (!move_conditionally("up")) { move_conditionally("left"); } } } // Putting blocks where we can to limit the droid options prev_moves = map.getAdjacentEmptyCells(prev_x, prev_y) if (prev_moves.length == 1) { map.placeObject(prev_x, prev_y, "block"); } else if (prev_moves.length == 2 && prev_moves[0][1] != opposites[prev_moves[1][1]] ) { move_1_delta_x = directions_delta[prev_moves[0][1]][0]; move_2_delta_x = directions_delta[prev_moves[1][1]][0]; move_1_delta_y = directions_delta[prev_moves[0][1]][1]; move_2_delta_y = directions_delta[prev_moves[1][1]][1]; // Calculating the coordinates of the diagonal object diag_x = prev_x + move_1_delta_x + move_2_delta_x; diag_y = prev_y + move_1_delta_y + move_2_delta_y; // If the diagonal object is empty, that means we can access // the adjacent 2 cells without the cell at (prev_x, prev_y). // So let's put a block there! if (map.getObjectTypeAt(diag_x, diag_y) == "empty") { map.placeObject(prev_x, prev_y, "block"); } }; ``` # ToeFungi Creating no other path ```javascript if(me.canMove('up')){ me.move('up'); }else if(me.canMove('right')){ me.move('right'); }else if(!me.canMove('right') && !me.canMove('down')){ me.move('left'); map.placeObject(me.getX()+1, me.getY(), 'block'); } else { me.move('down'); map.placeObject(me.getX(), me.getY()-1, 'block'); } ``` # DaPutzy Making it easier for the path finding by adding `setPhoneCallback`. Press `q` and then walk to the right and up to get the key. ```javascript if (!me.canMove('up') && !me.canMove('right')) { me.move('down'); } else if (!me.canMove('down') && !me.canMove('right')) { me.move('up'); } else if (!me.canMove('right')) { me.move('down'); } else { me.move('right'); } } }); player.setPhoneCallback(function () { map.placeObject(13, 1, 'block'); map.placeObject(14, 2, 'block'); map.placeObject(15, 3, 'block'); map.placeObject(16, 4, 'block'); map.placeObject(31, 5, 'block'); map.placeObject(30, 6, 'block'); map.placeObject(29, 7, 'block'); map.placeObject(28, 8, 'block'); if (true) { ```