Advertisement
Guest User

Untitled

a guest
Apr 28th, 2017
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const dirs_cardinal = {
  2.     NORTH: "u",
  3.     WEST: "l",
  4.     EAST: "r",
  5.     SOUTH: "d",
  6. };
  7.  
  8. const dirs = [
  9.     "u",
  10.     "r",
  11.     "d",
  12.     "l",
  13. ];
  14. const dirs_val = [
  15.     [0, 1], // N
  16.     [1, 0], // E
  17.     [0, -1], // S
  18.     [-1, 0], // W
  19. ];
  20. let dirs_to_index = {};
  21. for (let i = 0; i < dirs.length; i++) dirs_to_index[dirs[i]] = i;
  22.  
  23. let trollInterval;
  24. let beeperSpawnInterval;
  25. const selfId = 1595;
  26. const cellSize = 24;
  27. const gridSize = 18;
  28. let trollCode = `
  29.     function main() {
  30.         repeat(999999) {
  31.             turnRight();
  32.             move();
  33.         }
  34.     }
  35. `;
  36. let game = $('#challenge_iframe')[0].contentWindow;
  37. let stop = false;
  38. let debug = false;
  39. let spawnRandomBeepers = false;
  40. let player;
  41. let beepers;
  42. let karels = game.ig.game.getEntitiesByType('EntityKarel');
  43. let selfInfo = JSON.parse(game.players[selfId]);
  44. let exit = game.ig.game.getEntitiesByType('EntityExit')[0];
  45. let tray;
  46. let trays = game.ig.game.getEntitiesByType('EntityTray');
  47. let beeperCount = 0;
  48.  
  49. function rotateTo(from, to) {
  50.     let c = 0;
  51.     let index = from;
  52.     while (index != to) {
  53.         index = (index + 1) % 4;
  54.         c++;
  55.     }
  56.     if (c == 0) return "";
  57.     else return `repeat(${c}){ turnRight(); }\n`;
  58. }
  59.  
  60. function distance(p1, p2) {
  61.     let d1 = p1[0] - p2[0];
  62.     let d2 = p1[1] - p2[1];
  63.     return Math.sqrt(d1*d1 + d2*d2);
  64. }
  65.  
  66. function getDir(before, after) {
  67.     if (after[0] > before[0]) return "l";
  68.     if (after[0] < before[0]) return "r";
  69.     if (after[1] > before[1]) return "u";
  70.     if (after[1] < before[1]) return "d";
  71. }
  72.  
  73. function getPos(entity) {
  74.     return [
  75.         parseInt(entity.pos.x / cellSize) - 1,
  76.         parseInt(entity.pos.y / cellSize) - 1,
  77.     ];
  78. }
  79.  
  80. function strPos(_objPos) {
  81.     //return `{"x":"${_objPos[0]}","y":"${_objPos[1]}"}`;
  82.     return `${_objPos[0]},${_objPos[1]}`;
  83. }
  84.  
  85. function objPos(_strPos) {
  86.     return _strPos.split(',').map(i => parseInt(i))
  87. }
  88.  
  89. function getBeepers(_player) {
  90.     let _beepers = game.ig.game.getEntitiesByType('EntityBeeper');
  91.     for (let i = 0; i < _beepers.length; i++) {
  92.         _beepers[i] = getPos(_beepers[i]);
  93.     }
  94.     _beepers.sort(function(a, b) {
  95.         let da = distance(a, _player.p);
  96.         let db = distance(b, _player.p);
  97.         if (da < db) return -1;
  98.         if (da > db) return 1;
  99.         return 0;
  100.     });
  101.     return _beepers;
  102. }
  103.  
  104. function BFS(start, goal) {
  105.     let queue = new Array();
  106.     queue.push(start);
  107.     let from = {};
  108.     from[strPos(start)] = null;
  109.  
  110.     while (queue.length > 0) {
  111.         let current = queue[0];
  112.         queue.shift();
  113.  
  114.         if (current[0] == goal[0] && current[1] == goal[1]) return from;
  115.  
  116.         for (let i = 0; i < dirs_val.length; i++) {
  117.             let next = [
  118.                 current[0] + dirs_val[i][0],
  119.                 current[1] + dirs_val[i][1],
  120.             ];
  121.  
  122.             if (next[0] < 0 || next[1] < 0 || next[0] >= gridSize  || next[1] >= gridSize || from.hasOwnProperty(strPos(next)))
  123.                 continue;
  124.  
  125.             queue.push(next);
  126.             from[strPos(next)] = current;
  127.         }
  128.     }  
  129. }
  130.  
  131. function bot() {
  132.     let botCode = "";
  133.     let path;
  134.     let last;
  135.     let steps;
  136.  
  137.     player.dir = dirs_cardinal[player.facing];
  138.     player.p = getPos(player);
  139.     tray.p = getPos(tray);
  140.     exit.p = getPos(exit);
  141.     beepers = getBeepers(player);
  142.     beeperCount = 0;
  143.  
  144.     while (true) {
  145.         console.log(beeperCount);
  146.         if (beeperCount >= 0 && beeperCount < 5) {
  147.             path = BFS(player.p, beepers[0]);
  148.             current = strPos(beepers[0]);
  149.         }
  150.         else if (beeperCount == 5) {
  151.             path = BFS(player.p, tray.p);
  152.             current = strPos(tray.p);
  153.         }
  154.         else {
  155.             path = BFS(player.p, exit.p);
  156.             current = strPos(exit.p);
  157.         }
  158.  
  159.         steps = new Array();
  160.         while (true) {
  161.             if (path[current] === null) break;
  162.             last = current;
  163.             current = strPos(path[current]);
  164.             steps.push(getDir(objPos(last), objPos(current)));
  165.         }
  166.         console.log(steps);
  167.  
  168.         for (let i = steps.length - 1; i >= 0; i--) {
  169.             //console.log(player.dir, dirs_to_index[player.dir], dirs_to_index[steps[i]]);
  170.             botCode += rotateTo(dirs_to_index[player.dir], dirs_to_index[steps[i]]);
  171.             player.dir = steps[i];
  172.             botCode += "move();\n";
  173.         }
  174.  
  175.         if (beeperCount >= 0 && beeperCount < 5) {
  176.             player.p = beepers[0];
  177.             botCode += "pickBeeper();\n";
  178.             beepers.shift();
  179.             beeperCount++;
  180.         }
  181.         else if (beeperCount == 5) {
  182.             player.p = tray.p;
  183.             botCode += "repeat(5){ putBeeperInTray(); }\n";
  184.             beeperCount = -1;
  185.         }
  186.         else {
  187.             botCode += "exit();\n";
  188.             break;
  189.         }
  190.  
  191.         console.log(player.p);
  192.     }
  193.  
  194.     game.sendCode(`function main(){\n${botCode}\n}`);
  195.  
  196.     //console.log(botCode);
  197. }
  198.  
  199. for (let i = 0; i < karels.length; i++) {
  200.     if (karels[i].name == selfInfo.h) {
  201.         player = karels[i];
  202.         break;
  203.     }
  204. }
  205.  
  206. for (let i = 0; i < trays.length; i++) {
  207.     if (trays[i].owner == selfInfo.h) {
  208.         tray = trays[i];
  209.         break;
  210.     }
  211. }
  212.  
  213. let spawnCount = 0;
  214. function bpSpawn() {
  215.     game.socket.emit('spawn_beeper', {game_id: game.game_id});
  216.     if (spawnCount++ < 100) setTimeout(bpSpawn, 50);
  217. } setTimeout(bpSpawn, 1);
  218.  
  219. setTimeout(bot, 5000);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement