diff --git a/Others/RestrictedTowerOfHanoi/Main/Hanoi.java b/Others/RestrictedTowerOfHanoi/Main/Hanoi.java new file mode 100644 index 000000000..5ad35abf0 --- /dev/null +++ b/Others/RestrictedTowerOfHanoi/Main/Hanoi.java @@ -0,0 +1,239 @@ +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