// // Difficult_Puzzle.java // Difficult Puzzle // // Created by Matthew Fahrenbacher on 8/13/04. // Copyright (c) 2004 __MyCompanyName__. All rights reserved. // // A simple Java Swing applet // import java.awt.*; import javax.swing.*; import java.awt.event.*; public class DifficultPuzzle extends JApplet implements ActionListener { private PuzzleBoard board; private JButton up, down, left, right, solve; private Timer winGameTimer; private java.util.ArrayList winningList; public void init() { Container c = getContentPane(); c.setLayout(new BorderLayout()); board = new PuzzleBoard(); board.setUpBoard(); c.add(board, BorderLayout.CENTER); up = new JButton("Up"); down = new JButton("Down"); left = new JButton("Left"); right = new JButton("Right"); solve = new JButton("Solve"); JPanel bottom = new JPanel(new FlowLayout()); bottom.add(left); bottom.add(right); bottom.add(up); bottom.add(down); bottom.add(solve); left.addActionListener(this); right.addActionListener(this); up.addActionListener(this); down.addActionListener(this); solve.addActionListener(this); c.add(bottom, BorderLayout.SOUTH); } public void actionPerformed(ActionEvent e) { Object o = e.getSource(); if(o == winGameTimer) { if(winningList != null && winningList.size() != 0) { if(!board.isAnimating()) { Move m = (Move)winningList.remove(0); board.setSelection(m.getPiece()); board.moveSelected(m.getDir()); } //winGameTimer = new Timer(500, this); //winGameTimer.setRepeats(false); winGameTimer.start(); } } if(o == up) board.moveSelected('w'); else if(o == down) board.moveSelected('s'); else if(o == left) board.moveSelected('a'); else if(o == right) board.moveSelected('d'); else if(o == solve) { if(solve.getText().equals("Pause")) { winGameTimer.stop(); solve.setText("Solve"); } else { if(winningList == null || winningList.size() == 0) winGame(); else winGameTimer.start(); solve.setText("Pause"); } } if(o != solve && o != winGameTimer) winningList = null; if(board.hasWon()) { JOptionPane.showMessageDialog(this, "You won in " + board.numMoves() + " moves! (Best known: 116)"); board.setUpBoard(); board.repaint(); } } public void winGame() { winningList = winningGame(); board.setUpBoard(); board.repaint(); winGameTimer = new Timer(500, this); winGameTimer.setRepeats(false); winGameTimer.start(); } private java.util.ArrayList winningGame() { java.util.ArrayList list = new java.util.ArrayList(); list.add(new Move(4, 'd')); list.add(new Move(1, 's')); list.add(new Move(7, 'a')); list.add(new Move(3, 's')); list.add(new Move(9, 'a')); list.add(new Move(6, 'w')); list.add(new Move(6, 'd')); list.add(new Move(9, 'd')); list.add(new Move(1, 'w')); list.add(new Move(4, 'a')); list.add(new Move(7, 'a')); list.add(new Move(3, 'a')); list.add(new Move(6, 's')); list.add(new Move(6, 's')); list.add(new Move(9, 'd')); list.add(new Move(5, 'w')); list.add(new Move(7, 'w')); list.add(new Move(4, 'd')); list.add(new Move(1, 's')); list.add(new Move(5, 'a')); list.add(new Move(9, 'a')); list.add(new Move(2, 's')); list.add(new Move(2, 's')); list.add(new Move(8, 'd')); list.add(new Move(0, 'd')); list.add(new Move(5, 'w')); list.add(new Move(1, 'w')); list.add(new Move(4, 'a')); list.add(new Move(5, 'w')); list.add(new Move(1, 'w')); list.add(new Move(7, 'a')); list.add(new Move(3, 'a')); list.add(new Move(6, 'a')); list.add(new Move(2, 's')); list.add(new Move(6, 'w')); list.add(new Move(9, 'd')); list.add(new Move(3, 'w')); list.add(new Move(4, 'd')); list.add(new Move(4, 'd')); list.add(new Move(3, 's')); list.add(new Move(0, 's')); list.add(new Move(5, 'd')); list.add(new Move(1, 'w')); list.add(new Move(7, 'w')); list.add(new Move(3, 'a')); list.add(new Move(0, 's')); list.add(new Move(0, 's')); list.add(new Move(7, 'd')); list.add(new Move(7, 'w')); list.add(new Move(9, 'a')); list.add(new Move(2, 'w')); list.add(new Move(4, 'd')); list.add(new Move(6, 's')); list.add(new Move(9, 'a')); list.add(new Move(2, 'a')); list.add(new Move(4, 'w')); list.add(new Move(6, 'd')); list.add(new Move(2, 's')); list.add(new Move(9, 'd')); list.add(new Move(1, 's')); list.add(new Move(5, 'a')); list.add(new Move(7, 'w')); list.add(new Move(9, 'd')); list.add(new Move(0, 'w')); list.add(new Move(0, 'w')); list.add(new Move(2, 'a')); list.add(new Move(4, 'a')); list.add(new Move(4, 's')); list.add(new Move(9, 's')); list.add(new Move(8, 's')); list.add(new Move(7, 'd')); list.add(new Move(5, 'd')); list.add(new Move(1, 'w')); list.add(new Move(3, 'w')); list.add(new Move(7, 'd')); list.add(new Move(5, 'd')); list.add(new Move(0, 'w')); list.add(new Move(2, 'w')); list.add(new Move(4, 'a')); list.add(new Move(4, 'a')); list.add(new Move(6, 'a')); list.add(new Move(6, 'a')); list.add(new Move(9, 's')); list.add(new Move(8, 's')); list.add(new Move(5, 's')); list.add(new Move(5, 'd')); list.add(new Move(0, 'd')); list.add(new Move(2, 'w')); list.add(new Move(2, 'w')); list.add(new Move(8, 'a')); list.add(new Move(5, 's')); list.add(new Move(5, 's')); list.add(new Move(7, 's')); list.add(new Move(7, 's')); list.add(new Move(0, 'd')); list.add(new Move(2, 'd')); list.add(new Move(1, 'd')); list.add(new Move(3, 'w')); list.add(new Move(3, 'w')); list.add(new Move(8, 'a')); list.add(new Move(5, 'a')); list.add(new Move(5, 'w')); list.add(new Move(9, 'w')); list.add(new Move(6, 'd')); list.add(new Move(4, 'd')); list.add(new Move(6, 'd')); list.add(new Move(4, 'd')); list.add(new Move(8, 's')); list.add(new Move(5, 'a')); list.add(new Move(5, 'a')); list.add(new Move(7, 'a')); list.add(new Move(7, 'a')); list.add(new Move(9, 'w')); list.add(new Move(4, 'w')); list.add(new Move(4, 'd')); list.add(new Move(8, 'd')); return list; } //returns an array list of array list //each nested list is filled with Move instances //that represent a winning strategy //to use this method to find the first/best strategy, change the continue //statement below to a break statement. Then search through the returned list //for the first puzzle that hasWon() public java.util.ArrayList generateAllSolutions() { java.util.ArrayList list = new java.util.ArrayList(); list.add(new SimplePuzzle()); SimplePuzzle puzzle; for(int i=0; i