home *** CD-ROM | disk | FTP | other *** search
- (* ====================================================== *)
- (* Kristallwachstum *)
- (* Hardware: IBM-kompatibler PC/AT, EGA-Grafik *)
- (* Compiler: TopSpeed Modula 2, Version 1.14 *)
- (* (C) 1989 Matthias Uphoff & TOOLBOX *)
- (* ====================================================== *)
-
- MODULE Kristall;
-
- (*$B-*) (* User-Break Off *)
-
- FROM Graph IMPORT InitEGA,GraphMode,TextMode,Plot,Point;
- FROM IO IMPORT KeyPressed;
-
- CONST
- scrwd = 640; (* Bildschirmbreite *)
- scrhi = 350; (* Bildschirmhöhe *)
- xm = scrwd DIV 2; (* Mitte horizontal *)
- ym = scrhi DIV 2; (* Mitte vertikal *)
- schwarz = 0; (* Hintergrundfarbe *)
- col0 = 9; (* Blau *)
- col1 = 12; (* Rot *)
- col2 = 14; (* Gelb *)
-
- VAR
- coltab: ARRAY[0..2] OF CARDINAL;
- (* Farben für Generation n, n-1, n-2 *)
- col,gen: CARDINAL;
-
- PROCEDURE Vier_Punkte(x,y,c: CARDINAL);
-
- BEGIN
- Plot(xm+x,ym+y,c);
- Plot(xm-x,ym+y,c);
- Plot(xm+x,ym-y,c);
- Plot(xm-x,ym-y,c);
- END Vier_Punkte;
-
- PROCEDURE Nachbarn(x,y,c: CARDINAL): CARDINAL;
- (* Zählt die Nachbarn von x,y mit der Farbe c *)
- VAR n: CARDINAL;
-
- BEGIN
- n := 0;
- x := xm+x; y := ym+y;
- IF Point(x,y-1) = c THEN INC(n) END;
- IF Point(x,y+1) = c THEN INC(n) END;
- IF Point(x+1,y) = c THEN INC(n) END;
- IF Point(x-1,y) = c THEN INC(n) END;
- RETURN n
- END Nachbarn;
-
- PROCEDURE Setze_Punkte;
- (* Erzeugt Generation n *)
- VAR x,y,g: CARDINAL;
-
- BEGIN
- FOR g := 0 TO gen DO
- FOR x := 0 TO g DO
- y := g - x;
- IF Point(xm+x,ym+y) = schwarz THEN
- IF Nachbarn(x,y,coltab[1]) = 1 THEN
- Vier_Punkte(x,y,coltab[0]);
- END;
- END;
- END;
- END;
- END Setze_Punkte;
-
- PROCEDURE Loesche_Punkte;
- (* Löscht Generation n-2 *)
- VAR x,y,g: CARDINAL;
-
- BEGIN
- FOR g := gen TO 0 BY -1 DO
- FOR x := 0 TO g DO
- y := g - x;
- IF Point(xm+x,ym+y) = coltab[2] THEN
- Vier_Punkte(x,y,schwarz);
- END;
- END;
- END;
- END Loesche_Punkte;
-
- BEGIN
- InitEGA;
- GraphMode;
- coltab[0] := col0;
- coltab[1] := col1; (* Farben festlegen *)
- coltab[2] := col2;
- Plot(xm,ym,coltab[0]); (* Keim setzen *)
- gen := 0;
- REPEAT
- (* Farben zyklisch vertauschen *)
- col := coltab[2];
- coltab[2] := coltab[1];
- coltab[1] := coltab[0];
- coltab[0] := col;
- (* Generationswechsel *)
- IF gen < scrhi DIV 2 THEN INC(gen) END;
- Setze_Punkte;
- Loesche_Punkte;
- UNTIL KeyPressed();
- TextMode;
- END Kristall.