private void moveEvolver(Evolver e) {
		int direction = e.getDirection();
		int[] coords = e.getCoords();
		int[] facingCoords = normalize(addCoords(coords,this.directions.get(direction)));
		
		// The value of the cell the evolver is facing
		int facingCell = cells[facingCoords[1]][facingCoords[0]].getContents();
		
		// Get the action from the evolver.
		int action = e.getAction(facingCell);
		
		int newDirection;
		switch (action) {
		case 0:
			// Move forward if the cell isn't blocked.
			if (!cells[facingCoords[1]][facingCoords[0]].isBlocked()) {
				e.setCoords(facingCoords[0], facingCoords[1]);
				consume(e, facingCoords);
				cells[coords[1]][coords[0]].removeEvolver();
				cells[facingCoords[1]][facingCoords[0]].addEvolver(e.getDirection());
			}
			break;
		case 1:
			// Turn left.
			newDirection = direction + 1;
			if (newDirection >= 4) newDirection -= 4;
			e.setDirection(newDirection);
			cells[coords[1]][coords[0]].addEvolver(newDirection);
			break;
		case 2:
			// Turn right.
			newDirection = direction - 1;
			if (newDirection < 0) newDirection += 4;
			e.setDirection(newDirection);
			cells[coords[1]][coords[0]].addEvolver(newDirection);
			break;
		case 3:
			// Move backward if the cell isn't blocked.
			int backDirection = direction + 2;
			if (backDirection >= 4) backDirection -= 4;
			
			int[] newCoords = normalize(addCoords(coords,this.directions.get(backDirection)));
			
			if (!cells[newCoords[1]][newCoords[0]].isBlocked()) {
				e.setCoords(newCoords[0],newCoords[1]);
				consume(e, newCoords);

				cells[coords[1]][coords[0]].removeEvolver();
				cells[newCoords[1]][newCoords[0]].addEvolver(e.getDirection());
			}
			break;
		}
	}