Enterprise Resource Planning PortalERPGenie.COM Enterprise Resource Planning Portal

   Advertise | Founder BLOG

Web ERPGenie.COM  Other Search Options

Home | Vote for us |

ERPGenie.COM -> SAP Technical -> ABAP -> Example code -> 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 .

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

 

Contact Us | Polls | Add URL | Contribute | About | Privacy | Terms | Feedback | Help!

Message Board | Discussion Forum | BLOG | Consultants: Post your resume | Companies: Advertise on ERPGenie.COM | Post Job
Genie Press | ERPTopSites | Financials Consultant | Consultant Review | Gallia Consulting | Supply Chain Project | SAP Financials Forum