It gives me an idea.
It should be possible to use built-in image processing
effects on a small image to do the life calculations
for you (at the same time getting more interesting
colours), then stretching the little image to fit
into your window and slapping a grid on it.

The tricky part is to balance the use of image
processing effects in such a way as to produce a
feedback, "life-like".

Such a system will be much faster too, I expect.
See anim-zoom3.r on my reb-site for a demonstration
of effects used in a feedback loop.

I'll probably give it a go myself.

Actually, you could still use a stretched image
to store your cell state, with different colours
representing different states.

Anton.

> hi list:
>
> Just for the fun of learning /View, I've just hack a *Game of Life* ...
> Thanks again to Anton for helping me for the dynamic refresh of the panel.
>
> Just Copy&Paste  and enjoy it !
>
> <script>
>
> rebol [
>     title: "Game of Life"
>     date: 03-may-2001
>     file: %gol.r
>     author: "C. COUSSEMENT"
>     email: [EMAIL PROTECTED]
>     comment: {Game of Life is a cellular automaton on an infinite
> quadratic
> grid.
>               Each grid cell is either alive/on or dead/off.
>               The new state of each cell is computed in discrete timesteps
> and is
>               determinated by it's old state and the sum of the
> alive cells
> among
>               its surrounding 8 nearest neighbours cells. All
> these changes
> are
>               simultaneously over the whole, infinite grid! - which can be
> only simulated !
>               The Game of Life rules let a cell in the next
> generation only
> alive if
>               a living cell is either surrounded by either 2 or 3 alive
> cells, the
>               *survive condition*, or a dead cell flips into the
> alive state
> in the
>               next generation if it is surrounded by exactly 3
> living cells,
> the *borne
>               condition*. Otherwise it dies or stays dead.
>               Therefore a given initial pattern, a collection of
> alive cells
> in a
>               universe of dead cells, develops according to these
> rules over
> the
>               generations and produces various configurations.
>               These special rules were invented 1970 by the mathematician
> J.H.
>               Conway to garanty that the cellular automaton is on the
> boundary
>               between unbounded growth and decay into dullness. It was
> proven that
>               it's chaotic behaviour is unpredictable and it could be used
> to build
>               an universal turing-machine and even an universal
> constructor.
> One
>               of the important open problems is whether a sufficient large
> random
>               populated universe will develop selforganization structures.
>     }
>     usage: {
>         >> do %gol.r
>         *ESC*
>         >> unview
>
>         A dimension of 10x10 works fast enough  on a P233 under WinNT4
>     }
> ]
>
> init-map:  func [
>     "set initial pattern"
>     max-x [integer!]
>     max-y [integer!]
>     /local x y map
> ][
>     map: make block! []
>     for x 1 max-x 1 [
>         ;random/seed now
>         for y 1 max-y 1 [
>             append map to-integer rejoin [x y]
>             append/only map to-block pick reduce [true false] random 2
>         ]
>     ]
>     return map
> ]
>
> kill: func [
>     "set given cell to dead"
>     map [block!]
>     x [integer!]
>     y [integer!]
> ][
>     clear select map to-integer rejoin [x y]
>     append select map to-integer rejoin [x y] false
>     return map
> ]
>
> birth: func [
>     "set given cell to life"
>     map [block!]
>     x [integer!]
>     y [integer!]
> ][
>     clear select map to-integer rejoin [x y]
>     append select map to-integer rejoin [x y] true
>     return map
> ]
>
> alive?: func [
>     "get cell status"
>     map [block!]
>     x [integer!]
>     y [integer!]
> ][
>     return first select map to-integer rejoin [x y]
> ]
>
> neightboor: func [
>     "get amount of surronding alive cells"
>     map [block!]
>     x [integer!]
>     y [integer!]
>     /local lives
> ][
>     lives: make integer! 0
>     if all [(x > 1)(y < max-y)(alive? map (x - 1) (y + 1))][lives: lives +
> 1]
>     if all [(x)(y < max-y)(alive? map (x) (y + 1))][lives: lives + 1]
>     if all [(x < max-x)(y < max-y)(alive? map (x + 1) (y +
> 1))][lives: lives
> + 1]
>     if all [(x > 1)(y)(alive? map (x - 1) (y))][lives: lives + 1]
>     if all [(x < max-x)(y)(alive? map (x + 1) (y))][lives: lives + 1]
>     if all [(x > 1)(y > 1)(alive? map (x - 1) (y - 1))][lives: lives + 1]
>     if all [(x)(y > 1)(alive? map (x) (y - 1))][lives: lives + 1]
>     if all [(x < max-x)(y > 1)(alive? map (x + 1) (y - 1))][lives: lives +
> 1]
>     return lives
> ]
>
> make-generation: func [
>     "compute status of each cell"
>     map [block!]
>     max-x [integer!]
>     max-y [integer!]
>     /local x y
> ][
>     for x 1 max-x 1 [
>         for y 1 max-y 1 [
>             ;--- survive condition
>             if any [((neightboor map x y) < 2)((neightboor map x y) > 3)]
> [map: kill map x y]
>             ;--- borne condition
>             if all[(not alive? map x y)((neightboor map x y) = 3)] [map:
> birth map x y]
>         ]
>     ]
>     return map
> ]
>
> show-visual: func [
>     "visualize map"
>     max-x [integer!]
>     max-y [integer!]
>     /local x y main society map
> ][
>     ;--- initialize map
>     map: init-map max-x max-y
>
>     ;--- set layout
>     lay: [
>         style amibe box 20x20 black
>         space 1x1
>     ]
>     for x 1 max-x 1 [
>         for y 1 max-y 1 [
>             append lay 'amibe
>         ]
>         append lay 'return
>     ]
>
>     lay: layout lay
>     view/new lay
>
>     ;--- animate
>     forever [
>         count: 0
>         for x 1 max-x 1 [
>             for y 1 max-y 1 [
>                 count: count + 1
>                 either alive? map x y [
>                     set in pick lay/pane count 'color red
>                 ][
>                     set in pick lay/pane count 'color black
>                 ]
>                 show pick lay/pane count
>             ]
>         ]
>         map: make-generation map max-x max-y
>     ]
> ]
>
> ;--- get map dim from user
> max-x: to-integer ask "x dimension = "
> max-y: to-integer ask "y dimension = "
>
> ;--- begin show
> show-visual max-x max-y
>
> </script>
>
> Regards,
>
> chr==

-- 
To unsubscribe from this list, please send an email to
[EMAIL PROTECTED] with "unsubscribe" in the 
subject, without the quotes.

Reply via email to