RosettaCodeData/Task/Wireworld/XPL0/wireworld.xpl0

49 lines
2.2 KiB
Plaintext

include c:\cxpl\codes; \intrinsic 'code' declarations
char New(53,40), Old(53,40);
proc Block(X0, Y0, C); \Display a colored block
int X0, Y0, C; \big (6x5) coordinates, char
int X, Y;
[case C of \convert char to color
^H: C:= $9; \blue
^t: C:= $C; \red
^.: C:= $E \yellow
other C:= 0; \black
for Y:= Y0*5 to Y0*5+4 do \make square blocks by correcting aspect ratio
for X:= X0*6 to X0*6+5 do \ (6x5 = square)
Point(X,Y,C);
];
int X, Y, C;
[SetVid($13); \set 320x200 graphics display
for Y:= 0 to 40-1 do \initialize New with space (empty) characters
for X:= 0 to 53-1 do
New(X, Y):= ^ ;
X:= 1; Y:= 1; \read file from command line, skipping borders
loop [C:= ChIn(1);
case C of
$0D: X:= 1; \carriage return
$0A: Y:= Y+1; \line feed
$1A: quit \end of file
other [New(X,Y):= C; X:= X+1];
];
repeat C:= Old; Old:= New; New:= C; \swap arrays, by swapping their pointers
for Y:= 1 to 39-1 do \generate New array from Old
for X:= 1 to 52-1 do \ (skipping borders)
[case Old(X,Y) of
^ : New(X,Y):= ^ ; \copy empty to empty
^H: New(X,Y):= ^t; \convert head to tail
^t: New(X,Y):= ^. \convert tail to conductor
other [C:= (Old(X-1,Y-1)=^H) + (Old(X+0,Y-1)=^H) + \head count
(Old(X+1,Y-1)=^H) + (Old(X-1,Y+0)=^H) + \ in neigh-
(Old(X+1,Y+0)=^H) + (Old(X-1,Y+1)=^H) + \ boring
(Old(X+0,Y+1)=^H) + (Old(X+1,Y+1)=^H); \ cells
New(X,Y):= if C=-1 or C=-2 then ^H else ^.; \ (true=-1)
];
Block(X, Y, New(X,Y)); \display result
];
Sound(0, 6, 1); \delay about 1/3 second
until KeyHit; \keystroke terminates program
SetVid(3); \restore normal text mode
]