Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package SOH;
- import java.awt.*;
- import javax.swing.*;
- @SuppressWarnings("serial")
- public class SnowmanOfHanoi extends JComponent {
- private int n, snowmanHeight, floorLevel;
- private final int snowballSize = 25;
- private int[] x = new int[6], y = new int[6], diameter = new int[6];
- private JFrame frame;
- SnowmanOfHanoi (int n, JFrame frame) {
- this.frame = frame; // referenca
- floorLevel = frame.getHeight() - 250;
- setN(n);
- }
- public void repaint() {
- frame.repaint();
- try {
- Thread.sleep(2);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public void setN(int n) {
- this.n = n;
- snowmanHeight = n * (n+1) * snowballSize / 2;
- for(int i = n-1; i >= 0; --i) { // 0-ti block je najmanji
- diameter[i] = (i+1) * snowballSize;
- x[i] = calculateX(1, i+1);
- y[i] = (i == n-1) ? floorLevel : y[i+1];
- y[i] += 2*i+1 - diameter[i]; // malo utonuti u onu vecu kuglu
- }
- repaint();
- }
- void towerOfHanoi(int n, int from_rod, int to_rod, int aux_rod) {
- if (n == 0) return;
- towerOfHanoi(n-1, from_rod, aux_rod, to_rod);
- moveAndPaint(n-1, to_rod);
- //System.out.println("Move disk " + n + " from rod " + from_rod + " to rod " + to_rod);
- towerOfHanoi(n-1, aux_rod, to_rod, from_rod);
- }
- void moveAndPaint(int which, int dest) {
- // dizemo pravokutnik
- int top = floorLevel - snowmanHeight - diameter[n-1] - 100;
- while(y[which] != top) {
- --y[which];
- repaint();
- }
- // micemo pravokutnik lijevo ili desno
- int destX = calculateX(dest, which+1);
- while(x[which] != destX) {
- x[which] += (x[which] > destX) ? -1 : 1;
- repaint();
- }
- // spustamo pravokutnik
- int max = floorLevel;
- for(int i = 0; i < n; ++i) {
- if (i == which) continue;
- if (getRodFromPos(i+1) == dest && y[i] < max)
- max = y[i];
- }
- while(y[which] != max - diameter[which] + 2*which + 1) { // malo utonuti u onu vecu kuglu
- ++y[which];
- repaint();
- }
- }
- protected void paintComponent(Graphics g) {
- int start = floorLevel - snowmanHeight - 50;
- Image img = Toolkit.getDefaultToolkit().getImage(SnowmanOfHanoi.class.getResource("download.jpg"));
- g.drawImage(img, 0, 0, this);
- g.drawLine(getPosFromRod(1), start, getPosFromRod(1), floorLevel);
- g.drawLine(getPosFromRod(2), start, getPosFromRod(2), floorLevel);
- g.drawLine(getPosFromRod(3), start, getPosFromRod(3), floorLevel);
- for (int i = 0; i < n; ++i) {
- g.setColor(new Color(255, 255, 255));
- g.fillOval(x[i], y[i], snowballSize*(i+1), snowballSize*(i+1));
- }
- }
- public int calculateX(int which_rod, int which_block) {
- int offset = which_block * snowballSize / 2;
- return getPosFromRod(which_rod) - offset;
- }
- public int getPosFromRod(int which_rod) {
- return which_rod * frame.getWidth() / 4;
- }
- public int getRodFromPos(int which_block) {
- // iz jednadzbe calculateX = x[i] izvedemo varijablu which_rod
- return (x[which_block-1] * 4 + 2 * which_block * snowballSize) / frame.getWidth();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement