Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const dirs_cardinal = {
- NORTH: "u",
- WEST: "l",
- EAST: "r",
- SOUTH: "d",
- };
- const dirs = [
- "u",
- "r",
- "d",
- "l",
- ];
- const dirs_val = [
- [0, 1], // N
- [1, 0], // E
- [0, -1], // S
- [-1, 0], // W
- ];
- let dirs_to_index = {};
- for (let i = 0; i < dirs.length; i++) dirs_to_index[dirs[i]] = i;
- let trollInterval;
- let beeperSpawnInterval;
- const selfId = 1595;
- const cellSize = 24;
- const gridSize = 18;
- let trollCode = `
- function main() {
- repeat(999999) {
- turnRight();
- move();
- }
- }
- `;
- let game = $('#challenge_iframe')[0].contentWindow;
- let stop = false;
- let debug = false;
- let spawnRandomBeepers = false;
- let player;
- let beepers;
- let karels = game.ig.game.getEntitiesByType('EntityKarel');
- let selfInfo = JSON.parse(game.players[selfId]);
- let exit = game.ig.game.getEntitiesByType('EntityExit')[0];
- let tray;
- let trays = game.ig.game.getEntitiesByType('EntityTray');
- let beeperCount = 0;
- function rotateTo(from, to) {
- let c = 0;
- let index = from;
- while (index != to) {
- index = (index + 1) % 4;
- c++;
- }
- if (c == 0) return "";
- else return `repeat(${c}){ turnRight(); }\n`;
- }
- function distance(p1, p2) {
- let d1 = p1[0] - p2[0];
- let d2 = p1[1] - p2[1];
- return Math.sqrt(d1*d1 + d2*d2);
- }
- function getDir(before, after) {
- if (after[0] > before[0]) return "l";
- if (after[0] < before[0]) return "r";
- if (after[1] > before[1]) return "u";
- if (after[1] < before[1]) return "d";
- }
- function getPos(entity) {
- return [
- parseInt(entity.pos.x / cellSize) - 1,
- parseInt(entity.pos.y / cellSize) - 1,
- ];
- }
- function strPos(_objPos) {
- //return `{"x":"${_objPos[0]}","y":"${_objPos[1]}"}`;
- return `${_objPos[0]},${_objPos[1]}`;
- }
- function objPos(_strPos) {
- return _strPos.split(',').map(i => parseInt(i))
- }
- function getBeepers(_player) {
- let _beepers = game.ig.game.getEntitiesByType('EntityBeeper');
- for (let i = 0; i < _beepers.length; i++) {
- _beepers[i] = getPos(_beepers[i]);
- }
- _beepers.sort(function(a, b) {
- let da = distance(a, _player.p);
- let db = distance(b, _player.p);
- if (da < db) return -1;
- if (da > db) return 1;
- return 0;
- });
- return _beepers;
- }
- function BFS(start, goal) {
- let queue = new Array();
- queue.push(start);
- let from = {};
- from[strPos(start)] = null;
- while (queue.length > 0) {
- let current = queue[0];
- queue.shift();
- if (current[0] == goal[0] && current[1] == goal[1]) return from;
- for (let i = 0; i < dirs_val.length; i++) {
- let next = [
- current[0] + dirs_val[i][0],
- current[1] + dirs_val[i][1],
- ];
- if (next[0] < 0 || next[1] < 0 || next[0] >= gridSize || next[1] >= gridSize || from.hasOwnProperty(strPos(next)))
- continue;
- queue.push(next);
- from[strPos(next)] = current;
- }
- }
- }
- function bot() {
- let botCode = "";
- let path;
- let last;
- let steps;
- player.dir = dirs_cardinal[player.facing];
- player.p = getPos(player);
- tray.p = getPos(tray);
- exit.p = getPos(exit);
- beepers = getBeepers(player);
- beeperCount = 0;
- while (true) {
- console.log(beeperCount);
- if (beeperCount >= 0 && beeperCount < 5) {
- path = BFS(player.p, beepers[0]);
- current = strPos(beepers[0]);
- }
- else if (beeperCount == 5) {
- path = BFS(player.p, tray.p);
- current = strPos(tray.p);
- }
- else {
- path = BFS(player.p, exit.p);
- current = strPos(exit.p);
- }
- steps = new Array();
- while (true) {
- if (path[current] === null) break;
- last = current;
- current = strPos(path[current]);
- steps.push(getDir(objPos(last), objPos(current)));
- }
- console.log(steps);
- for (let i = steps.length - 1; i >= 0; i--) {
- //console.log(player.dir, dirs_to_index[player.dir], dirs_to_index[steps[i]]);
- botCode += rotateTo(dirs_to_index[player.dir], dirs_to_index[steps[i]]);
- player.dir = steps[i];
- botCode += "move();\n";
- }
- if (beeperCount >= 0 && beeperCount < 5) {
- player.p = beepers[0];
- botCode += "pickBeeper();\n";
- beepers.shift();
- beeperCount++;
- }
- else if (beeperCount == 5) {
- player.p = tray.p;
- botCode += "repeat(5){ putBeeperInTray(); }\n";
- beeperCount = -1;
- }
- else {
- botCode += "exit();\n";
- break;
- }
- console.log(player.p);
- }
- game.sendCode(`function main(){\n${botCode}\n}`);
- //console.log(botCode);
- }
- for (let i = 0; i < karels.length; i++) {
- if (karels[i].name == selfInfo.h) {
- player = karels[i];
- break;
- }
- }
- for (let i = 0; i < trays.length; i++) {
- if (trays[i].owner == selfInfo.h) {
- tray = trays[i];
- break;
- }
- }
- let spawnCount = 0;
- function bpSpawn() {
- game.socket.emit('spawn_beeper', {game_id: game.game_id});
- if (spawnCount++ < 100) setTimeout(bpSpawn, 50);
- } setTimeout(bpSpawn, 1);
- setTimeout(bot, 5000);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement