home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume3 / vms-hangman / part01 next >
Encoding:
Internet Message Format  |  1989-02-03  |  15.2 KB

  1. Path: xanth!mcnc!rutgers!mit-eddie!husc6!spdcc!ima!necntc!ncoast!allbery
  2. From: terrell@musky2.MUSKINGUM.EDU
  3. Newsgroups: comp.sources.misc
  4. Subject: v03i091: Hangman for VMS -- Part 1 of 2
  5. Message-ID: <8807181100.AA10483@musky2.MUSKINGUM.EDU>
  6. Date: 18 Jul 88 15:00:50 GMT
  7. Sender: allbery@ncoast.UUCP
  8. Reply-To: terrell@musky2.MUSKINGUM.EDU
  9. Lines: 536
  10. Approved: allbery@ncoast.UUCP
  11.  
  12. Posting-number: Volume 3, Issue 91
  13. Submitted-by: "A. Nonymous" <terrell@musky2.MUSKINGUM.EDU>
  14. Archive-name: vms-hangman/Part1
  15.  
  16. [...I think it is, at least.  Be nice if it had come in with a Subject: line,
  17. as per the guidelines.  Or does some mailer eat them?  ++bsa]
  18.  
  19. ...................... Cut between dotted lines and save. .....................
  20. $!.............................................................................
  21. $! VAX/VMS archive file created by VMS_SHARE V06.00 26-May-1988.
  22. $!
  23. $! VMS_SHARE was written by James Gray (Gray:OSBUSouth@Xerox.COM) from
  24. $! VMS_SHAR by Michael Bednarek (U3369429@ucsvc.dn.mu.oz.au).
  25. $!
  26. $! To unpack, simply save, concatinate all parts into one file and
  27. $! execute (@) that file.
  28. $!
  29. $! This archive was created by user CCTERRELL
  30. $! on  6-APR-1866 20:07:23.78.
  31. $!
  32. $! ATTENTION: To keep each article below 31 blocks (15872 bytes), this
  33. $!            program has been transmitted in 2 parts.  You should
  34. $!            concatenate ALL parts to ONE file and execute (@) that file.
  35. $!
  36. $! It contains the following 2 files:
  37. $!        HANGMAN-WORDS.DAT
  38. $!        HANGMAN.PAS
  39. $!
  40. $!==============================================================================
  41. $ SET SYMBOL/SCOPE=( NOLOCAL, NOGLOBAL )
  42. $ VERSION = F$GETSYI( "VERSION" )
  43. $ IF VERSION .GES "V4.4" THEN GOTO VERSION_OK
  44. $ WRITE SYS$OUTPUT "You are running VMS ''VERSION'; ", -
  45.     "VMS_SHARE V06.00 26-May-1988 requires VMS V4.4 or higher."
  46. $ EXIT 44 
  47. $VERSION_OK:
  48. $ GOTO START
  49. $
  50. $UNPACK_FILE:
  51. $ WRITE SYS$OUTPUT "Creating ''FILE_IS'"
  52. $ DEFINE/USER_MODE SYS$OUTPUT NL:
  53. $ EDIT/TPU/COMMAND=SYS$INPUT/NODISPLAY/OUTPUT='FILE_IS'/NOSECTION -
  54.     VMS_SHARE_DUMMY.DUMMY
  55. b_part := CREATE_BUFFER( "{Part}", GET_INFO( COMMAND_LINE, "file_name" ) )
  56. ; s_file_spec := GET_INFO( COMMAND_LINE, "output_file" ); SET( OUTPUT_FILE
  57. , b_part, s_file_spec ); b_errors := CREATE_BUFFER( "{Errors}" ); i_errors 
  58. := 0; pat_beg_1 := ANCHOR & "-+-+-+ Beginning"; pat_beg_2 := LINE_BEGIN 
  59. & "+-+-+-+ Beginning"; pat_end := ANCHOR & "+-+-+-+-+ End"; POSITION
  60. ( BEGINNING_OF( b_part ) ); i_append_line := 0; LOOP EXITIF MARK( NONE 
  61. ) = END_OF( b_part ); s_x := ERASE_CHARACTER( 1 ); IF s_x = "+" THEN r_skip 
  62. := SEARCH( pat_beg_1, FORWARD, EXACT ); IF r_skip <> 0 THEN s_x := ""
  63. ; MOVE_HORIZONTAL( -CURRENT_OFFSET ); ERASE_LINE; ENDIF; ENDIF
  64. ; IF s_x = "-" THEN r_skip := SEARCH( pat_end, FORWARD, EXACT ); IF r_skip <
  65. > 0 THEN s_x := ""; MOVE_HORIZONTAL( -CURRENT_OFFSET ); m_skip := MARK( NONE )
  66. ; r_skip := SEARCH( pat_beg_2, FORWARD, EXACT ); IF r_skip <> 0 THEN POSITION
  67. ( END_OF( r_skip ) ); MOVE_HORIZONTAL( -CURRENT_OFFSET ); MOVE_VERTICAL( 1 )
  68. ; MOVE_HORIZONTAL( -1 ); ELSE POSITION( END_OF( b_part ) ); ENDIF; ERASE
  69. ( CREATE_RANGE( m_skip, MARK( NONE ), NONE ) ); ENDIF; ENDIF
  70. ; IF s_x = "V" THEN s_x := ""; IF i_append_line <> 0 THEN APPEND_LINE
  71. ; MOVE_HORIZONTAL( -CURRENT_OFFSET ); ENDIF; i_append_line := 1; MOVE_VERTICAL
  72. ( 1 ); ENDIF; IF s_x = "X" THEN s_x := ""; IF i_append_line <
  73. > 0 THEN APPEND_LINE; MOVE_HORIZONTAL( -CURRENT_OFFSET ); ENDIF
  74. ; i_append_line := 0; MOVE_VERTICAL( 1 ); ENDIF; IF s_x <> "" THEN i_errors 
  75. := i_errors + 1; s_text := CURRENT_LINE; POSITION( b_errors ); COPY_TEXT
  76. ( "The following line could not be unpacked properly:" ); SPLIT_LINE
  77. ; COPY_TEXT( s_x ); COPY_TEXT( s_text ); POSITION( b_part ); MOVE_VERTICAL( 1 
  78. ); ENDIF; ENDLOOP; POSITION( BEGINNING_OF( b_part ) ); LOOP r_x := SEARCH( "`"
  79. , FORWARD, EXACT ); EXITIF r_x = 0; POSITION( r_x ); ERASE_CHARACTER( 1 )
  80. ; IF CURRENT_CHARACTER = "`" THEN MOVE_HORIZONTAL( 1 ); ELSE COPY_TEXT( ASCII
  81. ( INT( ERASE_CHARACTER( 3 ) ) ) ); ENDIF; ENDLOOP; IF i_errors = 0 THEN SET
  82. ( NO_WRITE, b_errors, ON ); ELSE POSITION( BEGINNING_OF( b_errors ) )
  83. ; COPY_TEXT( FAO( "The following !UL errors were detected while unpacking !AS"
  84. , i_errors, s_file_spec ) ); SPLIT_LINE; SET( OUTPUT_FILE, b_errors
  85. , "SYS$COMMAND" ); ENDIF; EXIT; 
  86. $ DELETE VMS_SHARE_DUMMY.DUMMY;*
  87. $ CHECKSUM 'FILE_IS
  88. $ WRITE SYS$OUTPUT " CHECKSUM ", -
  89.   F$ELEMENT( CHECKSUM_IS .EQ. CHECKSUM$CHECKSUM, ",", "failed!,passed." )
  90. $ RETURN
  91. $
  92. $START:
  93. $ FILE_IS = "HANGMAN-WORDS.DAT"
  94. $ CHECKSUM_IS = 1415151423
  95. $ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
  96. XBRIGHT
  97. XARROW
  98. XINDIAN
  99. XTERMINAL
  100. XTELEPHONE
  101. XMANUAL
  102. XETHEREAL
  103. XPAPER
  104. XCOMPUTER
  105. XHEAVEN
  106. XPERFECT
  107. XMAGNETIC
  108. XAUTOMOBILE
  109. XCARPET
  110. XCHICAGO
  111. XPLAIN
  112. XOPPONENT
  113. XLOVER
  114. XSECURE
  115. XSTUDENT
  116. XEMPLOYEE
  117. XHANDBOOK
  118. XMEMORIAL
  119. XPREMIUM
  120. XHOLIDAY
  121. XCAMPUS
  122. XMISSISSIPPI
  123. XCOURSE
  124. XNOVEMBER
  125. XLUNCH
  126. XDOLLAR
  127. XEXPERT
  128. XNEWSPAPER
  129. XNOTEBOOK
  130. XHORSE
  131. XSECRET
  132. XHOLIDAY
  133. XDROUGHT
  134. XDANCE
  135. XMUSIC
  136. XCOFFEE
  137. XLETTER
  138. XCHALK
  139. XPICTURE
  140. XBUTTON
  141. XPRESIDENT
  142. XCHAIR
  143. XTRAIN
  144. XEQUIPMENT
  145. XGALLOWS
  146. XTEETH
  147. XLIGHT
  148. XGLASS
  149. XCURTAIN
  150. XALTAR
  151. XTRASH
  152. XPLASTIC
  153. XCANNON
  154. XGRASS
  155. XTHUMB
  156. XCEMENT
  157. XFENCE
  158. XSOCKET
  159. XFRONT
  160. XWHALE
  161. XELECTRICITY
  162. XVESSEL
  163. XBREAK
  164. XWINDOW
  165. XGARDEN
  166. XSYRUP
  167. XMOUNTAIN
  168. XVOLUME
  169. XOCEAN
  170. XCIRCUS
  171. XTANGLE
  172. XSTONE
  173. XPERSON
  174. XSTAGE
  175. XCERAMIC
  176. XMORNING
  177. XVIDEO
  178. XCOLLEGE
  179. XANATOMY
  180. XTRAGEDY
  181. XLABEL
  182. XFORCE
  183. XRULER
  184. XSHAKE
  185. XORDER
  186. XDANGER
  187. XPETAL
  188. XLOCAL
  189. XAUCTION
  190. XDIAMOND
  191. XYACHT
  192. XUNIVERSE
  193. XQUALITY
  194. XSTORY
  195. XFOUGHT
  196. XBATTLE
  197. XPRICE
  198. XPROBLEM
  199. XPEOPLE
  200. $ GOSUB UNPACK_FILE
  201. $ FILE_IS = "HANGMAN.PAS"
  202. $ CHECKSUM_IS = 1463826394
  203. $ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
  204. X[INHERIT ('SYS$LIBRARY:STARLET')]
  205. XPROGRAM HangMan (INPUT, OUTPUT, WordFile);
  206. X(*
  207. X  July 18, 1988
  208. X
  209. X  This is a version of the game "Hangman" in VAX Pascal which I wrote 
  210. X  for no good reason (because I felt like it).  If you need an example
  211. X  of how to call the Run-Time Library routines from Pascal, this will
  212. X  do, but don't think of it as an example of good programming style; 
  213. X  Actually, it's terrible.
  214. X
  215. X  Anyway, its a fine version of hangman, although the "dictionary" could
  216. X  be larger.
  217. X
  218. X  The dictionary is refered to as "WordFile".  It is an ordinary text
  219. X  file of 100 words, one word per line.  Maximum 15 characters per
  220. X  word, only uppercase letters (A through Z) allowed.
  221. X*)
  222. X
  223. XCONST
  224. X  WordFileName = 'HANGMAN-WORDS.DAT';
  225. X
  226. XTYPE
  227. X  Mask_Longword = [LONG, UNSAFE] PACKED ARRAY [1..32] OF BOOLEAN;
  228. X  Unsigned_Byte = [BYTE] 0..255;
  229. X  Unsigned_Word = [WORD] 0..65535;
  230. X
  231. X  UppercaseLetter = 'A'..'Z';
  232. X  LetterSet = SET OF UppercaseLetter;
  233. X
  234. X  WordString  = VARYING[15] OF CHAR;
  235. X
  236. XVAR
  237. X  Pasteboard : UNSIGNED;
  238. X
  239. X  ManDisplay : UNSIGNED;
  240. X  LetterDisp : UNSIGNED;
  241. X  WordDisp   : UNSIGNED;
  242. X  HelpDisp   : UNSIGNED;
  243. X
  244. X  Keyboard   : UNSIGNED;
  245. X
  246. X  WordFile   : TEXT;
  247. X
  248. X  NewWord    : WordString;
  249. X
  250. X  CurrTime   : PACKED ARRAY [1..11] OF CHAR;
  251. X  SmallStr   : PACKED ARRAY [1..2] OF CHAR;
  252. X
  253. X  RandomSeed : UNSIGNED;
  254. X
  255. X  Done       : BOOLEAN;
  256. X
  257. X
  258. XFUNCTION LIB$WAIT (
  259. X  SECONDS`009`009: REAL) : UNSIGNED; EXTERN;
  260. X
  261. XFUNCTION MTH$RANDOM (
  262. X  VAR SEED`009`009: UNSIGNED) : REAL; EXTERN;
  263. X
  264. XFUNCTION SMG$CREATE_PASTEBOARD (
  265. X  VAR PASTEBOARD_ID `009: UNSIGNED;
  266. V  OUTPUT_DEVICE `009: [CLASS_S] PACKED ARRAY [A..B : INTEGER] OF CHAR := %IMMED
  267. X 0;
  268. X  VAR NUMBER_OF_PASTEBOARD_ROWS
  269. X`009`009`009: INTEGER := %IMMED 0;
  270. X  VAR NUMBER_OF_PASTEBOARD_COLUMNS
  271. X`009`009`009: INTEGER := %IMMED 0;
  272. X  FLAGS`009`009`009: Mask_Longword := %IMMED 0) : UNSIGNED; EXTERN; 
  273. X
  274. XFUNCTION SMG$CREATE_VIRTUAL_DISPLAY (
  275. X  NUMBER_OF_ROWS`009: INTEGER;
  276. X  NUMBER_OF_COLUMNS  `009: INTEGER;
  277. X  VAR DISPLAY_ID `009: UNSIGNED;
  278. X  DISPLAY_ATTRIBUTES`009: Mask_Longword := %IMMED 0;
  279. X  VIDEO_ATTRIBUTES`009: Mask_Longword := %IMMED 0;
  280. X  CHAR_SET  `009`009: Mask_Longword := %IMMED 0) : UNSIGNED; EXTERN; 
  281. X
  282. XFUNCTION SMG$CREATE_VIRTUAL_KEYBOARD (
  283. X  VAR KEYBOARD_ID `009: UNSIGNED;
  284. V  INPUT_DEVICE `009`009: [CLASS_S] PACKED ARRAY [A..B : INTEGER] OF CHAR := %IM
  285. XMED 0;
  286. V  DEFAULT_FILESPEC `009: [CLASS_S] PACKED ARRAY [C..D : INTEGER] OF CHAR := %IM
  287. XMED 0;
  288. V  VAR RESULTANT_FILESPEC: [CLASS_S] PACKED ARRAY [E..F : INTEGER] OF CHAR := %I
  289. XMMED 0;
  290. X  RECALL_SIZE`009`009: Unsigned_Byte := %IMMED 0) : UNSIGNED; EXTERN; 
  291. X
  292. XFUNCTION SMG$DELETE_PASTEBOARD (
  293. X  PASTEBOARD_ID`009`009: UNSIGNED;
  294. X  CLEAR_SCREEN_FLAG`009: Mask_Longword := %IMMED 0) : UNSIGNED; EXTERN;
  295. X
  296. XFUNCTION SMG$ERASE_DISPLAY (
  297. X  DISPLAY_ID`009`009: UNSIGNED;
  298. X  START_ROW`009`009: INTEGER := %IMMED 0;
  299. X  START_COLUMN`009`009: INTEGER := %IMMED 0;
  300. X  END_ROW`009`009: INTEGER := %IMMED 0;
  301. X  END_COLUMN`009`009: INTEGER := %IMMED 0) : UNSIGNED; EXTERN;
  302. X
  303. XFUNCTION SMG$PASTE_VIRTUAL_DISPLAY (
  304. X  DISPLAY_ID`009`009: UNSIGNED;
  305. X  PASTEBOARD_ID `009: UNSIGNED;
  306. X  PASTEBOARD_ROW`009: INTEGER;
  307. X  PASTEBOARD_COLUMN`009: INTEGER;
  308. X  TOP_DISPLAY_ID     `009: UNSIGNED := %IMMED 0) : UNSIGNED; EXTERN; 
  309. X
  310. XFUNCTION SMG$PUT_CHARS (
  311. X  DISPLAY_ID`009`009: UNSIGNED;
  312. X  TEXT`009`009`009: [CLASS_S] PACKED ARRAY [A..B : INTEGER] OF CHAR;
  313. X  LINE_NUMBER`009`009: INTEGER := %IMMED 0;
  314. X  COLUMN_NUMBER`009`009: INTEGER := %IMMED 0;
  315. X  ERASE_FLAG`009`009: Mask_Longword := %IMMED 0;
  316. X  RENDITION_SET`009`009: Mask_Longword := %IMMED 0;
  317. X  RENDITION_COMPLEMENT`009: Mask_Longword := %IMMED 0) : UNSIGNED; EXTERN;
  318. X
  319. XFUNCTION SMG$PUT_CHARS_HIGHWIDE (
  320. X  DISPLAY_ID   `009`009: UNSIGNED;
  321. X  TEXT `009`009`009: [CLASS_S] PACKED ARRAY [A..B:INTEGER] OF CHAR;
  322. X  START_ROW`009`009: INTEGER := %IMMED 0;
  323. X  START_COLUMN   `009: INTEGER := %IMMED 0;
  324. X  RENDITION_SET`009`009: Mask_Longword := %IMMED 0;
  325. X  RENDITION_COMPLEMENT`009: Mask_Longword := %IMMED 0;
  326. X  CHARACTER_SET     `009: Mask_Longword := %IMMED 0) : UNSIGNED; EXTERN; 
  327. X
  328. XFUNCTION SMG$READ_KEYSTROKE (
  329. X  KEYBOARD_ID`009`009: UNSIGNED;
  330. X  VAR TERMINATOR_CODE`009: Unsigned_Word;
  331. V  PROMPT_STRING`009`009: [CLASS_S] PACKED ARRAY [A..B : INTEGER] OF CHAR := %IM
  332. XMED 0;
  333. X  TIMEOUT`009`009: INTEGER := %IMMED 0;
  334. X  DISPLAY_ID`009`009: UNSIGNED := %IMMED 0;
  335. X  RENDITION_SET`009`009: Mask_Longword := %IMMED 0;
  336. X  RENDITION_COMPLEMENT`009: Mask_Longword := %IMMED 0) : UNSIGNED; EXTERN;
  337. X
  338. XFUNCTION SMG$RING_BELL (
  339. X  DISPLAY_ID`009`009: UNSIGNED;
  340. X  NO_OF_TIMES`009`009: INTEGER := %IMMED 0) : UNSIGNED; EXTERN;
  341. X
  342. X
  343. XPROCEDURE LetterPlace (Letter : UppercaseLetter; VAR Row, Column : INTEGER);
  344. XVAR
  345. X  CountChar: UppercaseLetter;
  346. XBEGIN
  347. X  IF Letter <= 'M' THEN
  348. X    BEGIN
  349. X      Row := 1;
  350. X      CountChar := 'A';
  351. X    END
  352. X  ELSE
  353. X    BEGIN
  354. X      Row := 3;
  355. X      CountChar := 'N';
  356. X    END;
  357. X
  358. X  Column := 1;
  359. X  WHILE CountChar < Letter DO                                     
  360. X    BEGIN
  361. X      CountChar := SUCC(CountChar);
  362. X      Column := Column + 4;
  363. X    END; (* WHILE *)
  364. XEND; (* LetterPlace *)
  365. X
  366. X
  367. XPROCEDURE FillLetters;                             
  368. XVAR
  369. X  Letter     : UppercaseLetter;
  370. X  Row, Column: INTEGER;
  371. X
  372. XBEGIN
  373. X  FOR Letter := 'A' TO 'Z' DO
  374. X    BEGIN
  375. X      LetterPlace (Letter, Row, Column);
  376. X      SMG$PUT_CHARS_HIGHWIDE (LetterDisp, Letter, Row, Column);
  377. X    END; (* FOR *)
  378. XEND; (* FillLetters *)
  379. X
  380. X
  381. XPROCEDURE FillHelpDisplay;
  382. XBEGIN
  383. X  SMG$PUT_CHARS (HelpDisp, 'HANG-MAN', 1, 1, RENDITION_SET := SMG$M_BOLD);
  384. X  SMG$PUT_CHARS (HelpDisp, 'Press <Ctrl/Z> to Quit.', 3, 5);
  385. V  SMG$PUT_CHARS (HelpDisp, 'Press the letter which you think is in the word.', 
  386. X5, 5);
  387. V  SMG$PUT_CHARS (HelpDisp, 'If it is actually a part of the word, it will', 6, 
  388. X5);
  389. V  SMG$PUT_CHARS (HelpDisp, 'appear there.  Otherwise, a part of the man will', 
  390. X7, 5);
  391. X  SMG$PUT_CHARS (HelpDisp, 'be drawn.', 8, 5);
  392. XEND; (* FillHelpDisplay *)
  393. X
  394. X
  395. XPROCEDURE GetWord (VAR NewWord : WordString);
  396. XVAR   
  397. X  Counter : INTEGER;
  398. X  WordNum : INTEGER;
  399. XBEGIN
  400. X  OPEN (WordFile, WordFileName, READONLY, SHARING := READONLY);
  401. X  RESET (WordFile);
  402. X
  403. X  WordNum := ROUND(MTH$RANDOM(RandomSeed) * 100.0);
  404. X  WordNum := ROUND(MTH$RANDOM(RandomSeed) * 100.0) + 1;
  405. X
  406. X  FOR Counter := 1 TO WordNum DO
  407. X    READLN (WordFile);
  408. X
  409. X  READLN (WordFile, NewWord);
  410. X
  411. X  CLOSE (WordFile);
  412. XEND; (* GetWord *)
  413. X
  414. X
  415. XFUNCTION GetChar (VAR Ch : CHAR; LegalLetters : LetterSet) : INTEGER;
  416. XVAR
  417. X  KeyPressed : Unsigned_Word;
  418. X  Correct    : BOOLEAN;
  419. XBEGIN
  420. X  REPEAT
  421. X    Correct := TRUE;
  422. X
  423. X    SMG$READ_KEYSTROKE (Keyboard, KeyPressed);
  424. X    IF (KeyPressed >= 97) AND (KeyPressed <= 122) THEN
  425. X      KeyPressed := KeyPressed - 32;
  426. X
  427. X    CASE KeyPressed OF
  428. X      65..90  : IF NOT (CHR(KeyPressed) IN LegalLetters) THEN
  429. X                  Correct := FALSE;
  430. X        26    : (* Do Nothing *);
  431. X      OTHERWISE
  432. X                Correct := FALSE;
  433. X    END; (* Case *)
  434. X  UNTIL Correct;
  435. X
  436. X  IF KeyPressed <> 26 THEN
  437. X    Ch := CHR(KeyPressed)
  438. X  ELSE
  439. X    Ch := ' ';
  440. X
  441. X  GetChar := KeyPressed;
  442. XEND; (* GetChar *)
  443. X
  444. X
  445. XPROCEDURE DrawMan (PartNumber : INTEGER);
  446. XBEGIN
  447. X  CASE PartNumber OF
  448. X    1 : BEGIN
  449. X          SMG$PUT_CHARS (ManDisplay, '___', 2, 6);
  450. X          SMG$PUT_CHARS (ManDisplay, '(. .)', 3, 5);
  451. X          SMG$PUT_CHARS (ManDisplay, '---', 4, 6);
  452. X        END;
  453. X    2 : BEGIN
  454. X          SMG$PUT_CHARS (ManDisplay, 'X', 5, 7);
  455. X          SMG$PUT_CHARS (ManDisplay, 'X', 6, 7);
  456. X          SMG$PUT_CHARS (ManDisplay, 'X', 7, 7);
  457. X          SMG$PUT_CHARS (ManDisplay, 'X', 8, 7);
  458. X        END;
  459. X    3 : BEGIN
  460. X          SMG$PUT_CHARS (ManDisplay, '\', 3, 3);
  461. X          SMG$PUT_CHARS (ManDisplay, '\', 4, 4);
  462. X          SMG$PUT_CHARS (ManDisplay, '\', 5, 5);
  463. X          SMG$PUT_CHARS (ManDisplay, '\', 6, 6);
  464. X        END;
  465. X    4 : BEGIN
  466. X          SMG$PUT_CHARS (ManDisplay, '/', 3, 11);
  467. X          SMG$PUT_CHARS (ManDisplay, '/', 4, 10);
  468. X          SMG$PUT_CHARS (ManDisplay, '/', 5, 9);
  469. X          SMG$PUT_CHARS (ManDisplay, '/', 6, 8);
  470. X        END;
  471. X    5 : BEGIN
  472. X          SMG$PUT_CHARS (ManDisplay, '/', 9, 6);
  473. X          SMG$PUT_CHARS (ManDisplay, '/', 10, 5);
  474. X          SMG$PUT_CHARS (ManDisplay, '/', 11, 4);
  475. X          SMG$PUT_CHARS (ManDisplay, '/', 12, 3);
  476. X        END;
  477. X    6 : BEGIN
  478. X          SMG$PUT_CHARS (ManDisplay, '\', 9, 8);
  479. X          SMG$PUT_CHARS (ManDisplay, '\', 10, 9);
  480. X          SMG$PUT_CHARS (ManDisplay, '\', 11, 10);
  481. X          SMG$PUT_CHARS (ManDisplay, '\', 12, 11);
  482. X        END;
  483. X  END; (* CASE *)
  484. XEND; (* DrawMan *)
  485. X
  486. X
  487. XPROCEDURE SolveWord (NewWord : WordString);
  488. XCONST
  489. X  NumBodyParts = 6;
  490. XVAR
  491. X  WordLength : INTEGER;
  492. X  Column     : INTEGER;
  493. X  Counter    : INTEGER;
  494. X  Row        : INTEGER;
  495. X  NumGuessed : INTEGER;
  496. X  NumWrong   : INTEGER;
  497. X  NumUniqueLetters : INTEGER;
  498. X  Letters    : LetterSet;
  499. X  LegalChars : LetterSet;
  500. X  CharCode   : INTEGER;
  501. X  ChPressed  : CHAR;
  502. X  WordSolved : BOOLEAN;
  503. X  ManHanged  : BOOLEAN;
  504. X
  505. XBEGIN
  506. X  WordLength := LENGTH(NewWord);
  507. X
  508. X  SMG$ERASE_DISPLAY (WordDisp);
  509. X
  510. X  Letters := ['A'..'Z'];
  511. X  Letters := Letters - ['A'..'Z'];
  512. X
  513. X  Column := 1;
  514. X  FOR Counter := 1 TO WordLength DO
  515. X    BEGIN
  516. X      SMG$PUT_CHARS_HIGHWIDE (WordDisp, '-', 1, Column);
  517. X      Column := Column + 2;
  518. X      Letters := Letters + [NewWord[Counter]];
  519. X
  520. X    END; (* FOR *)
  521. X
  522. X  NumUniqueLetters := 0;
  523. X
  524. X  FOR ChPressed := 'A' TO 'Z' DO
  525. X    IF ChPressed IN Letters THEN
  526. X      NumUniqueLetters := NumUniqueLetters + 1;
  527. X
  528. X  WordSolved := FALSE;
  529. X  ManHanged  := FALSE;
  530. X  LegalChars := ['A'..'Z'];
  531. X  NumGuessed := 0;
  532. X  NumWrong   := 0;
  533. X
  534. X  REPEAT
  535. X    CharCode := GetChar (ChPressed, LegalChars);
  536. X    IF CharCode <> 26 THEN
  537. X      BEGIN
  538. X        LetterPlace (ChPressed, Row, Column);
  539. X        SMG$PUT_CHARS_HIGHWIDE (LetterDisp, ' ', Row, Column);
  540. X
  541. X        LegalChars := LegalChars - [ChPressed];
  542. X
  543. X        IF ChPressed IN Letters THEN
  544. X          BEGIN
  545. X            Column := 1;
  546. X            FOR Counter := 1 TO WordLength DO
  547. -+-+-+-+-+ End of part 1 +-+-+-+-+-
  548.