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+"''";}
}