home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3429 < prev    next >
Internet Message Format  |  1991-05-26  |  10KB

  1. From: ejo@ims.alaska.edu (Eric Olson)
  2. Newsgroups: vmsnet.sources.games,alt.sources
  3. Subject: bomb - repost for vms
  4. Message-ID: <1991May26.205243.14136@ims.alaska.edu>
  5. Date: 26 May 91 21:52:38 GMT
  6.  
  7. Whoops!
  8.  
  9. There was an error in the com file to build bomb on vms systems.  If
  10. you use a good compile program, you wouldn't need to worry about it,
  11. but I'll post a correction anyway.  Because a) it's a fairly small
  12. share file and b) the last posting was of a unix share file, I'm just
  13. going to repost the whole thing in a vms_shar share file.
  14. ***
  15. $! ------------------ CUT HERE -----------------------
  16. $ v='f$verify(f$trnlnm("SHARE_VERIFY"))'
  17. $!
  18. $! This archive created by VMS_SHARE Version 7.2-007  22-FEB-1990
  19. $!   On 26-MAY-1991 12:49:51.89   By user EJO 
  20. $!
  21. $! This VMS_SHARE Written by:
  22. $!    Andy Harper, Kings College London UK
  23. $!
  24. $! Acknowledgements to:
  25. $!    James Gray       - Original VMS_SHARE
  26. $!    Michael Bednarek - Original Concept and implementation
  27. $!
  28. $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER
  29. $! AND EXECUTE AS A COMMAND PROCEDURE  (  @name  )
  30. $!
  31. $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING:
  32. $!       1. BOMB.C;1
  33. $!       2. BUILD_VMS.COM;2
  34. $!       3. MAKEFILE.;1
  35. $!       4. README.BOMB;1
  36. $!
  37. $set="set"
  38. $set symbol/scope=(nolocal,noglobal)
  39. $f=f$parse("SHARE_TEMP","SYS$SCRATCH:.TMP_"+f$getjpi("","PID"))
  40. $e="write sys$error  ""%UNPACK"", "
  41. $w="write sys$output ""%UNPACK"", "
  42. $ if f$trnlnm("SHARE_LOG") then $ w = "!"
  43. $ ve=f$getsyi("version")
  44. $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto START
  45. $ e "-E-OLDVER, Must run at least VMS 4.4"
  46. $ v=f$verify(v)
  47. $ exit 44
  48. $UNPACK: SUBROUTINE ! P1=filename, P2=checksum
  49. $ if f$search(P1) .eqs. "" then $ goto file_absent
  50. $ e "-W-EXISTS, File ''P1' exists. Skipped."
  51. $ delete 'f'*
  52. $ exit
  53. $file_absent:
  54. $ if f$parse(P1) .nes. "" then $ goto dirok
  55. $ dn=f$parse(P1,,,"DIRECTORY")
  56. $ w "-I-CREDIR, Creating directory ''dn'."
  57. $ create/dir 'dn'
  58. $ if $status then $ goto dirok
  59. $ e "-E-CREDIRFAIL, Unable to create ''dn'. File skipped."
  60. $ delete 'f'*
  61. $ exit
  62. $dirok:
  63. $ w "-I-PROCESS, Processing file ''P1'."
  64. $ if .not. f$verify() then $ define/user sys$output nl:
  65. $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='P1'
  66. PROCEDURE Unpacker ON_ERROR ENDON_ERROR;SET(FACILITY_NAME,"UNPACK");SET(
  67. SUCCESS,OFF);SET(INFORMATIONAL,OFF);f:=GET_INFO(COMMAND_LINE,"file_name");b:=
  68. CREATE_BUFFER(f,f);p:=SPAN(" ")@r&LINE_END;POSITION(BEGINNING_OF(b));
  69. LOOP EXITIF SEARCH(p,FORWARD)=0;POSITION(r);ERASE(r);ENDLOOP;POSITION(
  70. BEGINNING_OF(b));g:=0;LOOP EXITIF MARK(NONE)=END_OF(b);x:=ERASE_CHARACTER(1);
  71. IF g=0 THEN IF x="X" THEN MOVE_VERTICAL(1);ENDIF;IF x="V" THEN APPEND_LINE;
  72. MOVE_HORIZONTAL(-CURRENT_OFFSET);MOVE_VERTICAL(1);ENDIF;IF x="+" THEN g:=1;
  73. ERASE_LINE;ENDIF;ELSE IF x="-" THEN IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+")=
  74. 1 THEN g:=0;ENDIF;ENDIF;ERASE_LINE;ENDIF;ENDLOOP;t:="0123456789ABCDEF";
  75. POSITION(BEGINNING_OF(b));LOOP r:=SEARCH("`",FORWARD);EXITIF r=0;POSITION(r);
  76. ERASE(r);x1:=INDEX(t,ERASE_CHARACTER(1))-1;x2:=INDEX(t,ERASE_CHARACTER(1))-1;
  77. COPY_TEXT(ASCII(16*x1+x2));ENDLOOP;WRITE_FILE(b,GET_INFO(COMMAND_LINE,
  78. "output_file"));ENDPROCEDURE;Unpacker;QUIT;
  79. $ delete/nolog 'f'*
  80. $ CHECKSUM 'P1'
  81. $ IF CHECKSUM$CHECKSUM .eqs. P2 THEN $ EXIT
  82. $ e "-E-CHKSMFAIL, Checksum of ''P1' failed."
  83. $ ENDSUBROUTINE
  84. $START:
  85. $ create 'f'
  86. X/* bomb.c, by Eric Olson. */
  87. X/*    version 1.0 */
  88. X/* This program is copyright 1991 by Eric Olson.  You are welcome to
  89. X   distribute it, but this notice should remain intact and you should
  90. X   include all the files that were distributed with it.  This program is
  91. X   not to be sold, although a fee may be charged to cover distribution
  92. X   expenses (if there are any).  If you wish to modify the code and
  93. X   distribute it, please feel free to do so, but label the code as
  94. X   modified here and change the version accordingly. */
  95. X
  96. X#include <stdio.h>
  97. X#include <curses.h>
  98. X
  99. X#ifdef VMS
  100. Xunsigned char _getch() /* kent d ramier 20 feb 88 */ /* eo ruined spacing */
  101. X `7B struct `7B unsigned short length; unsigned char dtype; unsigned char
  102. X class; char *pointer; `7D device = `7B 9, 14, 1, "SYS$INPUT"`7D; static
  103. X unsigned short a_channel = 0; unsigned char the_key; if (!(a_channel))
  104. X SYS$ASSIGN(&device,&a_channel,0,0); SYS$QIOW
  105. X (0,a_channel,625,0,0,0,&the_key,1,1,0,0,0); return(the_key); `7D
  106. X# define GETCH (_getch())
  107. X#else
  108. X  /* if you're not on VAX/VMS, you may need to refit this. */
  109. X  /* it does occasionally leave numbers on my screen. */
  110. X# define GETCH (getch())
  111. X#endif VMS
  112. X
  113. X#define MAX 16 /* boardsize */
  114. X
  115. X/* this is a terrible random generator.  Make a better one. */
  116. X#include <math.h>
  117. X#include <time.h>
  118. X#define RANDOM ((int)((float)rand()/((float)((unsigned)(-1)))*2.0*(float)(MA
  119. VX)))
  120. X#define RANDOM_SEED srand(time((time_t *)0))
  121. X
  122. Xshort think`5BMAX`5D`5BMAX`5D,grid`5BMAX`5D`5BMAX`5D,boom;
  123. Xint xx=0,yy=0;
  124. X
  125. X#define NOTYET 9
  126. X#define BOMB 10
  127. X#define OKAY 11
  128. Xstatic char icon`5B`5D=" 12345678.*o";
  129. X
  130. Xdrawscr()
  131. X`7B
  132. Xint i,j;
  133. X
  134. Xfor (i=0;i<MAX;i++)
  135. X  for (j=0;j<MAX;j++)
  136. X    `7B
  137. X      move(j,i*2);
  138. X/*       printw("(%c)",icon`5Bthink`5Bi`5D`5Bj`5D`5D); */
  139. X      printw(" %c",icon`5Bthink`5Bi`5D`5Bj`5D`5D);
  140. X    `7D
  141. X/* mvaddch(yy,xx*2+1,'#');`20
  142. Xmvaddch(yy,xx*2,'`5B'); mvaddch(yy,xx*2+2,'`5D');
  143. Xmvaddch(yy,xx*2,'>'); */
  144. X`7D
  145. X
  146. Xshort invalid(i,j)
  147. Xint i,j;
  148. X`7B
  149. X  if ((i==j) && ((i==0) `7C`7C (i==MAX-1))) return (1);
  150. X  if ((i<2) && (j<2)) return (1);
  151. X  if ((i==MAX) `7C`7C (j==MAX)) return (1);
  152. X  if (grid`5Bi`5D`5Bj`5D) return (1);
  153. X  return (0);
  154. X`7D
  155. X
  156. Xanalyze(x,y)
  157. Xint x,y;
  158. X`7B
  159. Xint i,j,t=0;
  160. X
  161. Xfor (i= -1;i<2;i++)
  162. X  for (j= -1;j<2;j++)
  163. X    if ((i+x>=0) && (j+y>=0) && (i+x<MAX) && (j+y<MAX))
  164. X      if (grid`5Bi+x`5D`5Bj+y`5D) t++;
  165. Xthink`5Bx`5D`5By`5D=t;
  166. Xif (!t)
  167. X  for (i= -1;i<2;i++)
  168. X    for (j= -1;j<2;j++)
  169. X      if ((i+x>=0) && (j+y>=0) && (i+x<MAX) && (j+y<MAX))
  170. X        if (think`5Bi+x`5D`5Bj+y`5D==NOTYET) analyze(i+x,j+y);
  171. X`7D
  172. X
  173. Xtoggle(x,y)
  174. Xint x,y;
  175. X`7B
  176. Xswitch (think`5Bx`5D`5By`5D)
  177. X  `7B
  178. X    case NOTYET: think`5Bx`5D`5By`5D=BOMB; break;
  179. X    case BOMB: think`5Bx`5D`5By`5D=OKAY; break;
  180. X    case OKAY: think`5Bx`5D`5By`5D=NOTYET; break;
  181. X  `7D
  182. X`7D
  183. X
  184. Xmoveto(x,y)
  185. X`7B
  186. Xint i,j,q=0;
  187. X
  188. Xfor (i= -1;i<2;i++)
  189. X  for (j= -1;j<2;j++)
  190. X    if ((i+x>=0) && (i+x<MAX) && (j+y<MAX) && (j+y>=0))
  191. X      if (think`5Bi+x`5D`5Bj+y`5D<NOTYET) q=1;
  192. Xif (!q) return(0);
  193. X
  194. Xxx=x; yy=y; analyze(x,y);
  195. X
  196. Xif (grid`5Bx`5D`5By`5D) boom=2;
  197. Xif ((y==MAX-1) && (x==MAX-1)) boom=1;
  198. X`7D
  199. X
  200. Xmain(argc,argv)
  201. Xint argc; char **argv;
  202. X`7B
  203. Xint i,j,k,nb=30;
  204. Xchar c;
  205. X
  206. Xif (argc>1)
  207. X  `7B
  208. X    sscanf(argv`5B1`5D,"%d",&nb);
  209. X    if ((nb<1) `7C`7C (nb>(MAX*(MAX-2))))
  210. X      `7B
  211. X        printf ("Invalid number of bombs."); exit(0);
  212. X      `7D
  213. X  `7D
  214. X
  215. Xinitscr();
  216. XRANDOM_SEED;
  217. X
  218. Xfor (i=0;i<MAX;i++)
  219. X  for (j=0;j<MAX;j++)
  220. X    think`5Bi`5D`5Bj`5D=NOTYET,grid`5Bi`5D`5Bj`5D=0;
  221. Xfor (k=0;k<nb;k++)
  222. X  `7B
  223. X    for (i=j=0;invalid(i,j);)
  224. X      i=RANDOM,j=RANDOM;
  225. X    grid`5Bi`5D`5Bj`5D=1;
  226. X  `7D
  227. X
  228. Xanalyze(0,0);
  229. Xprintf("%c>",27);
  230. X
  231. Xfor (i=j=boom=0;!boom;)
  232. X  `7B
  233. X    drawscr();
  234. X    move(j,i*2+1); refresh();
  235. X    c=GETCH;
  236. X    switch (c)
  237. X      `7B
  238. X        case '1': i--;
  239. X        case '2': j++; break;
  240. X        case '7': j--;
  241. X        case '4': i--; break;
  242. X        case '9': i++;
  243. X        case '8': j--; break;
  244. X        case '3': j++;
  245. X        case '6': i++; break;
  246. X        case ' ': toggle(i,j); break;
  247. X        case 12: clear(); refresh(); break;
  248. X        /* case '\n': */ case 13: case 10: moveto(i,j);
  249. X        default: break;
  250. X      `7D
  251. X    if (i<0) i=0; if (i>=MAX) i=MAX-1; if (j<0) j=0; if (j>=MAX) j=MAX-1;
  252. X  `7D
  253. X
  254. Xendwin();
  255. Xif (boom==1) printf ("Good job!\n");
  256. Xelse printf ("***BOOM***\n");
  257. Xfor (j=0;j<MAX;j++,printf("\n"))
  258. X  for (i=0;i<MAX;i++)
  259. X    `7B
  260. X      if (think`5Bi`5D`5Bj`5D<NOTYET)
  261. X        if (grid`5Bi`5D`5Bj`5D) printf ("*  ");
  262. X        else printf ("o  ");
  263. X      else
  264. X        if (think`5Bi`5D`5Bj`5D==NOTYET)
  265. X          if (grid`5Bi`5D`5Bj`5D)
  266. X            printf ("*. ");
  267. X            else printf ("o. ");
  268. X        else
  269. X          if (think`5Bi`5D`5Bj`5D==BOMB)
  270. X            if (grid`5Bi`5D`5Bj`5D)
  271. X              printf ("*! ");
  272. X            else printf ("o? ");
  273. X          else
  274. X            if (grid`5Bi`5D`5Bj`5D)
  275. X              printf ("*? ");
  276. X            else printf ("o! ");`20
  277. X    `7D
  278. Xprintf ("\n*=bomb, o=okay     .=no guess, !=right, ?=wrong\n\n");
  279. X`7D
  280. $ CALL UNPACK BOMB.C;1 576792176
  281. $ create 'f'
  282. X$ cc bomb
  283. X$ link bomb+sys$input/opt
  284. Xsys$share:vaxcrtl/share
  285. X$ delete bomb.obj;
  286. X$ pu bomb.exe
  287. $ CALL UNPACK BUILD_VMS.COM;2 1262573862
  288. $ create 'f'
  289. X# makefile for bomb
  290. X#
  291. XCC= cc
  292. X
  293. X# your system may not require termlib to be loaded
  294. XLIBRARIES= -lm -lcurses -ltermlib
  295. X
  296. X# use -g for debugging, if necessary
  297. XFLAGS= -O
  298. X
  299. Xdefault: bomb
  300. X
  301. Xbomb: bomb.c
  302. X`09$(CC) $(FLAGS) -o bomb bomb.c $(LIBRARIES)
  303. X
  304. $ CALL UNPACK MAKEFILE.;1 806617433
  305. $ create 'f'
  306. XBomb is a simple game of deduction.  There is a 16x16 grid containing
  307. Xsome number of bombs (the default is 30) which you must move through.
  308. XEach sector is denoted by a number from 1 to 8 representing the number
  309. Xof bombs immediately adjacent to it, a space (if there are no bombs
  310. Xadjacent to it), or a period (if you haven't been there yet).  You may
  311. Xplace a guess as to what a given sector is by positioning the cursor
  312. Xon it (with the number keys) and pressing the space bar; this will
  313. Xtoggle the sector's classification between unknown (.), bomb (*), and
  314. Xokay (o).  You start in the upper left hand corner and the object is
  315. Xto work your way into the lower right hand corner.  If you believe a
  316. Xsector to be safe, you can move into it by pressing return.  Control-l
  317. Xwill redraw the screen.  If you move into a sector which does not
  318. Xborder on any bombs, the computer will automatically move into each
  319. Xsector around it.  You may only move into sectors adjacent to sectors
  320. Xyou have already visited.  There are never any bombs bordering on your
  321. Xstarting square.
  322. X
  323. XBomb compiles and runs successfully for the following operating systems:
  324. X
  325. XSunOS 4.1, Ultrix 4.1, and VAX/VMS.
  326. X
  327. XIf you compile bomb successfully on another machine, please add it to
  328. Xthe list.
  329. $ CALL UNPACK README.BOMB;1 1226440836
  330. $ v=f$verify(v)
  331. $ EXIT
  332.