/**
* Title: class Robot
* Description: Simple representation of a robot.
* Copyright (c) 2001
* Organisation: UCL
* @author Graham Roberts
* @version 1.1 10/03
*/
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)
{
}
}
}