// Solutions to Test 1 Review 2 CompSci 6 Fall 2005


//------------------------------------------------------------
// Question 1
//

// Part A
public boolean isInside (Point pt, Mover m)
{
    return m.getLeft() <= pt.x && pt.x <= m.getRight() &&
           m.getTop() <= pt.y && pt.y <= m.getBottom();
}

// Part B
public double averageArea (ArrayList<Mover> movers)
{
    if (movers.size() > 0)
    {
        int total = 0;

        for (Mover current : movers)
        {
            Dimension size = current.getSize();
            total += size.width * size.height;
        }

        return (double)total / movers.size();
    }
    else
    {
        return 0;
    }
}


//------------------------------------------------------------
// Question 2
//

// Part A
public int hailstone (int value)
{
    int numSteps = 1;

    while (value > 1)
    {
        numSteps++;
        if (value % 2 == 1) value = 3 * value + 1;            
        else                value /= 2;
    }

    return numSteps;
}

// Part B
public int longestHailstone (ArrayList<Integer> numbers)
{
    int maxNum = 0;
    int maxSteps = 0;

    for (Integer current : numbers)
    {
        int num = current.intValue();
        int numSteps = hailstone(num);
        if (numSteps > maxSteps)
        {
            maxSteps = numSteps;
            maxNum = num;
        }
    }

    return maxNum;
}


//------------------------------------------------------------
// Question 3
//

// Part A
public ArrayList<Player> readTeam (Scanner input)
{
    ArrayList<Player> team = new ArrayList<Player>();

    input.useDelimiter("\n");
    while (input.hasNext())
    {
        // read name
        String name = input.next();
        // read minutes
        ArrayList<Integer> minutes = new ArrayList<Integer>();
        Scanner line = new Scanner(input.next());
        while (line.hasNext())
        {
            minutes.add(line.nextInt());
        }
        // create Player
        team.add(new Player(name, minutes));
    }

    return team;
}

// Part B
public int totalNumberOfMinutes (Player player)
{
    int total = 0;

    for (int k = 0; k < player.getNumberGamesPlayed(); k++)
    {
        total += player.getMinutesForGame(k);
    }

    return total;
}

// Part C
public Player mostMinutes (ArrayList<Player> team)
{
    // assume at least one player
    Player result = team.get(0);
    int mostMinutes = totalNumberOfMinutes(result);

    // compare to rest of team
    for (int k = 1; k < team.size(); k++)
    {
        Player current = team.get(k);
        int minutes = totalNumberOfMinutes(current);
        if (minutes > mostMinutes)
        {
            mostMinutes = minutes;
            result = current;
        }
    }

    return result;
}


//------------------------------------------------------------
// Question 4
//

public class ColorCycler extends Mover
{
    private ArrayList<Color> myColors;
    private int myIndex;

    public ColorCycler (Point center, Dimension size, Point velocity,
                        ArrayList<Color> colors)
    {
        super(center, size, velocity, colors.get(0));
        myColors = colors;
        myIndex = 0;
    }

    public void paint (Graphics pen)
    {
        pen.setColor(myColors.get(myIndex));
        // OR:
        // pen.setColor(getColor());
        // implementation not shown
    }

    public void move (Dimension bounds)
    {
        myIndex = (myIndex + 1) % myColors.size();
        // OR:
        // myColor = myColors.get(myIndex);
    }
}
