public synchronized void moveDisc (Tower src, Tower des)
    {
        // Get the top disc from both towers
        Rectangle2D tmp = null;
        Rectangle2D r = null;
        if(des.getTopDisc() != null)
            tmp = des.getTopDisc().getRectangle();
        if(src.getTopDisc() != null)
            r = src.getTopDisc().getRectangle();
        
        // In case the source tower is empty, return
        if(r == null)
            return;
        
        // Define and execute movement of a disc
        while(r.getY() > src.stick.getY() - 30)
            animate(r,r.getX(),r.getY() - Variables.movSpeed);
        while(r.getCenterX() < des.stick.getCenterX())
            animate(r,r.getX()+ Variables.movSpeed,r.getY());
        while(r.getCenterX() > des.stick.getCenterX())
            animate(r,r.getX()- Variables.movSpeed,r.getY());
        while(!r.intersects(des.base))
        {
            animate(r,r.getX(),r.getY()+ Variables.movSpeed);
            
            // If an intersection occurs, abort the movement of the disc, 
            // update information and return
            if(tmp != null)
                if(r.intersects(tmp))
                {
                    r.setRect(r.getX(),tmp.getY()-r.getHeight(),r.getWidth(),r.getHeight());
                    des.addTopDisc(src.getTopDisc());
                    src.removeTopDisc();
                    Variables.moves += 1;
                    HanoiFrame.moves.setText("Total Moves: " + Variables.moves);
                    return;
                }
        }
        
        // If the disc intersects the destination base, update information
        Variables.moves += 1;
        HanoiFrame.moves.setText("Total Moves: " + Variables.moves);
        des.addTopDisc(src.getTopDisc());
        src.removeTopDisc();
    }