Under linux, I have installed ncurses-ruby-1.0, just now and tried
this program.
The rectangles are drawn fairly satisfactorily , but I loose control
on the xterminal, and the bash prompt ovewrites on the rectangles. I
am forced to close the xterminal. I have to still understand the
program.
Prasad

On 3/8/06, Adam Shelly <adam.shelly / gmail.com> wrote:
> On 3/3/06, Ruby Quiz <james / grayproductions.net> wrote:
> > The idea with the Fibonacci series is to do the same thing in reverse. So the
> > quiz:
> >
> > What you do is start with a square (1 by 1), find the longer side, and add a
> > square of that size to the whole thing to form a new rectangle.
>
> I used this quiz as an excuses to get Ncurses-ruby running on my
> Windows box.  It was fairly painless, once I found PDCurses.  I used
> panel borders to draw the boxes, and animated the thing as it grows.
> I also added a bunch of command line options for windows:
> -resize [x y] will change the window size to fit a bigger rectangle.
> -newwin [x y] will launch a new window, then resize (if you don't want
> to mess up your current command window.
> I didn't add the equivalent commands for *nix boxen, it's been too
> long since i used one to remember the right commands.
> The program works under windows and cygwin.  I'd appreciate it if
> someone lets me know if it works ok under linux or mac.
>
> -Adam
>
> #----- goldrect.rb
> #
> #  Submission for Ruby Quiz #69
> #  by Adam Shelly
> #
> require 'ncurses'
>
>
> class FibBox
>   Direction=[:up,:left,:down,:right]
>   @@boxes = []
>
>   def self.moveall y,x
>     @@boxes.each{|f| f.moverel(y,x,true)}
>     @@boxes.each{|b| b.unhide}
>   end
>   def self.animate isize=1
>     size = [isize,isize]
>     f = FibBox.new(Direction[dir=2],size,[0,0])
>     while true
>       n = size.max
>       pos = [0,0]
>       pos[0]+=size.min if dir==2
>       pos[1]+=size.min if dir==3
>       n==size[1] ? size[0]+=n : size[1]+=n
>       break if (size[0] > Ncurses.LINES) || (size[1] > Ncurses.COLS)
>       f = FibBox.new(Direction[dir],[n,n],pos)
>       dir=(dir+1)%4
>     end
>   end
>
>   def initialize dir,size,pos
>     @size = size
>     @pos = pos
>     func = lambda{FibBox.moveall(0,1)} if dir==:left
>     func = lambda{FibBox.moveall(1,0)} if dir==:up
>     case dir
>       when :left, :right
>         target = @size[1]
>         parms=[@size[0],1]+@pos
>         animate=1
>       when :down, :up
>         target = @size[0]
>         parms=[1,@size[1]]+@pos
>         animate=0
>     end
>     func.call if func
>     win = Ncurses::WINDOW.new(*parms)
>     @panel=win.new_panel
>     show
>     while parms[animate]!=target
>       sleep(0.01)
>       parms[animate]+=1
>       func.call if func
>       Ncurses::Panel.update_panels
>       Ncurses.doupdate()
>       resize(*parms)
>     end
>     @@boxes<<self
>   end
>
>   def hide
>       @panel.window.border(*([' '[0]]*8))
>   end
>   def unhide
>       @panel.window.border(*([0]*8))
>   end
>   def show
>       unhide
>       Ncurses::Panel.update_panels
>       Ncurses.doupdate()
>       sleep(0.1/@size[0]) #sleep less when box takes longer to draw
>   end
>   def resize(sy,sx,ly,lx)
>     nw=Ncurses::WINDOW.new(sy,sx,ly,lx)
>     exit(0) if !nw
>     w = @panel.window
>     @panel.replace(nw)
>     w.delete
>     show
>   end
>   def moverel(dy,dx,keephidden=false)
>     hide
>     @pos[0]+=dy
>     @pos[1]+=dx
>     @panel.move(*@pos)
>     show unless keephidden
>   end
> end
>
>
> if __FILE__ == $0
>   if (ARGV[0].to_i)>0
>     size = ARGV.shift.to_i
>   end
>   if RUBY_PLATFORM =~ /mswin/
>     case ARGV[0]
>       when '-h', '-?'
>         puts "usage: #{$0} [size] [-newwin||-resize] [x y]"
>         puts " size: initial box size (default 1)"
>         puts " -resize: resizes your screen to x,y (default 150x90)"
>         puts " -newwin: launches program in a new resized window"
>         exit
>       when '-newwin'
>       `start /WAIT ruby #{$0} #{size||1} -resize #{ARGV[1]} #{ARGV[2]}`
>        exit
>       when '-resize'
>         `mode con cols=#{ARGV[1]||150} lines=#{ARGV[2]||90}`
>     end
>   end
>   Ncurses.initscr
>   Ncurses.noecho
>   FibBox.animate size||1
>   Ncurses.stdscr.getch
> end
>
>