import java.util.*; import javax.swing.*; import javax.swing.Timer; import java.awt.*; import java.awt.event.*; public class Hanoi extends JFrame{ public static int ONE_SECOND = 1000; int number_of_disks=0; int game_counter = 0; int i=0; /* GUI COMPONENTS */ public JButton move_button = new JButton(); public JButton exit_button = new JButton(); public JButton replay_button = new JButton(); public JButton auto_button = new JButton(); /* BACKEND COMPONENTS */ public ArrayList movements = new ArrayList(); public StringBuilder stringBuilder = new StringBuilder(); public ArrayList Stack1 = new ArrayList(); public ArrayList Stack2 = new ArrayList(); public ArrayList Stack3 = new ArrayList(); public void updateStacks() { if(game_counter!=movements.size()) { String temp = movements.get(game_counter); System.out.println(temp); if(temp.charAt(1)=='A') { if(temp.charAt(2)=='B') { int x = Stack1.get(Stack1.size()-1); Stack1.remove(Stack1.size()-1); Stack2.add(x); } } if(temp.charAt(1)=='C') { if(temp.charAt(2)=='B') { int x = Stack3.get(Stack3.size()-1); Stack3.remove(Stack3.size()-1); Stack2.add(x); } } if(temp.charAt(1)=='B') { if(temp.charAt(2)=='C') { int x = Stack2.get(Stack2.size()-1); Stack2.remove(Stack2.size()-1); Stack3.add(x); } else if(temp.charAt(2)=='A') { int x = Stack2.get(Stack2.size()-1); Stack2.remove(Stack2.size()-1); Stack1.add(x); } } revalidate(); repaint(); game_counter++; } } public void paint(Graphics canvas) { super.paint(canvas); //Drawing pedestels for(int i=0;i<3;i++) { canvas.drawRect(30+i*230,670,200,20); canvas.setColor(new Color(76,174,227)); //Blue Accent canvas.fillRect(30+i*230,670,200,20); canvas.fillRect(130+i*230-2,670-170,4,170); canvas.setColor(new Color(150,0,0)); //Arseny canvas.fillRect(130+i*230-2,670-170,4,170); } //Disks in stack1 for(int i=1;i<=Stack1.size();i++) { canvas.drawRect(130-Stack1.get(i-1)*10,670-i*12,Stack1.get(i-1)*20,10); canvas.setColor(new Color(64,26,0)); //Brown Wolfers canvas.fillRect(130-Stack1.get(i-1)*10,670-i*12,Stack1.get(i-1)*20,10); } //Disks in stack2 for(int i=1;i<=Stack2.size();i++) { canvas.drawRect(360-Stack2.get(i-1)*10,670-i*12,Stack2.get(i-1)*20,10); canvas.setColor(new Color(64,26,0)); //Brown Wolfers canvas.fillRect(360-Stack2.get(i-1)*10,670-i*12,Stack2.get(i-1)*20,10); } //Disks in stack3 for(int i=1;i<=Stack3.size();i++) { canvas.drawRect(590-Stack3.get(i-1)*10,670-i*12,Stack3.get(i-1)*20,10); canvas.setColor(new Color(64,26,0)); //Brown Wolfers canvas.fillRect(590-Stack3.get(i-1)*10,670-i*12,Stack3.get(i-1)*20,10); } } // Function to initialize the widget properties and the frame. public void initialize() { move_button.setIcon(new ImageIcon("../Resources/rsz_move.png")); move_button.setBounds(130,0,50,50); auto_button.setIcon(new ImageIcon("../Resources/rsz_loop.png")); auto_button.setBounds(260,0,50,50); replay_button.setIcon(new ImageIcon("../Resources/rsz_replay.jpg")); replay_button.setBounds(390,0,50,50); exit_button.setIcon(new ImageIcon("../Resources/rsz_exit.png")); exit_button.setBounds(520,0,50,50); add(move_button); add(exit_button); add(replay_button); add(auto_button); setLayout(null); setSize(720,720); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } // Main cnstructor. Hanoi() { super("restricted tower of hanoi"); initialize(); //MOVE BUTTON ACTION LISTENER move_button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateStacks(); } }); //EXIT BUTTON ACTION LISTENER exit_button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.exit(0); } }); //REPLAY BUTTON ACTION LISTENER replay_button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { startGame(); repaint(); } }); //AUTOMATIC PLAY BUTTON ACTION LISTENER auto_button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { timer.start(); if(game_counter == movements.size()) { timer.stop(); } } }); } Timer timer = new Timer(ONE_SECOND,new ActionListener() { public void actionPerformed(ActionEvent e) { updateStacks(); } }); public void startGame() { System.out.println("New Game Started"); timer.stop(); Stack1 = new ArrayList(); Stack2 = new ArrayList(); Stack3 = new ArrayList(); movements = new ArrayList(); game_counter = 0; for(int i=0;i