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 > >