import java.util.Random;

	public class Direction {
		// OVERVIEW: Immutable type for representing a compass direction.
		//   A direction is one of: N, NE, E, SE, S, SW, W, NW.
		//	 If the streaker is the one in motion, they only move in the S, SW, or SE directions.
		
		// Rep:
		private int northsouth; 
		private int eastwest;

		// RI (c) =
		//      (c.northsouth == -1 || c.northsouth == 0 || c.northsouth == 1)
		//   && (c.eastwest == -1 || c.eastwest == 0 || c.eastwest == 1)
		//   && (c.northsouth != 0 || c.eastwest != 0)

		//@invariant northsouth >= -1 && northsouth <= 1
		//@invariant eastwest >= -1 && eastwest <= 1
		//@invariant northsouth != 0 || eastwest != 0

		static final public Direction NORTH = new Direction (1, 0);
		static final public Direction NORTHEAST = new Direction (1, 1);
		static final public Direction EAST = new Direction (0, 1);
		static final public Direction SOUTHEAST = new Direction (-1, 1);
		static final public Direction SOUTH = new Direction (-1, 0);
		static final public Direction SOUTHWEST = new Direction (-1, -1);
		static final public Direction WEST = new Direction (0, -1);
		static final public Direction NORTHWEST = new Direction (1, -1);

		// Private class variable for generating random numbers.
		static private /*@non_null@*/ Random random = new Random ();

		public Direction (int ns, int ew)
		//@requires ns >= -1 && ns <= 1
		//@requires ew >= -1 && ew <= 1
		//@requires ns != 0 || ew != 0
		// EFFECTS: Creates a new direction with northerly direction ns and easterly direction ew.
		{
		northsouth = ns;
		eastwest = ew;
		}

		public String toString ()
		{
		String res;

		switch (northsouth) 
			{
			case 1:  res = "north"; break;
			case -1: res = "south"; break;
			default: res = ""; break;
			}

		switch (eastwest) 
			{
			case 1: res += "east"; break;
			case -1: res += "west"; break;
			default: break;
			}

		return res;
		}

		public int northerlyDirection () {
		return northsouth;
		}

		public int easterlyDirection () {
		return eastwest;
		}

		static public Direction randomDirection () {
		// EFFECTS: Returns a random direction.
		int dir = random.nextInt (8);

		switch (dir) {
		case 0: return NORTH;
		case 1: return NORTHEAST;
		case 2: return EAST;
		case 3: return SOUTHEAST;
		case 4: return SOUTH;
		case 5: return SOUTHWEST;
		case 6: return WEST;
		case 7: return NORTHWEST;	 
		}throw new RuntimeException ("BUG: This should never be reached!");
		 //@nowarn Exception // Unexpected RuntimeException is okay here.
		}
		
				
		static public Direction streakerDirCabell () {
		//EFFECTS: Returns a random direction toward Cabell Hall, 
		//			which is either South, Southeast, or Southwest.
		int dir= random.nextInt(3);
		
		switch (dir) {
		case 0: return SOUTH;
		case 1: return SOUTHEAST;
		case 2: return SOUTHWEST;
		}
	
		throw new RuntimeException ("BUG: This should never be reached!");
		} //@nowarn Exception // Unexpected RuntimeException is okay here.
	}