/** Called every round. */ @Override public void run() throws GameActionException { while (!RC.isActive()) { RC.yield(); } Robot[] robots = Utils.RC.senseNearbyGameObjects(Robot.class, 35, ENEMY_TEAM); Utils.RC.setIndicatorString(1, "" + robots.length); for (int i = 0; i < robots.length; ++i) { messagingSystem.writeAttackMessage(Utils.RC.senseRobotInfo(robots[i]).location); messagingSystem.writeMicroMessage(Utils.RC.senseRobotInfo(robots[i]).location, 1); } makeSomeNoise(); }
public static boolean pathbetween(MapLocation a, MapLocation b) { while (!a.equals(b)) { a = a.add(a.directionTo(b)); if (RC.senseTerrainTile(a) == TerrainTile.VOID) return false; } return true; }
public void earlyNearbyCows() throws GameActionException { target = null; double numCows = -1.0; for (int x = -8; x <= 8; x++) { for (int y = -8; y <= 8; y++) { MapLocation lookat = currentLocation.add(x, y); if (lookat.distanceSquaredTo(ALLY_PASTR_COUNT > 0 ? ALLY_PASTR_LOCS[0] : currentLocation) <= 5 || !RC.canSenseSquare(lookat)) continue; double t = RC.senseCowsAtLocation(lookat); if (t > numCows) { numCows = t; target = lookat; } } } System.out.println("target" + target + " numcows " + numCows); }
public static void makeSomeNoise() throws GameActionException { // assumes RC is active incrementAB(); if (b < pathat[a] - 1 && b > 1 && paths[a][b] != null && paths[a][b + 1] != null && paths[a][b - 1] != null) { if (paths[a][b].directionTo(paths[a][b + 1]) == paths[a][b - 1].directionTo(paths[a][b])) { b--; } } if (paths[a][b] != null) { if (RC.canAttackSquare(paths[a][b].add(directions[a]))) { RC.attackSquare(paths[a][b].add(directions[a])); } else { makeSomeNoise(); } } }
public NoiseTowerBehavior() { for (int i = 7; i >= 0; i--) { int lastdir = (i + 4) % 8; int at = 1; paths[i][0] = currentLocation; int lastcow = 0; for (int j = 1; j < 30; j++) { if (i < 7 && RC.isActive()) { try { makeSomeNoise(); } catch (GameActionException e1) { e1.printStackTrace(); } } int k = lastdir + 2; k %= 8; int bestscore = -1; MapLocation bestplace = currentLocation; while (k != (lastdir + 6) % 8) { int score = Math.abs(i - k); if (score < 4) score = 8 - score; score *= score * score; MapLocation here = paths[i][j - 1].add(directions[k]); double cows; try { cows = Utils.COW_GROWTH[here.x][here.y]; if (cows > 0) lastcow = j; score = (here.add(directions[k])).distanceSquaredTo(currentLocation) > 300 || RC.senseTerrainTile(here) == TerrainTile.VOID ? -10 : cows == 0.0 ? 30 : score + (int) (cows) * 0 + 30; } catch (Exception e) { score = -2; } if (score > bestscore) { bestscore = score; bestplace = here; } k++; if (k == 8) k = 0; } if (!bestplace.equals(currentLocation)) { paths[i][j] = bestplace; } else { break; } } pathat[i] = lastcow; while (paths[i][pathat[i]] == null && pathat[i] > 0) pathat[i]--; if (lastcow < 29) lastcow++; } skip[0] = false; double[] d = new double[8]; int[] dist = new int[8]; MapLocation[] toconsider = new MapLocation[8]; for (int i = 7; i >= 0; i--) { if (pathat[i] == 0) { d[i] = 0; dist[i] = 0; } else { toconsider[i] = paths[i][pathat[i] - 1]; d[i] = Math.atan2(toconsider[i].y - curY, toconsider[i].x - curX); dist[i] = currentLocation.distanceSquaredTo(toconsider[i]); } } for (int i = 7; i >= 0; i--) { if (dist[i] == 0) skip[i] = true; else { for (int j = i - 1; j >= 0; j--) { if (i == j || dist[j] == 0) continue; if (Math.abs(d[i] - d[j]) < 0.4 && pathbetween(toconsider[i], toconsider[j])) { if (dist[i] < dist[j]) skip[i] = true; else skip[j] = true; } } } } }
public BFSNoiseTower() throws GameActionException { System.out.println("start " + Clock.getBytecodeNum()); queue[0] = currentLocation; dir[17][17] = Direction.OMNI; for (int i = 7; i >= 0; i--) { Direction d = directions[i]; MapLocation loc = currentLocation.add(d); TerrainTile there = RC.senseTerrainTile(loc); if (!there.isTraversableAtHeight(RobotLevel.ON_GROUND)) continue; int x = loc.x - currentLocation.x; int y = loc.y - currentLocation.y; dir[x + 17][y + 17] = d.opposite(); queue[at] = loc; at++; } for (int s = 1; s < at; s++) { if (s % 30 == 0 && RC.isActive()) { if (target == null || target.distanceSquaredTo(ALLY_PASTR_COUNT > 0 ? ALLY_PASTR_LOCS[0] : currentLocation) <= 5) { earlyNearbyCows(); } MapLocation realTarget = target.add(currentLocation.directionTo(target), 3); if (RC.canAttackSquare(realTarget)) RC.attackSquare(realTarget); target = target.add(target.directionTo(currentLocation)); } Direction initD = dir[queue[s].x - currentLocation.x + 17][queue[s].y - currentLocation.y + 17]; Direction aD; Direction bD; if (initD.isDiagonal()) { aD = initD.rotateLeft().rotateLeft(); bD = initD.rotateRight(); } else { aD = initD.rotateLeft().rotateLeft().rotateLeft(); bD = initD.rotateRight().rotateRight(); } for (Direction d = aD; d != bD; d = d.rotateLeft()) { MapLocation loc = queue[s].add(d); TerrainTile there = RC.senseTerrainTile(loc); if (!there.isTraversableAtHeight(RobotLevel.ON_GROUND)) continue; int x = loc.x - currentLocation.x; int y = loc.y - currentLocation.y; if (x * x + y * y > 200) continue; if (dir[x + 17][y + 17] == null) { dir[x + 17][y + 17] = d.opposite(); queue[at] = loc; at++; } } } System.out.println("end " + Clock.getBytecodeNum()); System.out.println("at " + at); }
public boolean compute(int bytecodes) { // cache variables int d, w, e, x, y; int[] weight; MapLocation next, nbr; Direction dir; final BucketQueue<MapLocation> queue = this.queue; final int[][] distance = this.distance; final Direction[][] from = this.from; // int iters = 0; // int bc = Clock.getBytecodeNum(); while (queue.size > 0) { // iters++; if (Clock.getBytecodeNum() >= bytecodes - 600) { break; } // RC.setIndicatorString(0, Integer.toString(min)); // ALERT: queue.min is valid only after a call to deleteMin()! next = queue.deleteMin(); x = next.x; y = next.y; d = distance[x][y]; // check if we have already visited this node if (!visited[x][y]) { visited[x][y] = true; /* * if (broadcast) { * try { * messagingSystem.writePathingDirection(next, from[x][y]); * } catch (GameActionException ex) { * ex.printStackTrace(); * } * } */ weight = WEIGHT[RC.senseTerrainTile(next).ordinal()]; dir = from[x][y]; int i; if (dir == Direction.NONE) { dir = Direction.NORTH; i = 8; } else if (dir.isDiagonal()) { dir = dir.rotateLeft().rotateLeft(); i = 5; } else { dir = dir.rotateLeft(); i = 3; } for (; --i >= 0; dir = dir.rotateRight()) { nbr = next.add(dir); if (RC.senseTerrainTile(nbr).isTraversableAtHeight(RobotLevel.ON_GROUND)) { w = d + weight[dir.ordinal()]; e = w + heuristic(next, dest); x = nbr.x; y = nbr.y; if (from[x][y] == null) { queue.insert(e, nbr); // if (RC.getRobot().getID() == 118) // System.out.println("inserted " + nbr + ": " + w + " " + e); distance[x][y] = w; // estimate[x][y] = e; from[x][y] = dir; } else { if (w < distance[x][y]) { queue.insert(e, nbr); distance[x][y] = w; // estimate[x][y] = e; from[x][y] = dir; visited[x][y] = false; } } } } } } // bc = Clock.getBytecodeNum() - bc; // RC.setIndicatorString(2, "average DStar bytecodes: " + (iters > 0 ? bc / iters : bc)); return arrived(dest); }