! ***********************************************************************
! * *
! * H A N G M A N *
! * Donated by Lee Pallmann of UltraSoft *
! * *
! ***********************************************************************
! This program uses GET.SBR
VER: PROGRAM HANG,1.0
MAPS: ! Program variables
MAP1 ANSWER,S,30 ! Thw word that the player is trying to guess
MAP1 USED(50),B,1 ! There are 50 words; 1=already used, 0=free
MAP1 WRD,F,6 ! Which answer (1-50) is currently being useed
MAP1 ROUNDS,F,6 ! Number of rounds played.
MAP1 POINTS,F,6 ! Number of wins.
MAP1 RESPONSE,S,30 ! The players guess (of the answer)
MAP1 GUESS,S,1 ! The letter (A-Z) the player is guessing
MAP1 LETTER(26),B,1 ! Has the letter been chosen yet? 1=Yes, 0=No
MAP1 LIMBS,F,6 ! Player has six limbs
MAP1 COUNT,F,6 ! Number of correctly guessed letters.
MAP1 COL,F,6 ! Column counter for bottom row.
MAP1 I,F,6
GETWRD: ! Get next word
WRD = INT(RND(0)*50)+1
IF USED(WRD) THEN GOTO GETWRD
USED(WRD) = 1
ROUNDS = ROUNDS + 1
IF ROUNDS=50 THEN PRINT TAB(24,1); : GOTO QUIT
COUNT=0
COL = 10
LIMBS=0
PRINT TAB(22,12); TAB(-1,9);
CALL ANSWER
PRINT TAB(12,3); "Guess? _"; TAB(-1,5);
GUESS: PRINT TAB(12,10);
IF COUNT=LEN(ANSWER) THEN GOTO WIN
XCALL GET, GUESS
IF GUESS = CHR(27) THEN ROUNDS = ROUNDS - 1 : GOTO QUIT
GUESS = UCS(GUESS)
I = ASC(GUESS)
IF I < 65 OR I > 90 THEN GOTO BADMOV
I = I - 64
IF LETTER(I) = 1 THEN GOTO CHOSEN
LETTER(I) = 1
PRINT TAB(19,1); TAB(-1,9);
CALL DISPLY
IF LIMBS=6 THEN GOTO LOSE
GOTO GUESS
DISPLY: ! Display letter(s) on screen.
PRINT TAB(17,36);
IF INSTR(1,ANSWER,GUESS)<1 CALL HANG : THEN RETURN
FOR I = 1 TO LEN(ANSWER)
IF ANSWER[I;1] = GUESS THEN PRINT GUESS; : COUNT = COUNT + 1 : &
ELSE CALL CHAR
NEXT I
RETURN
CHAR: ! If character was already on screen, redraw it.
IF LETTER(ASC(ANSWER[I;1])-64) = 1 THEN PRINT ANSWER[I;1]; &
ELSE PRINT "_";
RETURN
ANSWER: ! Find the answer
RESTORE
PRINT TAB(17,1); TAB(-1,9);
FOR I = 1 TO WRD
READ ANSWER
NEXT I
PRINT TAB(17,36);
FOR I = 1 TO LEN(ANSWER)
PRINT "_";
NEXT I
FOR I = 9 TO 11
PRINT TAB(I,36); SPACE(3);
NEXT I
RETURN
BOTTOM: ! Keep list of used letters on bottom
COL=COL + 2
PRINT TAB(22,COL); GUESS;
RETURN
LOSE: ! You lost!
PRINT TAB(19,13); "YOU ARE DEAD - The word was `"; ANSWER; "' - "; &
"Another game? ";
GOTO ASK
WIN: ! You won!
PRINT TAB(19,27); "CONGRATULATIONS! - Another game? ";
POINTS = POINTS + 1
ASK: ! Continue?
XCALL GET, GUESS
IF UCS(GUESS[1,1]) #"Y" THEN GOTO QUIT
PRINT TAB(19,1); TAB(-1,9);
FOR I = 1 TO 26
LETTER(I) = 0
NEXT I
GOTO GETWRD
QUIT: ! Exit program
PRINT TAB(-1,0)
PRINT POINTS; "win";
IF POINTS # 1 THEN PRINT "s";
PRINT ","; ROUNDS; "game";
IF ROUNDS # 1 THEN PRINT "s";
PRINT "."
PRINT
END
DATA ZEPHYR,HANGMAN,ACUPUNCTURE,WHISKEY,BREVITY,COUNTERFEIT,COVENANT,SCORCH
DATA RESISTANT,HALLUCINATE,HOURGLASS,IMPATIENT,INQUISITION,ITINERARY,JETLAG
DATA KANGAROO,LATITUDE,LEDGER,COMPUTER,LIGHTWEIGHT,MACHINE,MILEAGE,MOUNTAIN
DATA NICKEL,OCCURRENCE,OCEAN,PYROMANIAC,PSYCHOLOGICAL,REBELLIOUS,XENOPHOBIA
DATA SCREECH,SPECIFY,TEMPEST,WRESTLE,TIMID,TORTOISE,TWINKLE,FABRIC,TELEGRAM
DATA TYPICAL,BEASTLY,VAMPIRE,VISIBLE,AIRCRAFT,AVIATION,WITHSTAND,XENOPHOBIA
DATA UNABLE,XYLOPHONE,YEAST