Hangman
*Create an online program and change UNIX_DICT_FILE
REPORT ZHANGMAN NO STANDARD PAGE HEADING.
* Put correct UNIX Words file on the next line.
DATA: UNIX_DICT_FILE(80) VALUE ‘/usr/share/lib/dict/words’.
INCLUDE <ICON>.
DATA: DICT_TAB(20) OCCURS 10000 WITH HEADER LINE,
GIVEUP(20),
LINE(80), GUESSES OCCURS 10 WITH HEADER LINE,
CORRECT_GUESSES OCCURS 10 WITH HEADER LINE,
MESG(60),
LEN TYPE I,
NUM_WORDS TYPE I,
NUM_TRYS TYPE I,
NUM_FAILS TYPE I,
NUM_BADS TYPE I,
NUM_GOODS TYPE I.
DATA LETTER.
DATA: RUNT TYPE I, SEC TYPE I.
DATA: BEGIN OF PIC,
ROW LIKE SY-CUROW,
COL LIKE SY-CUCOL,
LET,
END OF PIC.
DATA: BEGIN OF FIG OCCURS 10,
X(2),
Y(2),
L,
END OF FIG.
INITIALIZATION.
APPEND ‘6006|’ TO FIG.
APPEND ‘60070’ TO FIG.
APPEND ‘6008|’ TO FIG.
APPEND ‘5908/’ TO FIG.
APPEND ‘5909/’ TO FIG.
APPEND ‘6109\’ TO FIG.
APPEND ‘6108\’ TO FIG.
MOVE ‘acrimonious’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘allegiance’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘ameliorate’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘annihilate’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘antiseptic’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘articulate’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘authoritative’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘benefactor’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘boisterous’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘breakthrough’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘carcinogenic’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘censorious’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘chivalrous’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘collarbone’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘commendable’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘compendium’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘comprehensive’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘conclusive’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘conscientious’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘considerate’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘deferential’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘denouement’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘determinate’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘diffidence’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘disruption’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘earthenware’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘elliptical’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘entanglement’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘escutcheon’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘extinguish’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘extradition’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘fastidious’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘flamboyant’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘forethought’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘forthright’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘gregarious’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘handmaiden’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘honeysuckle’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘hypocritical’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘illustrious’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘infallible’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘lumberjack’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘mischievous’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘mollycoddle’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘nimbleness’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘nonplussed’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘obliterate’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘obsequious’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘obstreperous’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘opalescent’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘ostensible’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘pandemonium’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘paraphernalia’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘pawnbroker’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘pedestrian’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘peremptory’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘perfunctory’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘pernicious’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘perpetrate’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘personable’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘pickpocket’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘poltergeist’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘precipitous’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘predicament’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘preposterous’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘presumptuous’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘prevaricate’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘propensity’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘provisional’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘pugnacious’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘ramshackle’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘rattlesnake’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘reciprocate’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘recrimination’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘redoubtable’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘relinquish’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘remonstrate’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘repository’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘reprehensible’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘resolution’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘resplendent’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘restitution’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘retaliation’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘retribution’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘saccharine’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘salubrious’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘skulduggery’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘skyscraper’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘soothsayer’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘tearjerker’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘transcribe’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘turpentine’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘unassuming’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘underscore’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘undertaker’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘underwrite’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘unobtrusive’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘vernacular’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘waterfront’ TO LINE. APPEND LINE TO DICT_TAB.
MOVE ‘watertight);’ TO LINE. APPEND LINE TO DICT_TAB.
* If you do have the unix-dictionaryfile available, change this line.
IF 1 = 2.
OPEN DATASET UNIX_DICT_FILE FOR INPUT IN TEXT MODE.
DO.
READ DATASET UNIX_DICT_FILE INTO LINE LENGTH LEN.
IF SY-SUBRC = 0.
IF LEN < 20.
APPEND LINE TO DICT_TAB.
ENDIF.
ELSE.
EXIT.
ENDIF.
ENDDO.
CLOSE DATASET UNIX_DICT_FILE.
ENDIF.
DESCRIBE TABLE DICT_TAB LINES NUM_WORDS.
* write: ‘Number of words in dict:’,num_words.
PERFORM PRINT_OUT.
*———————————————————————*
* FORM PRINT_OUT *
*———————————————————————*
DATA: ABCDE LIKE SY-ABCDE.
*———————————————————————*
* FORM PRINT_OUT *
*———————————————————————*
FORM PRINT_OUT.
DATA: WORD_MASK LIKE DICT_TAB, INDEX TYPE I.
ABCDE = SY-ABCDE.
SY-LSIND = 0.
ULINE: AT /(16), AT 18(16), AT 35(15), AT 51(13).
FORMAT COLOR COL_KEY.
WRITE:/ ‘|’,ICON_ACTIVATE AS ICON NO-GAP, ‘ New Word ‘ HOTSPOT,
‘|’ NO-GAP ,SPACE NO-GAP COLOR COL_BACKGROUND,
‘|’, ICON_FAILURE AS ICON NO-GAP, ‘ Give Up! ‘ HOTSPOT,
‘|’ NO-GAP ,SPACE NO-GAP COLOR COL_BACKGROUND,
‘|’,ICON_SYSTEM_HELP AS ICON NO-GAP,’ Help Me ‘ HOTSPOT,
‘|’ NO-GAP ,SPACE NO-GAP COLOR COL_BACKGROUND,
‘|’,ICON_BREAKPOINT AS ICON NO-GAP,’ Exit! ‘ HOTSPOT,’|’.
FORMAT RESET.
ULINE: AT /(16), AT 18(16), AT 35(15), AT 51(13).
WRITE:/.
IF NOT DICT_TAB IS INITIAL.
* print the word mask
LEN = STRLEN( DICT_TAB ).
DO.
INDEX = SY-INDEX – 1.
LETTER = DICT_TAB+INDEX(1).
SEARCH CORRECT_GUESSES FOR LETTER.
IF SY-SUBRC = 0.
WORD_MASK+INDEX = LETTER.
ELSE.
WORD_MASK+INDEX = ‘_’.
ENDIF.
IF LEN = SY-INDEX .
EXIT.
ENDIF.
ENDDO.
* found the word
IF WORD_MASK = DICT_TAB.
ADD 1 TO NUM_GOODS.
WRITE:/ ‘Got it!. Correct word is’,DICT_TAB,
/ ‘It took ‘ ,NUM_TRYS,’tries.’.
CLEAR: NUM_TRYS, NUM_FAILS, DICT_TAB.
ELSE.
WRITE:/ ‘Guess the Word:’ .
DO LEN TIMES.
INDEX = SY-INDEX – 1.
LETTER = WORD_MASK+INDEX.
WRITE: LETTER.
ENDDO.
* print guesses
WRITE: / ‘Guesses’.
SORT GUESSES.
LOOP
AT GUESSES.
WRITE: GUESSES NO-GAP.
ENDLOOP.
NEW-LINE.
* check max failures
IF NUM_FAILS < 7.
* print keyboard
ULINE AT /(55).
DO 26 TIMES.
LETTER = ABCDE.
IF SY-INDEX = 14 OR SY-INDEX = 1. WRITE:/ SPACE. ENDIF.
WRITE: (3)LETTER CENTERED HOTSPOT COLOR COL_KEY .
SHIFT ABCDE.
ENDDO.
WRITE:/ MESG.
ELSE.
WRITE:/ ‘Correct Word was’,DICT_TAB.
WRITE:/ ‘Pick a new word’.
ADD 1 TO NUM_BADS.
CLEAR DICT_TAB.
ENDIF.
PERFORM DRAW_FIG.
ENDIF.
ELSEIF NOT GIVEUP IS INITIAL.
WRITE:/ ‘Correct Word was’,GIVEUP.
CLEAR GIVEUP.
ENDIF.
SKIP TO LINE 11.
ULINE AT /(64).
WRITE:/’|’,
(20) ‘Words fully guessed’, (7)NUM_GOODS,’| ‘,
(20) ‘Words not guessed’,(7)NUM_BADS,’|’.
* write:/’Letter Guesses’, num_trys, ‘Failed Guesses’,num_fails.
ULINE AT /(64).
ENDFORM.
*———————————————————————*
* FORM RANDOM *
*———————————————————————*
FORM RANDOM.
GET RUN TIME FIELD RUNT.
GET TIME.
SEC = SY-UZEIT MOD 60.
RUNT = RUNT MOD 100000.
MULTIPLY RUNT BY SEC.
GET TIME.
RUNT = RUNT MOD 100000.
ADD SEC TO RUNT .
ENDFORM.
AT LINE-SELECTION.
DATA: FIELD(30),VALUE(50).
GET CURSOR FIELD FIELD VALUE VALUE.
IF FIELD = ‘ICON_ACTIVATE’ OR VALUE = ‘ New Word’.
PERFORM NEW_WORD.
ELSEIF FIELD = ‘ICON_FAILURE’ OR VALUE = ‘ Give Up!’.
PERFORM GIVE_UP.
ELSEIF FIELD = ‘ICON_SYSTEM_HELP’ OR VALUE = ‘ Help Me’.
PERFORM PRINT_HELP.
ELSEIF FIELD = ‘ICON_BREAKPOINT’ OR VALUE = ‘ Exit!’.
LEAVE PROGRAM.
ELSEIF FIELD = ‘LETTER’ AND NOT VALUE IS INITIAL.
PERFORM TRY_WORD USING VALUE+1(1).
ENDIF.
*&———————————————————————*
*& Form NEW_WORD
*&———————————————————————*
FORM NEW_WORD.
IF NOT DICT_TAB IS INITIAL.
ADD 1 TO NUM_BADS.
ENDIF.
DO.
PERFORM RANDOM.
RUNT = RUNT MOD NUM_WORDS.
READ TABLE DICT_TAB INDEX RUNT.
IF NOT DICT_TAB(1) CO SY-ABCDE AND DICT_TAB NA ‘0123456789’.
EXIT.
ENDIF.
ENDDO.
TRANSLATE DICT_TAB TO UPPER CASE.
CLEAR: NUM_TRYS, NUM_FAILS.
REFRESH: GUESSES, CORRECT_GUESSES.
PERFORM PRINT_OUT.
ENDFORM. ” NEW_WORD
*&———————————————————————*
*& Form TRY_WORD
*———————————————————————-*
FORM TRY_WORD USING P_VALUE TYPE C.
SY-LSIND = 0.
SEARCH GUESSES FOR P_VALUE.
IF SY-SUBRC = 0.
CONCATENATE ‘Letter’ P_VALUE ‘already guessed’
INTO MESG SEPARATED BY SPACE.
ELSE.
APPEND P_VALUE TO GUESSES .
IF DICT_TAB CS P_VALUE.
CONCATENATE ‘Letter’ P_VALUE ‘matches’
INTO MESG SEPARATED BY SPACE.
APPEND P_VALUE TO CORRECT_GUESSES .
ELSE.
CONCATENATE ‘Letter’ P_VALUE ‘does not match’
INTO MESG SEPARATED BY SPACE.
ADD 1 TO NUM_FAILS.
ENDIF.
ADD 1 TO NUM_TRYS.
ENDIF.
PERFORM PRINT_OUT.
ENDFORM. ” TRY_WORD
AT PF8.
PERFORM NEW_WORD.
*&———————————————————————*
*& Form GIVE_UP
*&———————————————————————*
FORM GIVE_UP.
ADD 1 TO NUM_BADS.
GIVEUP = DICT_TAB.
CLEAR DICT_TAB.
PERFORM PRINT_OUT.
ENDFORM. ” GIVE_UP
*———————————————————————*
* FORM DRAW_FIG *
*———————————————————————*
FORM DRAW_FIG.
* |
* 0
* /|\
* / \
*
BACK.
SKIP 4.
WRITE: /55 ‘ ——-‘.
WRITE: /55 ‘ |’.
WRITE: /55 ‘ |’.
WRITE: /55 ‘ |’.
WRITE: /55 ‘ |’.
WRITE: /55 ‘ |’.
WRITE: /55 ‘———‘.
LOOP
AT FIG TO NUM_FAILS.
BACK.
SKIP TO LINE FIG-Y.
WRITE: AT FIG-X FIG-L.
ENDLOOP.
BACK.
ENDFORM.
*&———————————————————————*
*& Form PRINT_HELP
*&———————————————————————*
FORM PRINT_HELP.
ULINE AT /(55).
WRITE:
/’What Is “Hangman?”‘,
/, /'”Hangman” is an old schoolkid game where the’,
/’computer picks a word or a phrase, and you’,
/’try to reconstruct it by picking letters.’,
/’You have a certain number of chances to win.’,
/’Each time you pick an incorrect letter, you ‘,
/’lose a chance.’,/,
/’Loss of a chance is traditionally depicted by adding’,
/’more body parts to a picture of a hanging man.’,
/’Once the man is complete, the game is over and you lose.’.
ULINE AT /(55).
WRITE:/ ‘Click Green Back Arrow or press F3 to continue…’.
ULINE AT /(55).
ENDFORM. ” PRINT_HELP