G.Durga Prasad
3/8/2006 4:35:00 PM
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
>
>