Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Write a description of class Rekursi_TowerOFHanoi here.
- *
- * Samuel Berkat Hulu
- * 5025201055
- *
- * @version 5.0 Tugas Sturktur data 4 Juni 2021
- */
- import java.awt.Toolkit;
- import java.awt.Graphics;
- import java.awt.Color;
- import java.awt.FlowLayout;
- import java.awt.Container;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.util.Stack;
- import java.util.EmptyStackException;
- import javax.swing.JFrame;
- import javax.swing.JLabel;
- import javax.swing.JPanel;
- import javax.swing.JScrollPane;
- import javax.swing.JTextField;
- //disk class
- class TowerStack extends Stack<Integer> {
- public void display(int x, int y, Graphics g) {
- for(int i = 0; i < size(); i++) {
- int width = 20*((Integer)get(i)).intValue();
- g.setColor(Color.green);
- g.fillRoundRect(x-width/2,y-10*(i+1),width+1,10,10,10);
- g.setColor(Color.red);
- g.drawRoundRect(x-width/2,y-10*(i+1),width+1,10,10,10);
- }
- }
- }
- public class Towers_Of_Hanoi {
- JFrame theFrame;
- JLabel promptN;
- int n;
- int moves;
- JTextField inputN;
- JPanel one;
- JScrollPane inputPane;
- final int WIDTH = 650;
- final int HEIGHT = 500;
- final int XLEFT = 110;
- final int XMIDDLE = 320;
- final int XRIGHT = 520;
- final int YDOWN = 280;
- final int YUP = 170;
- final int WIDTHINC = 110;
- final int HEIGHTINC = 220;
- Graphics g;
- TowerStack tow1 = new TowerStack();
- TowerStack tow2 = new TowerStack();
- TowerStack tow3 = new TowerStack();
- public Towers_Of_Hanoi() {
- theFrame = new JFrame("Towers of Hanoi");
- Toolkit tk = Toolkit.getDefaultToolkit();
- theFrame.setSize(WIDTH,HEIGHT);
- theFrame.setLocation(tk.getScreenSize().width/4,tk.getScreenSize().height/4);
- theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- Container content = theFrame.getContentPane();
- content.setBackground(Color.white);
- content.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
- one = new JPanel();
- promptN= new JLabel("Enter the number of disks (1-10): ");
- one.add(promptN);
- inputN= new JTextField(5);
- inputN.addActionListener(new inputNAction());
- one.add(inputN);
- one.setBackground(Color.green);
- inputPane = new JScrollPane(one);
- content.add(inputPane);
- theFrame.setVisible(true);
- }
- public static void main(String[] args) {
- new Towers_Of_Hanoi();
- }
- public void moveDisks(int n, TowerStack source, TowerStack dest, TowerStack aux){
- if ( n == 0 ) return;
- moveDisks(n-1,source,aux,dest);
- dest.push( source.pop());
- moves++;
- drawTowers(g);
- moveDisks(n-1,aux,dest,source);
- }
- public void drawLines(Graphics g) {
- g.drawLine(XLEFT,YDOWN,XLEFT,YUP);
- g.drawLine(XMIDDLE,YDOWN,XMIDDLE,YUP);
- g.drawLine(XRIGHT,YDOWN,XRIGHT,YUP);
- g.drawLine(10,YDOWN,HEIGHTINC,YDOWN);
- g.drawLine(10+WIDTHINC,YDOWN,2*HEIGHTINC,YDOWN);
- g.drawLine(10+2*WIDTHINC,YDOWN,3*HEIGHTINC,YDOWN);
- }
- public void drawTowers(Graphics g) {
- g.setColor(Color.white);
- g.fillRect(0,75,WIDTH,HEIGHT-75);
- g.setColor(Color.green);
- drawLines(g);
- tow1.display(XLEFT,YDOWN,g);
- tow2.display(XMIDDLE,YDOWN,g);
- tow3.display(XRIGHT,YDOWN,g);
- try{Thread.sleep(500);}catch(Exception e){}
- }
- class inputNAction implements ActionListener {
- public void actionPerformed(ActionEvent A){
- try{
- n=Integer.parseInt(inputN.getText());
- } catch(NumberFormatException e){
- inputN.setText("1 to 10");
- inputN.selectAll();
- return;
- }
- if( n < 1 || n > 10 ){
- inputN.setText("1 to 10");
- inputN.selectAll();
- return;
- }
- inputN.setText("");
- moves = 0;
- tow1.setSize(0);
- for(int i = n; i > 0; i--) {
- tow1.push(i);
- }
- tow2.setSize(0);
- tow3.setSize(0);
- g = theFrame.getGraphics();
- drawTowers(g);
- moveDisks(n,tow1,tow3,tow2);
- g.drawString("___________________________"+n+" disks need "+moves+" move"+(moves>1?"s":"")+"___________________________",100,100);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement