home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / vmsnet / life / part02 < prev    next >
Encoding:
Internet Message Format  |  1992-03-24  |  14.7 KB

  1. Path: uunet!mcsun!chsun!pegasus.ch!superuser
  2. From: superuser@pegasus.ch
  3. Newsgroups: vmsnet.sources.games
  4. Subject: Game of Life 2/2
  5. Message-ID: <1992Mar23.223427.33@pegasus.ch>
  6. Date: 23 Mar 92 21:34:27 GMT
  7. Organization: Pegasus BBS, Switzerland
  8. Lines: 464
  9.  
  10. +-+-+-+ Beginning of part 2 +-+-+-+
  11. X`009if (memory[2][2]==1)`009`009livecells++;
  12. X`009if (memory[width][hight]==1)`009livecells++;
  13. X`009if (memory[2][hight]==1)`009livecells++;
  14. X`009if (memory[width][2]==1)`009livecells++;
  15. X`009livecells=lifeloop(livecells);
  16. X
  17. X`009/* upper right corner */
  18. X`009x=width; y=1;
  19. X`009if (memory[width-1][1]==1)`009livecells++;
  20. X`009if (memory[1][1]==1)`009`009livecells++;
  21. X`009if (memory[width][2]==1)`009livecells++;
  22. X`009if (memory[width][hight]==1)`009livecells++;
  23. X`009if (memory[1][2]==1)`009`009livecells++;
  24. X`009if (memory[width-1][hight]==1)`009livecells++;
  25. X`009if (memory[1][hight]==1)`009livecells++;
  26. X`009if (memory[1][2]==1)`009`009livecells++;
  27. X`009livecells=lifeloop(livecells);
  28. X
  29. X`009/* lower left corner */
  30. X`009x=1; y=hight;
  31. X`009if (memory[width][hight]==1)`009livecells++;
  32. X   `009if (memory[2][hight]==1)`009livecells++;
  33. X   `009if (memory[1][1]==1)`009`009livecells++;
  34. X   `009if (memory[1][hight-1]==1)`009livecells++;
  35. X   `009if (memory[2][1]==1)`009`009livecells++;
  36. X   `009if (memory[width][hight-1]==1)`009livecells++;
  37. X   `009if (memory[2][hight-1]==1)`009livecells++;
  38. X   `009if (memory[width][1]==1)`009livecells++;
  39. X`009livecells=lifeloop(livecells);
  40. X
  41. X`009/* lower right corner */
  42. X`009x=width; y=hight;
  43. X`009if (memory[width-1][hight]==1)`009livecells++;
  44. X   `009if (memory[1][hight]==1)`009livecells++;
  45. X   `009if (memory[width][1]==1)`009livecells++;
  46. X   `009if (memory[width][hight-1]==1)`009livecells++;
  47. X   `009if (memory[1][1]==1)`009`009livecells++;
  48. X   `009if (memory[width-1][hight-1]==1) livecells++;
  49. X   `009if (memory[1][hight-1]==1)`009livecells++;
  50. X   `009if (memory[width-1][1]==1)`009livecells++;
  51. X`009livecells=lifeloop(livecells);
  52. X
  53. X`009/* 1st column */
  54. X`009x=1;
  55. X`009for (y=2; y<hight-1; y++) `123
  56. X`009`009if (memory[width][y]==1) `009livecells++;
  57. X`009   `009if (memory[2][y]==1)`009`009livecells++;
  58. X   `009`009if (memory[1][y+1]==1)`009`009livecells++;
  59. X   `009`009if (memory[1][y-1]==1)`009`009livecells++;
  60. X   `009`009if (memory[2][y+1]==1)`009`009livecells++;
  61. X   `009`009if (memory[width][y-1]==1) `009livecells++;
  62. X   `009`009if (memory[2][y-1]==1)`009`009livecells++;
  63. X   `009`009if (memory[width][y+1]==1) `009livecells++;
  64. X`009`009livecells=lifeloop(livecells);
  65. X`009`125
  66. X
  67. X`009/* last column */
  68. X`009x=width;
  69. X`009for (y=2; y<hight; y++) `123`009
  70. X   `009`009if (memory[width-1][y]==1)`009livecells++;
  71. X   `009`009if (memory[1][y]==1)`009`009livecells++;
  72. X   `009`009if (memory[width][y+1]==1)`009livecells++;
  73. X   `009`009if (memory[width][y-1]==1)`009livecells++;
  74. X   `009`009if (memory[1][y+1]==1)`009`009livecells++;
  75. X   `009`009if (memory[width-1][y-1]==1)`009livecells++;
  76. X   `009`009if (memory[1][y-1]==1)`009`009livecells++;
  77. X   `009`009if (memory[width-1][y+1]==1)`009livecells++;
  78. X`009`009livecells=lifeloop(livecells);
  79. X`009`125
  80. X
  81. X`009/* top row */
  82. X`009y=1;
  83. X`009for (x=2; x<width; x++) `123`009
  84. X   `009`009if (memory[x-1][1]==1)`009`009livecells++;
  85. X   `009`009if (memory[x+1][1]==1)`009`009livecells++;
  86. X   `009`009if (memory[x][2]==1)`009`009livecells++;
  87. X   `009`009if (memory[x][hight]==1)`009livecells++;
  88. X   `009`009if (memory[x+1][2]==1)`009`009livecells++;
  89. X   `009`009if (memory[x-1][hight]==1)`009livecells++;
  90. X   `009`009if (memory[x-1][2]==1)`009`009livecells++;
  91. X   `009`009if (memory[x+1][hight]==1)`009livecells++;
  92. X`009`009livecells=lifeloop(livecells);
  93. X`009`125
  94. X
  95. X`009/* bottom row */
  96. X`009y=hight;
  97. X`009for (x=2; x<width; x++) `123
  98. X`009   `009if (memory[x-1][hight]==1)`009livecells++;
  99. X   `009`009if (memory[x+1][hight]==1)`009livecells++;
  100. X   `009`009if (memory[x][1]==1)`009`009livecells++;
  101. X   `009`009if (memory[x][hight-1]==1)`009livecells++;
  102. X   `009`009if (memory[x+1][1]==1)`009`009livecells++;
  103. X   `009`009if (memory[x-1][hight-1]==1)`009livecells++;
  104. X   `009`009if (memory[x-1][1]==1)`009`009livecells++;
  105. X   `009`009if (memory[x+1][hight-1]==1)`009livecells++;
  106. X`009`009livecells=lifeloop(livecells);
  107. X`009`125
  108. X
  109. X`009cells_alive=0;
  110. X`009for (y=1; y<hight+1; y++) for (x=1; x<width+1; x++) `123
  111. X`009`009if (screen[x][y]==0) memory[x][y]=0;
  112. X`009`009else `123 memory[x][y]=1; cells_alive=1; `125
  113. X`009`125
  114. X`125
  115. X
  116. Xlifeloop(cells)
  117. Xint cells;
  118. X`123
  119. X`009if (memory[x][y]==1) `123
  120. X`009   if ((cells != 2) & (cells != 3)) `123
  121. X`009`009printf("%c[%d;%df ",esc,y,x);
  122. X`009`009screen[x][y]=0;
  123. X`009   `125
  124. X`009`125
  125. X`009else if (cells == 3) `123
  126. X`009`009printf("%c[%d;%dfo",esc,y,x);
  127. X`009`009screen[x][y]=1;
  128. X`009`125
  129. X`009return(0);
  130. X`125
  131. X
  132. $ GOSUB UNPACK_FILE
  133.  
  134. $ FILE_IS = "LIFE.WORK"
  135. $ CHECKSUM_IS = 2097630274
  136. $ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
  137. X
  138. X
  139. X
  140. X               Screen             Direction    xy Orientation    Margins
  141. XCell        -------------                                    `032
  142. VEvaluating  `1245    1    6`124           516           y-                1
  143. X         b=hight
  144. VPositions:  `124           `124           4c2         x-  x+             1 r
  145. X        r=width
  146. X            `1244    0    2`124           837           y+                b
  147. X            `124           `124
  148. X            `1248    3    7`124         c=cell
  149. X            -------------                                  `032
  150. XNine cases                                                 `032
  151. X==========
  152. X`0091`009`0092`009`0093`009`0094`009`0095`009`0096`009`0097`009`0098
  153. V0 :(std)[x][y-1] `009[x+1][y]`009[x][y+1]`009[x-1][y]`009[x-1][y-1]`009[x+1][
  154. Xy-1]`009[x+1][y+1]`009[x-1][y+1]
  155. X
  156. V1 :`009[x][b]`009`009std`009`009std`009`009std`009`009[x-1][b]`009[x+1][b]`00
  157. X9std`009`009std      `032
  158. V2 :`009std`009`009[1][y]`009`009std`009`009std`009`009std`009`009[1][y-1]`009
  159. X[1][y+1]`009std      `032
  160. V3 :`009std`009`009std`009`009[x][1]`009`009std`009`009std`009`009std`009`009[
  161. Xx+1][1]`009[x-1][1]
  162. V4 :`009std`009`009std`009`009std`009`009[r][y]`009`009[r][y-1]`009std`009`009
  163. Xstd`009`009[r][y+1]
  164. X
  165. V5 :`009[x][b]`009`009std`009`009std`009`009[r][y]`009`009[r][b]`009`009[x+1][
  166. Xb]`009std`009`009[r][y+1]
  167. V6 :`009[x][b]`009`009[1][y]`009`009std`009`009std`009`009[x-1][b]`009[1][b]`0
  168. X09`009[1][y+1]`009std      `032
  169. V7 :`009std`009`009[1][y]`009`009[x][1]`009`009std`009`009std`009`009[1][y-1]`
  170. X009[1][1]`009`009[x-1][1]
  171. V8 :`009std`009`009std`009`009[x][1]`009`009[r][y]`009`009[r][y-1]`009std`009`
  172. X009[x+1][1]`009[r][1]
  173. X
  174. X1 `009`0095`0091`0096
  175. X2 to end-1 `0094`0090`0092
  176. Xend`009`0098`0093`0097
  177. X
  178. $ GOSUB UNPACK_FILE
  179.  
  180. $ FILE_IS = "PATTERNS.LIS"
  181. $ CHECKSUM_IS = 1647119441
  182. $ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
  183. X
  184. Xoo   ooo    o    oo   o  o     o    o     oo    o     ooo    o
  185. X o     o     o   oo       o   o o  o o   oo    ooo    o o      o
  186. X o     o   ooo    o   o   o   o o  o o    o    o oo   o o   oo  ooo
  187. Xo     o         o o    oooo   ooo  ooo
  188. X                o o                o o
  189. X                oo                 o o
  190. X                                    o
  191. V-----------------------------------------------------------------------------
  192. X-
  193. X
  194. Xoo   oo      ooo       ooooo    oooooo
  195. X ooooo       ooo      o    o   o     o
  196. X oo oo      o   o          o         o
  197. X oo oo     o     o    o    o   o    o`032
  198. X  ooo       o   o       o o      oo `032
  199. X             ooo                  `032
  200. X
  201. X
  202. X
  203. $ GOSUB UNPACK_FILE
  204.  
  205. $ FILE_IS = "SPARE_LIFE.C"
  206. $ CHECKSUM_IS = 54598399
  207. $ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
  208. X/*`009`009`009GAME OF LIFE
  209. X`009`009`009VAX C VERSION
  210. X`009`009`009BY MARK RANDALL
  211. X*/
  212. X
  213. X#include stdio
  214. X#include ctype
  215. X#define width 80
  216. X#define hight 40
  217. X#define esc '\33'
  218. X
  219. Xint `009screen[width+1][hight+1];
  220. Xint `009memory[width+1][hight+1];
  221. Xint `009coord[8][2];
  222. Xint `009cells_alive;
  223. Xint `009x,y;
  224. Xint highcells;
  225. V/* ------------------------------------------------------------------------ *
  226. X/
  227. X
  228. Xmain()
  229. X`123
  230. X`009int charin;
  231. X`009int generation;
  232. X`009for ( ; ; ) `123
  233. X`009    generation=0; cells_alive=1;
  234. X`009    drawscreen();
  235. X`009    input();
  236. X`009    post_input();
  237. X
  238. X`009    while (cells_alive != 0) `123
  239. X`009    `009printf("%c[%d;1fGeneration #%d", esc, hight+2, generation++);
  240. X`009    `009life();
  241. X
  242. X`009`009if (cells_alive==0) `123
  243. X`009`009    printf("%c[%d;1f     Last generation. ",esc,hight+3);
  244. X`009`009    printf("<<Enter>> to continue, E to end :");
  245. X`009`009    charin=getcha();
  246. X`009`009    if (charin>90) charin -= 32;
  247. X`009`009    if (charin==69) `123 printf("%c[2J%c[;f",esc,esc); exit(); `125
  248. X`009`009`125
  249. X`009    `125
  250. X`009`125
  251. X`125
  252. X
  253. Xdrawscreen()
  254. X`123
  255. Xchar incstr[width];
  256. X`009for (y=1; y<hight+1; y++) `123
  257. X`009    for (x=1; x<width+1; x++)
  258. X`009`009screen[x][y]=memory[x][y]=0;
  259. X`009`125
  260. X`009printf ("%c[2J%c[H",esc,esc);`009/* clear screen */
  261. X`009for(x=0;x<width;x++) strcat(incstr,".");
  262. X`009for(x=0;x<hight;x++) printf("%s\n",incstr);
  263. X`009for(x=0;x<width;x++)    incstr[x] = '\0';
  264. X`009for(x=0;x<width;x++) strcat(incstr,"-");
  265. X`009printf("%s\n",incstr);
  266. X`125
  267. X
  268. Xinput()
  269. X`123
  270. X`009int charin;
  271. X`009printf("%c[%d;f",esc,hight+2);
  272. X`009printf("Use cursor keys or numeric keypad to move cursor.\n");
  273. X`009printf("Use period or 5 key to place/remove cell,");
  274. X`009printf(" zero or Enter to begin processing.");
  275. X`009x=1; y=1;`009`009/* upper left position */
  276. X`009printf("%c[1;1f",esc);  /* put the cursor there */
  277. X    for ( ; ; ) `123`009`009/* infinite loop */
  278. X`009charin=getcha();`009/* get ascii code from getcha */
  279. X`009if (charin==27) `123`009/* if char=esc, */
  280. X`009    charin=getcha();`009/* get the bracket */
  281. X`009    charin=getcha();`009/* then get the wanted char */
  282. X`009`125
  283. X`009switch(charin) `123`009/* move cursor, change index, flip dot */
  284. X`009    case 65:
  285. X`009    case 56:`009if (y!=1)       `123 printf("%c[A",esc); y--; `125 break;
  286. X`009    case 66:
  287. X`009    case 50:`009if (y!=hight)   `123 printf("%c[B",esc); y++; `125 break;
  288. X`009    case 67:
  289. X`009    case 54:`009if (x!=width)   `123 printf("%c[C",esc); x++; `125 break;
  290. X`009    case 68:
  291. X`009    case 52:`009if (x!=1)       `123 printf("%c[D",esc); x--; `125 break;
  292. X`009    case 55:`009if ((y!=1) & (x!=1)) `123
  293. X`009`009`009    printf("%c[A%c[D",esc,esc);  y--; x--; `125 break;
  294. X`009    case 51:`009if ((y!=hight) & (x!=width)) `123
  295. X`009`009`009    printf("%c[B%c[C",esc,esc);  y++; x++; `125 break;
  296. X`009    case 49:`009if ((x!=1) & (y!=hight)) `123
  297. X`009`009`009    printf("%c[B%c[D",esc,esc);  y++; x--; `125 break;
  298. X`009    case 57:`009if ((y!=1) & (x!=width)) `123
  299. X`009`009`009    printf("%c[A%c[C",esc,esc);  y--; x++; `125 break;
  300. X`009    case 46:
  301. X`009    case 53:`009changedot();    break;  /* period = switch dot */
  302. X`009    case 48:
  303. X`009    case 13:`009return;                 /* zero = end */
  304. X`009`125
  305. X    `125
  306. X`125
  307. X
  308. Xchangedot()
  309. X`123
  310. X`009if (screen[x][y]==1) `123`032
  311. X`009    screen[x][y]=0;
  312. X`009    printf(".%c[D",esc);
  313. X`009`125
  314. X`009else `123
  315. X`009    screen[x][y]=1;
  316. X`009    printf("o%c[D",esc);
  317. X`009`125
  318. X`125
  319. X
  320. Xpost_input()
  321. X`123
  322. X`009char incstr[width];
  323. X`009for(x=0;x<width;x++) incstr[x] = '\0';
  324. X`009printf("%c[1;1f",esc);
  325. X`009for (y=1; y<hight+1; y++) `123
  326. X`009    for (x=1; x<width+1; x++) `123
  327. X`009`009if (screen[x][y]==1) strcat(incstr,"o");
  328. X`009`009else strcat(incstr," ");
  329. X`009    `125
  330. X`009    printf("%s\n",incstr);
  331. X`009    for(x=0;x<width;x++)    incstr[x] = '\0';
  332. X`009`125
  333. X`009printf("%c[%d;f",esc,hight+2);
  334. X`009for(x=0;x<width;x++) incstr[x] = '\0';
  335. X`009for(x=0;x<width;x++) strcat(incstr," ");
  336. X`009printf("%s\n",incstr);
  337. X`009printf("%s\n",incstr);
  338. X`125
  339. X
  340. X/****************************/
  341. X
  342. Xlife()
  343. X`123
  344. X`009/* see file life.work (132 cols) for meanings of positions
  345. X`009   and "std". */
  346. X
  347. X`009int i;
  348. X`009for (y=1; y<hight+1; y++) `123
  349. X`009  switch(y) `123
  350. X`009    case 1: `123
  351. X`009`009setstd(1,y);
  352. X`009`009coord[1][2]=hight;
  353. X`009`009coord[4][1]=width;
  354. X`009`009coord[5][1]=width;
  355. X`009`009coord[5][2]=hight;
  356. X`009`009coord[6][2]=hight;
  357. X`009`009coord[8][1]=width;
  358. X`009`009countcells(1,y);`009`009/* position 5 */
  359. X`009`009for (x=2; x<width; x++) `123
  360. X`009`009    setstd(x,y);
  361. X`009`009    coord[1][2]=hight;
  362. X`009`009    coord[5][2]=hight;
  363. X`009`009    coord[6][2]=hight;
  364. X`009`009    countcells(x,y);`009`009/* position 1 */
  365. X`009`009`125
  366. X`009`009setstd(width,y);
  367. X`009`009coord[1][1]=hight;
  368. X`009`009coord[2][1]=1;
  369. X`009`009coord[5][2]=hight;
  370. X`009`009coord[6][1]=1;
  371. X`009`009coord[6][2]=hight;
  372. X`009`009coord[7][1]=1;
  373. X`009`009countcells(width,y);`009`009/* position 6 */
  374. X`009`009break;
  375. X`009    `125
  376. X`009    case hight: `123
  377. X`009`009setstd(1,y);
  378. X`009`009coord[3][2]=1;
  379. X`009`009coord[4][1]=width;
  380. X`009`009coord[5][1]=width;
  381. X`009`009coord[7][2]=1;
  382. X`009`009coord[8][1]=width;
  383. X`009`009coord[8][2]=1;
  384. X`009`009countcells(1,y);`009`009/* position 8 */
  385. X`009`009for (i=1; i<width; i++) `123
  386. X`009`009    setstd(x,y);
  387. X`009`009    coord[3][2]=1;
  388. X`009`009    coord[7][2]=1;
  389. X`009`009    coord[8][2]=1;
  390. X`009`009    countcells(x,y);`009`009/* position 3 */
  391. X`009`009`125
  392. X`009`009setstd(width,y);
  393. X`009`009coord[2][1]=1;
  394. X`009`009coord[3][2]=1;
  395. X`009`009coord[6][1]=1;
  396. X`009`009coord[7][1]=1;
  397. X`009`009coord[7][2]=1;
  398. X`009`009coord[8][2]=1;
  399. X`009`009countcells(width,y);`009`009/* position 7 */
  400. X`009`009break;
  401. X`009    `125
  402. X`009    default: `123
  403. X`009`009setstd(1,y);
  404. X`009`009coord[4][1]=width;
  405. X`009`009coord[5][1]=width;
  406. X`009`009coord[8][1]=width;
  407. X`009`009countcells(1,y);`009`009/* position 4 */
  408. X`009`009for (i=1; i<width; i++) `123
  409. X`009`009    setstd(x,y);
  410. X`009`009    countcells(x,y);`009`009/* position 0 (std) */
  411. X`009`009`125
  412. X`009`009setstd(width,y);
  413. X`009`009coord[2][1]=1;
  414. X`009`009coord[6][1]=1;
  415. X`009`009coord[7][1]=1;
  416. X`009`009countcells(width,y);`009`009/* position 2 */
  417. X`009    `125
  418. X`009  `125
  419. X`009`125
  420. X`009for (x=1; x<width+1; x++) for (y=1; y<hight; y++)`032
  421. X`009`009memory[x][y]=screen[x][y];
  422. X`009printf("%c[%d;1f %d",esc,hight+4,highcells);
  423. X`125
  424. X
  425. Xsetstd(a,b)
  426. Xint a,b;
  427. X`123
  428. X`009/* coord[n][1] will be x, coord[n][2] will be y. These will be
  429. X`009   plugged into memory[][] in next procedure */
  430. X
  431. X`009coord[1][1]=a;
  432. X`009coord[1][2]=b-1;
  433. X`009coord[2][1]=a+1;
  434. X`009coord[2][2]=b;
  435. X`009coord[3][1]=a;
  436. X`009coord[3][2]=b+1;
  437. X`009coord[4][1]=a-1;
  438. X`009coord[4][2]=b;
  439. X`009coord[5][1]=a-1;
  440. X`009coord[5][2]=b-1;
  441. X`009coord[6][1]=a+1;
  442. X`009coord[6][2]=b-1;
  443. X`009coord[7][1]=a+1;
  444. X`009coord[7][2]=b+1;
  445. X`009coord[8][1]=a-1;
  446. X`009coord[8][2]=b+1;
  447. X`009return;
  448. X`125`009`009
  449. X
  450. Xcountcells(a,b)
  451. Xint a,b;`009/* real-time x,y */
  452. X`123
  453. X`009int i,cells=0;
  454. X`009`009`009    /*  memory[     x     ][     y     ] */
  455. X`009for (i=1; i<9; i++) if (memory[coord[i][1]][coord[i][2]]==1) cells++;
  456. X`009highcells = highcells + cells;
  457. X
  458. X`009if (memory[a][b]==1) `123
  459. X`009   cells_alive=1;
  460. X`009   if ((cells != 2) & (cells != 3)) `123
  461. X`009`009printf("%c[%d;%df ",esc,b,a);
  462. X`009`009screen[a][b]=0;
  463. X`009   `125
  464. X`009`125
  465. X`009else if (cells == 3) `123
  466. X`009`009printf("%c[%d;%dfo",esc,b,a);
  467. X`009`009screen[a][b]=1;
  468. X`009`125
  469. X`009return;
  470. X`125
  471. $ GOSUB UNPACK_FILE
  472. $ EXIT
  473. -+-+-+-+-+ End of part 2 +-+-+-+-+-
  474.