// Puzzle.java import java.awt.*; import java.net.*; public class Puzzle extends Panel { private ColorButton[][] tile; private Image[] image; private int puzzleSize, dim; private PuzzleStarter ps; private int[] prevState; public Puzzle(PuzzleStarter _ps, int _puzzleSize) { super(); ps = _ps; puzzleSize = _puzzleSize; dim = (int)Math.sqrt(puzzleSize); setSize(192, 192); tile = new ColorButton[dim][dim]; image = new Image[puzzleSize]; prevState = new int[puzzleSize]; for(int i = 1; i < puzzleSize; i++) prevState[i - 1] = i; prevState[puzzleSize - 1] = 0; try { String fileBase, fileStr; if (puzzleSize == 9) fileBase = "Images/8Puzzle/shrksign_"; else fileBase = "Images/15Puzzle/shrksign_"; if (ps != null) for(int i = 0; i < puzzleSize; i++) { fileStr = fileBase; if (i <= 9) fileStr += "0"; trackImage(i, getToolkit().getImage( new URL(ps.getCodeBase() + fileStr + Integer.toString(i) + ".gif"))); } else for(int i = 0; i < puzzleSize; i++) { fileStr = fileBase; if (i <= 9) fileStr += "0"; trackImage(i, getToolkit().getImage(fileStr + Integer.toString(i) + ".gif")); } } catch (MalformedURLException mfe) { System.err.println("Error: " + mfe); } setLayout(new GridLayout(dim, dim)); int pos = 1; for(int i = 0; i < dim; i++) for(int j = 0; j < dim; j++) { if (pos == puzzleSize) tile[i][j] = new ColorButton(image[0], 1, Color.blue); else tile[i][j] = new ColorButton(image[pos], 1, Color.blue); add(tile[i][j]); pos++; } } public void putInOrder() { int pos = 0; int[] state = new int[puzzleSize]; for(int i = 1; i < puzzleSize; i++) state[i - 1] = i; state[puzzleSize - 1] = 0; for(int i = 0; i < dim; i++) for(int j = 0; j < dim; j++) { if (state[pos] != prevState[pos]) { tile[i][j].setImage(image[state[pos]]); tile[i][j].repaint(); } prevState[pos] = state[pos]; pos++; } } public void setOrder(int[] state) { int pos = 0; for(int i = 0; i < dim; i++) for(int j = 0; j < dim; j++) { if (state[pos] != prevState[pos]) { tile[i][j].setImage(image[state[pos]]); tile[i][j].repaint(); } prevState[pos] = state[pos]; pos++; } } private void trackImage(int index, Image _image) { image[index] = _image; MediaTracker tracker = new MediaTracker(this); tracker.addImage(image[index], 0); try { tracker.waitForAll(); } catch (InterruptedException ie) { System.err.println("Image loading interrupted: " + ie); } } }