package src; public class SnakeBot extends Bot { int straightLength = 1; //length of the straight the bot still needs to travel(in "FOV-Tiles") int stepCounter = 0; //steps the bot has already taken on the straight int turnCount = 2; //amount of times the bot needs to turn before increasing straightLength final int VIEWRANGE = 5; //distance from one end to the bots FOV to the other (assumes square FOV) int wagonCount = 0; //amount of wagons the rover is currently pulling int angle = 0; //current angle of the rover, compared to its initial angle boolean isOnPath = true; //if the bot is on its normal search path (not pathing to a mineral) char[] clearSequence = {'<', '^', '<', '^', '^', '>', '^', '>', '^', '^', '^', '^', '>', '^', '>', '^', '<', '^', '^', '>', '^', '^', '^', '<', '^', '<', '^', '^', '^', '^', '<', '^', '^', '>'}; char[] cornerClearSequence = {'<', '^', '<', '^', '^', '>', '^', '>', '^', '^', '^', '^', '>', '^', '>', '^', '<', '^', '<', '^', '>', '^', '^', '>', '^', '>', '^', '<', '^', '^', '^', '<', '^', '<', '^', '^', '>'}; int clearSequenceCounter = 0; boolean isClearing = false; protected SnakeBot(String[] args) { super(args); } public static void main(String[] args) { SnakeBot bot = new SnakeBot(args); bot.run(); } @Override protected char nextMove(View view) throws Exception { // if (!view.data.contains("@") && isOnPath) { // // if (turnCount <= 0) { // turnCount = 2; // straightLength++; // } // if (stepCounter < straightLength * viewRange) { // stepCounter++; // return '^'; // } else { // stepCounter = 0; // turnCount--; // angle = (angle + 90) % 360; // return '>'; // } // } else if (!view.data.contains("@") && !isOnPath) { // // } else { // isOnPath = false; // //check for minerals to the left of the rover (high prio) // for (int i = 0; i < view.data.length(); i += viewRange) { // if (view.data.substring(i, i + 2).contains("@")) { // angle = (angle + 270) % 360; // return '<'; // } // } // //check for minerals in front of the rover (mid prio) // if (view.data.substring(0, view.data.length() / 2 - viewRange / 2).contains("@")) { // return '^'; // } // //check for minerals to the right of the rover (low prio) // for (int i = 3; i < view.data.length(); i += viewRange) { // if (view.data.substring(i, i + 2).contains("@")) { // angle = (angle + 90) % 360; // return '>'; // } // } // if (view.data.substring(0, 10).contains("@")) { // return '^'; // } else if (view.data.substring(10, 12).contains("@")) { // return '<'; // } else if (view.data.substring(13, 15).contains("@")) { // return '>'; // } else if (view.data.substring(15, 25).contains("@")) { // return 'v'; // } // } if (stepCounter % VIEWRANGE == 0 && !isClearing && view.data.contains("@")) { isClearing = true; } if (isClearing) { return clearFov(view); } else { if (turnCount <= 0) { turnCount = 2; straightLength++; } //if rover hasn't reached corner if (stepCounter < straightLength * VIEWRANGE) { stepCounter++; return '^'; } else { stepCounter = 0; turnCount--; return '>'; } } //return 0; } protected char clearFov(View view) { char move; //check if rover is at a corner of its search path if (stepCounter >= straightLength * VIEWRANGE) { move = cornerClearSequence[clearSequenceCounter++]; //update rover state and reset sequence after its done if (clearSequenceCounter >= cornerClearSequence.length) { isClearing = false; stepCounter = 2; turnCount--; clearSequenceCounter = 0; } } else { move = clearSequence[clearSequenceCounter++]; //update rover state and reset sequence after its done if (clearSequenceCounter >= clearSequence.length) { isClearing = false; stepCounter += 2; clearSequenceCounter = 0; } } return move; } }