import java.util.LinkedList; public class Stack { private LinkedList liste; public Stack(){ liste = new LinkedList(); } public void push(AnyType p){ liste.add(p); } public AnyType top(){ return liste.getLast(); } public AnyType pop(){ AnyType p = liste.getLast(); liste.removeLast(); return p; } public AnyType[] toArray(AnyType[] e){ return liste.toArray(e); } public Object[] toArray(){ return liste.toArray(); } } import java.awt.Graphics; public interface Element { public void tegn(Graphics g); public int getX(); public int getY(); public void setX(int nyX); public void setY(int nyY); public int getBredde(); public int getHøyde(); public boolean erPå(int x,int y); } import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.util.ArrayList; import java.util.NoSuchElementException; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import static javax.swing.JOptionPane.*; public class Hoved extends JFrame implements ActionListener, MouseListener, MouseMotionListener { private JButton btnLøs; private JButton btnStart; private JLabel lblAnt; private JTextField txtAnt; private JLabel lblSove; private JTextField txtSove; private Tegning tegning; private static Dimension skjermstr; private Tårn en; private Tårn to; private Tårn tre; private Tårn[] tårna = new Tårn[3]; private int gammelX; private int gammelY; private Ring ringen; private int draggeTeller=0; private Tårn tårnet; private Tårn gammeltTårn; private boolean ringFunnet; private boolean endret=false; private int antTrekk=0; public static void main(String[] args){ try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); Toolkit verktøy = Toolkit.getDefaultToolkit(); skjermstr = verktøy.getScreenSize(); Hoved ramme = new Hoved(); ramme.setSize((int)skjermstr.getWidth(),(int)skjermstr.getHeight()-50); ramme.setTitle("Hanoi tårn"); ramme.setDefaultCloseOperation(EXIT_ON_CLOSE); ramme.opprettGUI(); ramme.setVisible(true); } catch (Exception e) { showMessageDialog(null,"Det skjedde en feil ved lasting av GUI..."+"\n"+e.getMessage()); } } public void opprettGUI(){ Container rute = this.getContentPane(); rute.setLayout(new BorderLayout()); btnLøs = new JButton("Løs..."); btnLøs.addActionListener(this); lblAnt = new JLabel("Ant ringer: "); txtAnt = new JTextField(2); btnStart = new JButton("Start..."); btnStart.addActionListener(this); lblSove = new JLabel("Sovetid(msek)"); txtSove = new JTextField("200",4); JPanel knappePanel = new JPanel(new FlowLayout()); knappePanel.add(btnLøs); knappePanel.add(lblAnt); knappePanel.add(txtAnt); knappePanel.add(btnStart); knappePanel.add(lblSove); knappePanel.add(txtSove); rute.add(knappePanel,"North"); tegning = new Tegning(); tegning.setBackground(Color.WHITE); tegning.addMouseListener(this); tegning.addMouseMotionListener(this); rute.add(tegning,"Center"); } public void opprettElementer(int antRinger){ //Tårna: en = new Tårn(15,skjermstr.height-150); to = new Tårn(430,skjermstr.height-150); tre = new Tårn(845,skjermstr.height-150); tårna[0] = en; tårna[1] = to; tårna[2] = tre; for(int i=0;i 0 && gammeltTårn.ringer.toArray().length > 0){ if(tårnet.top().getBredde() x && innX < (x+bredde) && innY > y && innY < (y+høyde)){ return true; } else return false; } public String toString(){ return "Ring funnet, x= "+x+", y= "+y; } public void flytt(int innX,int innY,Graphics g){ this.tegn(g,Color.WHITE); x=innX-(bredde/2); y=innY-(høyde/2); } } import java.awt.Color; import java.awt.Graphics; import javax.swing.JPanel; public class Tegning extends JPanel { Graphics g; public void paintComponent(Graphics inng){ g = inng; super.paintComponent(g); g.setColor(Color.BLUE); } } import java.awt.Color; import java.awt.Graphics; public class Tårn implements Element{ private int sokkelBredde; private int sokkelHøyde; private int tårnBredde; private int tårnHøyde; private int x; private int y; private Color c; Stack ringer; public Tårn(int startSokkelBredde, int startSokkelHøyde, int startTårnBredde, int startTårnHøyde, int startX,int startY, Color startC){ sokkelBredde = startSokkelBredde; sokkelHøyde = startSokkelHøyde; tårnBredde = startTårnBredde; tårnHøyde = startTårnHøyde; x = startX; y = startY; c = startC; ringer = new Stack(); } public Tårn(int startX,int startY,Color startC){ sokkelBredde = 300; sokkelHøyde = 30; tårnBredde = 15; tårnHøyde = 500; x = startX; y = startY; c = startC; ringer = new Stack(); } public Tårn(int startX,int startY){ sokkelBredde = 400; sokkelHøyde = 30; tårnBredde = 15; tårnHøyde = 500; x = startX; y = startY; c = Color.BLACK; ringer = new Stack(); } public void tegn(Graphics g){ g.setColor(c); g.draw3DRect(x, y, sokkelBredde,sokkelHøyde, true); g.draw3DRect((x+(sokkelBredde/2))-(tårnBredde/2),y-tårnHøyde,tårnBredde,tårnHøyde, true); Object[] tegnDisse = this.toArray(); for(Object o:tegnDisse){ Element e = (Element)o; e.tegn(g); } } public Object[] toArray(){ return ringer.toArray(); } public int getX() { return x; } public int getY() { return y; } public void setX(int nyX){ x = nyX; } public void setY(int nyY){ y = nyY; } public int getBredde(){ return sokkelBredde; } public int getHøyde(){ return sokkelHøyde; } public boolean erPå(int innX,int innY){ if(innX > x && innX < (x+sokkelBredde) && innY < y && innY > (y-tårnHøyde)){ return true; } else return false; } public String toString(){ return "Tårn funnet: x= "+x+", y= "+y; } public Element pop(){ return ringer.pop(); } public Element top(){ return ringer.top(); } public void push(Element ring){ int antallFraFør = toArray().length; ring.setX((x+(sokkelBredde/2))-(ring.getBredde()/2)); ring.setY(y-((antallFraFør+1)*31)); ringer.push(ring); } }