|
|
|
|
|
Written by Anon.
|
|
Sunday, 21 January 2007 |
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 .
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.
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.
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
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
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
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_VALUE text *
*----------------------------------------------------------------------*
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
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
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
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
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 |
|
|
|