public class Mastermind
{

public static final int MAX_GUESSES = 100; private int pegTypes;
private int pegCount;
private int[] secretPegs;
private int[][] guessPegs;
private int[] perfectMatchCounts;
private int[] positionMatchCounts;
private int guesses;
private long startTimeMillis;

public Mastermind(int pegTypes, int pegCount) {

        this.pegTypes = pegTypes;
        this.pegCount = pegCount;
        secretPegs = new int[pegCount];
        guessPegs = new int[MAX_GUESSES][pegCount];
        perfectMatchCounts = new int[MAX_GUESSES];
        positionMatchCounts = new int[MAX_GUESSES];
        reset();

}

public int getPegTypes()
{

return pegTypes;
}

public int getPegCount()
{

return pegCount;
}

public int[] getSecretPegs()
{

return secretPegs;
}

public int[][] getGuessPegs()
{

return guessPegs;
}

public int[] getPerfectMatchCounts() {

return perfectMatchCounts;
}

public int[] getPositionMatchCounts() {

return positionMatchCounts;
}

public int getGuesses()
{

return guesses;
}

public void reset()
{

        for (int i=0; i<pegCount; i++)
        {
            secretPegs[i] = (int) (Math.random()*pegTypes+1);
        }
        guesses = 0;

}

public void guess(int[] pegs)
{

        guessPegs[guesses] = pegs;
        guesses++;
        setMatchCount();

}

private void setMatchCount()
{

        int perfectMatchCount = 0;
        int positionMatchCount = 0;
        int[] secretPegCounts = new int[pegTypes];
        int[] guessPegCounts = new int[pegTypes];

        // get perfect match count
        for (int i=0; i<pegCount; i++)
        {
            if (secretPegs[i] == guessPegs[guesses-1][i])
            {
                perfectMatchCount++;
            }
        }        

        // get position match count
        for (int i=0; i<pegCount; i++)
        {
            secretPegCounts[secretPegs[i]-1]++; 
            guessPegCounts[guessPegs[guesses-1][i]-1]++; 
        }

        positionMatchCount -= perfectMatchCount;

        for (int i=0; i<pegTypes; i++)
        {
            positionMatchCount += Math.min(secretPegCounts[i], guessPegCounts[i]); 
        }

        perfectMatchCounts[guesses-1] = perfectMatchCount;
        positionMatchCounts[guesses-1] = positionMatchCount;

}

public boolean isDone()
{

        if (guesses == 0)
        {
            return false;
        }
        else if (perfectMatchCounts[guesses-1] == pegCount)
        {
            return true;
        }
        else
        {
            return false;
        }

}

public void startTimer()
{

startTimeMillis = System.currentTimeMillis(); }

public String getElapseTime()
{

        int seconds = (int) ((System.currentTimeMillis() - startTimeMillis) / 1000);
        int minute = seconds / 60;
        int second = seconds % 60;
        return minute+"' "+second+"''";

}
}