import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.Timer; 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 < number_of_disks; i++) { Stack1.add(number_of_disks - i); } towerOfHanoi(number_of_disks, 'A', 'C', 'B'); } public static void main(String args[]) { Hanoi tower = new Hanoi(); int number = Integer.parseInt(args[0]); tower.number_of_disks = number; tower.startGame(); /*for(int i=0;i