summaryrefslogtreecommitdiff
path: root/ipl/packs/loadfunc/cspace.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/packs/loadfunc/cspace.icn')
-rw-r--r--ipl/packs/loadfunc/cspace.icn92
1 files changed, 92 insertions, 0 deletions
diff --git a/ipl/packs/loadfunc/cspace.icn b/ipl/packs/loadfunc/cspace.icn
new file mode 100644
index 0000000..734a170
--- /dev/null
+++ b/ipl/packs/loadfunc/cspace.icn
@@ -0,0 +1,92 @@
+############################################################################
+#
+# File: cspace.icn
+#
+# Subject: Program to demonstrate a cellular automata
+#
+# Author: Gregg M. Townsend
+#
+# Date: August 4, 2000
+#
+############################################################################
+#
+# Usage: cspace [-W width] [-H height]
+#
+# This program demonstrates a two-dimensional cellular automata designed
+# by David Griffeath of the University of Wisconsin. A. K. Dewdney
+# calls this "Cyclic Space".
+#
+# The window is seeded randomly and successive generations are displayed.
+# Press the space bar to single step, G to run free, R to reseed, or
+# Q to quit.
+#
+# See A.K.Dewdney, Computer Recreations, Scientific American, Aug. 1989.
+# (Reprinted in Dewdney, The Magic Machine, W.H.Freeman, 1990.)
+#
+############################################################################
+
+
+$include "libnames.icn"
+
+$define SIZE "size=600,401" # default window size
+
+$define PALETTE "c1" # color palette to use
+$define CYCLE "MAOBPCQDSFUHIVYL" # colors (and cycle length)
+
+#some other possibilities:
+#light $define CYCLE "aBPCcdefgh<ijklm"
+#dark $define CYCLE "aBPCQRSTUuVJWXYZ"
+#bright $define CYCLE "NAOBPCQDSFUHVIYL"
+
+link graphics, random
+
+
+procedure main(args)
+ local w, h, u, g
+ local stopped, cspgen
+
+ # Load the C code that ages the automata.
+ cspgen := loadfunc(FUNCLIB, "cspgen")
+
+ # Open the window. Don't use the last row: If the entire window
+ # is redrawn, the color map is cleared and reloaded, causing delays.
+ Window(SIZE, args)
+ w := WAttrib("width")
+ h := WAttrib("height") - 1
+
+ # Initialize the first generation randomly.
+ randomize()
+ u := seed(w, h)
+
+ # Process events and display generations.
+ g := 0
+ repeat {
+ while (*Pending() > 0) | \stopped do case Event() of {
+ " ": { stopped := 1; break }
+ !"\n\rgG": { stopped := &null; break }
+ !"rR": { u := seed(w, h); break }
+ QuitEvents(): { log(w, h, g); exit() }
+ &resize: { w:=WAttrib("width"); h:=WAttrib("height")-1; break }
+ }
+ DrawImage(,,u) # display current generation
+ u := cspgen(u, CYCLE) # create next generation
+ g +:= 1
+ if g % 100 = 0 then log(w, h, g) # log statistics every 100th gen
+ }
+end
+
+procedure log(w, h, g)
+ write(w, " x ", h, ":", right(g, 6), " generations in ",
+ &time / 1000.0, " seconds")
+ return
+end
+
+procedure seed(w, h)
+ local u, n
+
+ u := w || "," || PALETTE || ","
+ n := w * h
+ every 1 to n do
+ u ||:= ?CYCLE
+ return u
+end