Class Robot


/**
* Title: class Robot
* Description: Simple representation of a robot.
* Copyright (c) 2004
* Organisation: UCL
* @author Graham Roberts
* @version 1.2 10/04
*/
import java.awt.*; class Robot { private int xpos; private int ypos; private int direction; private Room room; private int speed; private boolean hasWidget; public Robot(int x, int y, int d, Room r) { xpos = x; ypos = y; direction = d; hasWidget = false; room = r; room.setRobotPosition(xpos, ypos, direction); speed = 1000; } public void forward() { pause(); if (!canMoveForward()) { room.beep(); return; } switch (direction) { case Room.NORTH: ypos--; break; case Room.EAST: xpos++; break; case Room.SOUTH: ypos++; break; case Room.WEST: xpos--; break; } room.setRobotPosition(xpos, ypos, direction); } public void left() { pause(); switch (direction) { case Room.NORTH: direction = Room.WEST; break; case Room.EAST: direction = Room.NORTH; break; case Room.SOUTH: direction = Room.EAST; break; case Room.WEST: direction = Room.SOUTH; break; } room.setRobotPosition(xpos, ypos, direction); } public void right() { pause(); switch (direction) { case Room.NORTH: direction = Room.EAST; break; case Room.EAST: direction = Room.SOUTH; break; case Room.SOUTH: direction = Room.WEST; break; case Room.WEST: direction = Room.NORTH; break; } room.setRobotPosition(xpos, ypos, direction); } public boolean canMoveForward() { switch (direction) { case Room.NORTH: if ((ypos > 0) && !room.isObstacleAt(xpos, ypos - 1)) { return true; } break; case Room.EAST: if ((xpos < room.getRoomSizeX() - 1) && !room.isObstacleAt(xpos + 1, ypos)) { return true; } break; case Room.SOUTH: if ((ypos < room.getRoomSizeY() - 1) && !room.isObstacleAt(xpos, ypos + 1)) { return true; } break; case Room.WEST: if ((xpos > 0) && !room.isObstacleAt(xpos - 1, ypos)) { return true; } break; } return false; } public boolean atDoor() { int wall = room.getDoorWall(); int position = room.getDoorPosition(); int x = 0; int y = 0; switch (wall) { case Room.NORTH: x = position; y = 0; break; case Room.EAST: x = room.getRoomSizeX() - 1; y = position; break; case Room.SOUTH: x = position; y = room.getRoomSizeY() - 1; break; case Room.WEST: x = 0; y = position; break; } if ((xpos == x) && (ypos == y)) { return true; } else { return false; } } public void done() { room.setRobotColour(Color.green); } public void setSpeed(double seconds) { speed = (int) (seconds * 1000); } public boolean atWidget() { return room.isWidgetAt(xpos, ypos); } public void pickUpWidget() { if (atWidget() && !hasWidget) { hasWidget = true; room.getWidget(xpos, ypos); } else { room.beep(); } } public void dropWidget() { if (hasWidget) { room.setWidget(xpos, ypos); hasWidget = false; } else { room.beep(); } } private void pause() { try { Thread.sleep(speed); } catch (InterruptedException e) { } } }