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)
{
}
}
}