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

About The Author

admin

Other posts by

Author his web sitehttp://

02

02 2010

Comments are closed.