// Terrier.java // Description: Acts like a vicious terrier! // Author: Chris Wilcox // Date: 4/28/2015 package myPackage; import myPackage.Interface.eMove; public class Terrier { // Current location of terrier public int currentRow; public int currentCol; private char board[][]; // Information about closest squirrel private int closestRow; private int closestCol; public boolean ateSquirrel; // Create a terrier public Terrier(int row, int Col, char board[][]) { this.currentRow = row; this.currentCol = Col; this.board = board; this.ateSquirrel = false; } // Getters for terrier public int getCurrentRow() { return currentRow; } public int getCurrentCol() { return currentCol; } // Move the terrier public eMove move() { // Find closest squirrel findClosest(); // Figure out move eMove e = selectMove(); // Keep the terrier on the board if ((e == eMove.DOWN_LEFT || e == eMove.DOWN || e == eMove.DOWN_RIGHT) && currentRow == board.length - 1) e = eMove.LEFT; if ((e == eMove.UP_LEFT || e == eMove.LEFT || e == eMove.DOWN_LEFT) && currentCol == 0) e = eMove.UP; if ((e == eMove.UP_LEFT || e == eMove.UP || e == eMove.UP_RIGHT) && currentRow == 0) e = eMove.RIGHT; if ((e == eMove.UP_RIGHT || e == eMove.RIGHT || e == eMove.DOWN_RIGHT) && currentCol == board[0].length - 1) e = eMove.DOWN; // Update board if (!updateBoard(e)) e = eMove.NO_MOVE; return e; } // Find closest squirrel public void findClosest() { double minimum = Double.MAX_VALUE; closestRow = -1; closestCol = -1; for (int row = 0; row < board.length; row++) { for (int col = 0; col < board[0].length; col++) { if (board[row][col] == 'S') { // Found a squirrel double distance = computeDistance(row, currentRow, col, currentCol); if (distance < minimum) { // Store the closest minimum = distance; closestRow = row; closestCol = col; } } } } } // Figure out move public eMove selectMove() { eMove move; if (closestRow < currentRow) { if (closestCol < currentCol) move = eMove.UP_LEFT; else if (closestCol == currentCol) move = eMove.UP; else move = eMove.UP_RIGHT; } else if (closestRow == currentRow) { if (closestCol < currentCol) move = eMove.LEFT; else move = eMove.RIGHT; } else { // if (closestRow > currentRow if (closestCol < currentCol) move = eMove.DOWN_LEFT; else if (closestCol == currentCol) move = eMove.DOWN; else move = eMove.DOWN_RIGHT; } return move; } // Update board with current location public boolean updateBoard(eMove e) { // Remove terrier board[currentRow][currentCol] = '-'; // Save previous position int saveRow = currentRow; int saveCol = currentCol; // Move terrier switch (e) { case LEFT: currentCol--; break; case UP_LEFT: currentRow--; currentCol--; break; case UP: currentRow--; break; case UP_RIGHT: currentRow--; currentCol++; break; case RIGHT: currentCol++; break; case DOWN_RIGHT: currentRow++; currentCol++; break; case DOWN: currentRow++; break; case DOWN_LEFT: currentRow++; currentCol--; break; default: } // Replace terrier if (board[currentRow][currentCol] == '-') { board[currentRow][currentCol] = 'T'; return true; } // Eat squirrel! else if (board[currentRow][currentCol] == 'S') { board[currentRow][currentCol] = 'A'; ateSquirrel = true; return true; } // Avoid collisions, do not move currentRow = saveRow; currentCol = saveCol; board[currentRow][currentCol] = 'T'; return false; } // Compute euclidean distance private double computeDistance(int row0, int row1, int col0, int col1) { double rowDiff = Math.pow(row1 - row0, 2); double colDiff = Math.pow(col1 - col0, 2); return Math.sqrt(rowDiff + colDiff); } }