Archive for February, 2010

How to convert chm help files to Winword doc files without using any converter program?

After spending a few hours searching for a good converter program to convert my chm files to word and not being satisfied with any of the results, I decided to find another way to do this myself. I gave a little thinking and come up with a solution in the end.

Chm files have the ability to print the content of the selected heading and the topics following it. So by using this ability we have the chance to catch the full text of the help files even preserving all the formatting options. And here is how to make it with an example.

 

When you select the option “print the selected heading and all subtopics” from the toolbar buttons or by right clicking on the heading you choose, all the content of the following topics are automatically spooled into a single html file before being sent to the printer. If the pages to be spooled are just a few pages you may not have recognized this earlier but if the topics are crowded then you probably saw a small square shaped internet explorer window opening on your screen. This window contains the text you want to have printed. But since it has no toolbar, no menu and you wont be able to make right click on it you will not be able to do anything much with this window.

 

 

So first thing we do is to locate the chm file that we want to convert.

 

 

chm file

chm file

 

If you want to read the rest of this article please make a little donation of $5 by Paypal. After completion of the transaction you will be sent the link to the full text of the article.











THANK YOU

11

02 2010

Patience

PROGRAM ZPATIENCE NO STANDARD PAGE HEADING.

DATA: NUMBER LIKE DATATYPE-INTEGER2.
DATA: NUMBER_I TYPE I.
DATA: DUMMY  LIKE DATATYPE-INTEGER2.
DATA: BEGIN OF CARDS OCCURS 52 ,
      ENTRY TYPE I,
      ROW TYPE I,
      COL TYPE I,
      VIS(1),
      END OF CARDS.

DATA: CARD_NUM TYPE I, SUIT_NUM TYPE I, SUIT(1), CARD(2), ROWS TYPE I.
DATA: BLANK(3) VALUE ‘***’.
DATA: NEXT-CARD(4) VALUE ‘Next’.
DATA: RESTART(8) VALUE ‘New game’.
DATA: REVEAL(6) VALUE ‘Reveal’.
DATA: TEST_NUM TYPE I, TO_NUM TYPE I, MOVING_NUM TYPE I,
        PILE_NUM TYPE I.
DATA: CURR_C TYPE I, CURR_H TYPE I, CURR_S TYPE I, CURR_D TYPE I.
DATA: MOVING_SUIT(1), TO_SUIT(1), MOVING_CARD(2), TO_CARD(2),
  PILE_SUIT(1), PILE_CARD(2),MOVING_TYPE(1)    .
DATA: MOVING_ROW TYPE I, MOVING_COL TYPE I,
      TO_ROW TYPE I, TO_COL TYPE I, TEST_ROW TYPE I.
DATA: CURRENT_CARD TYPE I,
       MIN_CARD TYPE I , MAX_CARD TYPE I.
DATA: CURRENTFIELD(50).
DATA: DISC_C(3),DISC_H(3),DISC_S(3),DISC_D(3).
DATA: ROWS_OUT TYPE I, COLS_OUT TYPE I.

PERFORM SHUFFLE.

PERFORM SHOW_SCREEN.

AT LINE-SELECTION.

  GET CURSOR FIELD CURRENTFIELD.
  PERFORM PROCESS-INPUT.

*———————————————————————*
*       FORM SHUFFLE                                                  *
*———————————————————————*
FORM SHUFFLE.

  MIN_CARD = 3.MAX_CARD = 24.
  CURR_C = -1.CURR_D = -1.CURR_H = -1.CURR_S = -1.
  DISC_C = ‘CCC’.DISC_H = ‘HHH’.DISC_S = ‘SSS’.DISC_D = ‘DDD’.
  NUMBER = SY-UZEIT MOD 1000.
  DO NUMBER TIMES.

    CALL FUNCTION ‘RANDOM_I2’
         IMPORTING
              RND_VALUE = DUMMY.

  ENDDO.

  REFRESH CARDS. CLEAR CARDS. SY-TABIX = 0.

  WHILE SY-TABIX < 52.

    CALL FUNCTION ‘RANDOM_I2’
         EXPORTING
              RND_MIN   = 0
              RND_MAX   = 51
         IMPORTING
              RND_VALUE = NUMBER.

    NUMBER_I = NUMBER.
    READ TABLE CARDS WITH KEY NUMBER_I TRANSPORTING NO FIELDS.

    IF SY-SUBRC <> 0.

      CARDS-VIS = ‘n’.

      DESCRIBE TABLE CARDS LINES ROWS.

      CASE ROWS.

        WHEN 0.CARDS-VIS = ‘y’.CARDS-ROW = 0.CARDS-COL = 0.
        WHEN 7.CARDS-VIS = ‘y’.CARDS-ROW = 1.CARDS-COL = 1.
        WHEN 13.CARDS-VIS = ‘y’.CARDS-ROW = 2.CARDS-COL = 2.
        WHEN 18.CARDS-VIS = ‘y’.CARDS-ROW = 3.CARDS-COL = 3.
        WHEN 22.CARDS-VIS = ‘y’.CARDS-ROW = 4.CARDS-COL = 4.
        WHEN 25.CARDS-VIS = ‘y’.CARDS-ROW = 5.CARDS-COL = 5.
        WHEN 27.CARDS-VIS = ‘y’.CARDS-ROW = 6.CARDS-COL = 6.
        WHEN 28.CARDS-ROW = 20.CARDS-COL = 0.
      ENDCASE.

      CARDS-COL = CARDS-COL + 1.
      CARDS-ENTRY = NUMBER.
      APPEND CARDS.

    ENDIF.

  ENDWHILE.
  CURRENT_CARD = MIN_CARD.

ENDFORM.
*———————————————————————*
*       FORM SHOW_SCREEN                                              *
*———————————————————————*
FORM SHOW_SCREEN.

  ROWS_OUT = 1.
  COLS_OUT = 4.
  DO 7 TIMES.

    SKIP TO LINE ROWS_OUT.
    POSITION COLS_OUT.
    WRITE BLANK HOTSPOT.
    COLS_OUT = COLS_OUT + 4.

  ENDDO.

  LOOP
   AT CARDS.
    PERFORM MAKE_CARD.
    IF CARDS-ROW < 20.
      ROWS_OUT = CARDS-ROW + 1.
      SKIP TO LINE ROWS_OUT.
      COLS_OUT = CARDS-COL * 4.
      POSITION COLS_OUT.
      IF CARDS-VIS = ‘n’.
        WRITE ‘XXX’ COLOR OFF INTENSIFIED OFF INVERSE OFF.
      ELSE.
        IF SUIT = ‘D’ OR SUIT = ‘H’.
          WRITE: SUIT NO-GAP COLOR 6 INTENSIFIED INVERSE HOTSPOT,
                 CARD COLOR 6 INTENSIFIED INVERSE HOTSPOT.
        ELSE.
       WRITE: SUIT NO-GAP COLOR OFF INTENSIFIED OFF INVERSE OFF HOTSPOT,
                     CARD COLOR OFF INTENSIFIED OFF INVERSE OFF HOTSPOT.
        ENDIF.
      ENDIF.
    ELSE.

      SKIP TO LINE 20.      COLS_OUT =  CARDS-COL  * 4.
      IF COLS_OUT > 48.

        SKIP TO LINE 21.
        COLS_OUT = COLS_OUT – 48.

      ENDIF.

      POSITION COLS_OUT.
      IF CARDS-COL = CURRENT_CARD.
        PILE_SUIT = SUIT.
        PILE_CARD = CARD.
        PILE_NUM = CARD_NUM.
        IF SUIT = ‘D’ OR SUIT = ‘H’.
          WRITE: PILE_SUIT NO-GAP COLOR 6 INTENSIFIED INVERSE HOTSPOT,
                 PILE_CARD COLOR 6 INTENSIFIED INVERSE HOTSPOT.
        ELSE.
          WRITE: PILE_SUIT NO-GAP COLOR OFF INTENSIFIED OFF HOTSPOT,
                 PILE_CARD COLOR OFF INTENSIFIED OFF HOTSPOT.
        ENDIF.
      ELSE.
        IF CARDS-COL < CURRENT_CARD.
          WRITE ‘XXX’ COLOR OFF INTENSIFIED OFF INVERSE OFF.
        ENDIF.

      ENDIF.

    ENDIF.

  ENDLOOP.

  SKIP TO LINE 4. POSITION 40.WRITE: DISC_C
       COLOR OFF INTENSIFIED OFF INVERSE OFF HOTSPOT.
  SKIP TO LINE 4. POSITION 44. WRITE: DISC_D
       COLOR 6 INTENSIFIED INVERSE HOTSPOT.
  SKIP TO LINE 4. POSITION 48. WRITE: DISC_S
       COLOR OFF INTENSIFIED OFF INVERSE OFF HOTSPOT.
  SKIP TO LINE 4. POSITION 52. WRITE: DISC_H
       COLOR 6 INTENSIFIED INVERSE HOTSPOT.

  IF MIN_CARD > 0.
    SKIP TO LINE 23. POSITION 1. WRITE NEXT-CARD HOTSPOT.
  ENDIF.

  SKIP TO LINE 23. POSITION 20. WRITE RESTART HOTSPOT.
  SKIP TO LINE 25. POSITION 1. WRITE CURRENTFIELD.

  SY-LSIND = 0.

ENDFORM.
*———————————————————————*
*       FORM PROCESS-INPUT                                            *
*———————————————————————*
FORM PROCESS-INPUT.

  IF CURRENTFIELD = ‘NEXT-CARD’.
    IF CURRENT_CARD = MAX_CARD.
      CURRENT_CARD = MIN_CARD.
    ELSE.
      CURRENT_CARD = CURRENT_CARD + 3.
      IF CURRENT_CARD > MAX_CARD.
        CURRENT_CARD = MAX_CARD.
      ENDIF.
    ENDIF.

    MOVING_CARD = SPACE.
    CURRENTFIELD = SPACE.
    PERFORM SHOW_SCREEN.
    EXIT.

  ENDIF.

  IF CURRENTFIELD = ‘REVEAL’.

    LOOP
     AT CARDS.
      CARDS-VIS =  ‘y’.
      MODIFY CARDS.
    ENDLOOP.

    PERFORM SHOW_SCREEN.
    EXIT.
  ENDIF.

  IF CURRENTFIELD = ‘RESTART’.

    PERFORM SHUFFLE.
    CURRENTFIELD = ‘Restarting’.
    PERFORM SHOW_SCREEN.
    EXIT.

  ENDIF.

  IF MOVING_CARD = SPACE.

    IF CURRENTFIELD = ‘CARD’ OR CURRENTFIELD = ‘SUIT’.
      CURRENTFIELD = SPACE.
      ROWS_OUT = SY-CUROW – 1.
      COLS_OUT = SY-CUCOL DIV 4.

      LOOP
       AT CARDS.
        IF CARDS-ROW = ROWS_OUT AND CARDS-COL = COLS_OUT.
          CURRENTFIELD = ‘Moving ‘.
          PERFORM MAKE_CARD.
          MOVING_ROW = CARDS-ROW.
          MOVING_COL = CARDS-COL.
          MOVING_CARD = CARD.
          MOVING_SUIT = SUIT.
          MOVING_TYPE = ‘m’.
          MOVING_NUM = CARD_NUM.
          CURRENTFIELD+8(1) = SUIT.
          CURRENTFIELD+9(2) = CARD.
        ENDIF.

      ENDLOOP.

    ELSE.

      IF CURRENTFIELD = ‘PILE_CARD’ OR CURRENTFIELD = ‘PILE_SUIT’.
        MOVING_CARD = PILE_CARD.
        MOVING_SUIT = PILE_SUIT.
        MOVING_TYPE = ‘p’.
        MOVING_NUM = PILE_NUM.
        CURRENTFIELD = ‘Moving pile card’.
        CURRENTFIELD+17(1) = PILE_SUIT.
        CURRENTFIELD+18(2) = PILE_CARD.

      ELSE.

        CURRENTFIELD = SPACE.

      ENDIF.

    ENDIF.

  ELSE.

    IF CURRENTFIELD = ‘CARD’ OR CURRENTFIELD = ‘SUIT’ OR
           CURRENTFIELD = ‘BLANK’.
      ROWS_OUT = SY-CUROW – 1.
      COLS_OUT = SY-CUCOL DIV 4.
      TEST_ROW = -1.
      IF CURRENTFIELD = ‘BLANK’.
        TO_COL = COLS_OUT.
        TO_ROW = ROWS_OUT – 1.
        IF MOVING_CARD = ‘K’.
          PERFORM MOVE_CARD.
        ELSE.
          CURRENTFIELD = ‘Can only move K to blank’.
          MOVING_CARD = SPACE.
        ENDIF.
      ELSE.
        LOOP
         AT CARDS.
          IF ( CARDS-ROW >= TEST_ROW AND CARDS-ROW < 20 )
                 AND CARDS-COL = COLS_OUT.
            TEST_ROW = CARDS-ROW.
            PERFORM MAKE_CARD.
            TO_COL = CARDS-COL.
            TO_ROW = CARDS-ROW.
            TO_CARD = CARD.
            TO_SUIT = SUIT.
            TO_NUM = CARD_NUM.
          ENDIF.

        ENDLOOP.

        IF TO_COL <> MOVING_COL OR MOVING_TYPE = ‘p’.
          IF
             ( ( MOVING_SUIT = ‘D’ OR MOVING_SUIT = ‘H’ ) AND
               ( TO_SUIT = ‘D’ OR TO_SUIT = ‘H’ ) )
           OR
             ( ( MOVING_SUIT = ‘C’ OR MOVING_SUIT = ‘S’ ) AND
               ( TO_SUIT = ‘S’ OR TO_SUIT = ‘S’ ) ).
            CURRENTFIELD = ‘Can only put black on red or red on black’.
            MOVING_CARD = SPACE.
          ELSE.
            TEST_NUM = TO_NUM – 1.
            IF TEST_NUM = MOVING_NUM.
              PERFORM MOVE_CARD.
            ELSE.
              CURRENTFIELD = ‘Can only put on next higher card’.
              MOVING_CARD = SPACE.
            ENDIF.
          ENDIF.
        ELSE.
          CURRENTFIELD = ‘Can only move to another column’.
          MOVING_CARD = SPACE.
        ENDIF.
      ENDIF.
    ELSE.
      IF CURRENTFIELD(4) = ‘DISC’.
        TO_SUIT = CURRENTFIELD+5(1).
        IF MOVING_TYPE = ‘p’.
        ELSE.
          TEST_ROW = -1.
          LOOP
           AT CARDS.
            IF CARDS-COL = MOVING_COL AND
                    CARDS-ROW > TEST_ROW AND CARDS-ROW < 20.
              TEST_ROW = CARDS-ROW.
              PERFORM MAKE_CARD.
              MOVING_SUIT = SUIT.
              MOVING_CARD = CARD.
              MOVING_ROW = CARDS-ROW.
              MOVING_COL = CARDS-COL.
              MOVING_NUM = CARD_NUM.
            ENDIF.
          ENDLOOP.

        ENDIF.

       IF MOVING_SUIT = TO_SUIT.
          CASE MOVING_SUIT.
            WHEN ‘C’. TEST_NUM = CURR_C + 1.
            WHEN ‘H’. TEST_NUM = CURR_H + 1.
            WHEN ‘D’. TEST_NUM = CURR_D + 1.
            WHEN ‘S’. TEST_NUM = CURR_S + 1.
          ENDCASE.

          IF TEST_NUM = MOVING_NUM.
            PERFORM DISCARD_CARD.
            CASE MOVING_SUIT.
              WHEN ‘C’. CURR_C = CURR_C + 1.
              WHEN ‘D’. CURR_D = CURR_D + 1.
              WHEN ‘S’. CURR_S = CURR_S + 1.
              WHEN ‘H’. CURR_H = CURR_H + 1.
            ENDCASE.
          ELSE.
            CURRENTFIELD = ‘Can only discard on next lower card’.
            MOVING_CARD = SPACE.
          ENDIF.
        ELSE.
          MOVING_CARD = SPACE.
          CURRENTFIELD = ‘Can only discard on same suit’.
        ENDIF.
      ELSE.
        MOVING_CARD = SPACE.
        CURRENTFIELD = SPACE.
      ENDIF.
    ENDIF.
  ENDIF.
  PERFORM SHOW_SCREEN.

ENDFORM.

*———————————————————————*
*       FORM MAKE_CARD                                                *
*———————————————————————*
FORM MAKE_CARD.

  SUIT_NUM = CARDS-ENTRY DIV 13.

  CASE SUIT_NUM.
    WHEN 0.SUIT = ‘D’.
    WHEN 1.SUIT = ‘H’.
    WHEN 2.SUIT = ‘C’.
    WHEN 3.SUIT = ‘S’.
  ENDCASE.

  CARD_NUM = CARDS-ENTRY MOD 13.
  CASE CARD_NUM.
    WHEN 0.CARD = ‘A’.
    WHEN 1.CARD = ‘2’.
    WHEN 2.CARD = ‘3’.
    WHEN 3.CARD = ‘4’.
    WHEN 4.CARD = ‘5’.
    WHEN 5.CARD = ‘6’.
    WHEN 6.CARD = ‘7’.
    WHEN 7.CARD = ‘8’.
    WHEN 8.CARD = ‘9’.
    WHEN 9.CARD = ’10’.
    WHEN 10.CARD = ‘J’.
    WHEN 11.CARD = ‘Q’.
    WHEN 12.CARD = ‘K’.
  ENDCASE.

ENDFORM.

*———————————————————————*
*       FORM MOVE_CARD                                                *
*———————————————————————*
FORM MOVE_CARD.

  IF CURRENTFIELD <> ‘BLANK’.
    CURRENTFIELD = ‘Moving xxx to’.
    MOVE MOVING_SUIT TO CURRENTFIELD+7(1).
    MOVE MOVING_CARD TO CURRENTFIELD+8(2).
    MOVE TO_SUIT TO CURRENTFIELD+14(1).
    MOVE TO_CARD TO CURRENTFIELD+15(2).
  ELSE.
    CURRENTFIELD = ‘Starting emtpy column’.
  ENDIF.

  IF MOVING_TYPE = ‘p’.
    MOVE ‘from pile’ TO CURRENTFIELD+18.

    LOOP
     AT CARDS.
      IF CARDS-ROW = 20 AND CARDS-COL = CURRENT_CARD.
        CARDS-COL = TO_COL.
        CARDS-ROW = TO_ROW + 1.
        CARDS-VIS = ‘y’.
      ENDIF.

      IF CARDS-ROW = 20 AND CARDS-COL > CURRENT_CARD.
        CARDS-COL = CARDS-COL – 1.
      ENDIF.

      MODIFY CARDS.

    ENDLOOP.

    CURRENT_CARD = CURRENT_CARD – 1.
    MAX_CARD = MAX_CARD – 1.
    IF MAX_CARD < MIN_CARD.
      MIN_CARD = MIN_CARD – 1.
      MAX_CARD = MIN_CARD.
    ENDIF.

    IF CURRENT_CARD < 1.
      CURRENT_CARD = MIN_CARD.
    ENDIF.
  ELSE.
    LOOP
     AT CARDS.
      IF CARDS-COL = MOVING_COL AND
       ( CARDS-ROW >= MOVING_ROW AND CARDS-ROW < 20 ).
        CARDS-COL = TO_COL.
        CARDS-ROW = TO_ROW + 1 + CARDS-ROW – MOVING_ROW.
        MODIFY CARDS.
      ENDIF.

    ENDLOOP.

    TEST_ROW = MOVING_ROW – 1.

    LOOP
     AT CARDS.
      IF CARDS-COL = MOVING_COL AND CARDS-ROW = TEST_ROW.
        CARDS-VIS = ‘y’.
        MODIFY CARDS.
      ENDIF.
    ENDLOOP.
  ENDIF.

  MOVING_CARD = SPACE.

ENDFORM.

*———————————————————————*
*       FORM DISCARD_CARD                                             *
*———————————————————————*
FORM DISCARD_CARD.

  MOVE ‘Discarding’ TO CURRENTFIELD.
  MOVE MOVING_SUIT TO CURRENTFIELD+13(1).
  MOVE MOVING_CARD TO CURRENTFIELD+14(2).
  CASE TO_SUIT.
    WHEN ‘C’.
      DISC_C+1(2) = MOVING_CARD.
    WHEN ‘D’.
      DISC_D+1(2) = MOVING_CARD.
    WHEN ‘H’.
      DISC_H+1(2) = MOVING_CARD.
    WHEN ‘S’.
      DISC_S+1(2) = MOVING_CARD.
  ENDCASE.

  IF MOVING_TYPE = ‘p’.
    MOVE ‘from pile’ TO CURRENTFIELD+18.
    LOOP
     AT CARDS.
      IF CARDS-ROW = 20 AND CARDS-COL = CURRENT_CARD.
        CARDS-COL = 0.
      ENDIF.

      IF CARDS-ROW = 20 AND CARDS-COL > CURRENT_CARD.
        CARDS-COL = CARDS-COL – 1.
      ENDIF.

      MODIFY CARDS.

    ENDLOOP.

    CURRENT_CARD = CURRENT_CARD – 1.
    MAX_CARD = MAX_CARD – 1.
    IF MAX_CARD < MIN_CARD.
      MIN_CARD = MIN_CARD – 1.
      MAX_CARD = MIN_CARD.
    ENDIF.

    IF CURRENT_CARD < 1.
      CURRENT_CARD = MIN_CARD.
    ENDIF.

  ELSE.
    LOOP
     AT CARDS.
      IF CARDS-ROW = MOVING_ROW AND CARDS-COL = MOVING_COL.
        CARDS-COL = 0.
        MODIFY CARDS.
      ENDIF.
    ENDLOOP.
    TEST_ROW = MOVING_ROW – 1.

    LOOP
     AT CARDS.
      IF CARDS-COL = MOVING_COL AND CARDS-ROW = TEST_ROW.
        CARDS-VIS = ‘y’.
        MODIFY CARDS.
      ENDIF.
    ENDLOOP.
  ENDIF.
  MOVING_CARD = SPACE.

ENDFORM.

02

02 2010

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

02

02 2010

Marbles

*&———————————————————————*
*& Report  ZTEST_NP_MARBLE
*&
*&———————————————————————*
*&
*&
*&———————————————————————*
REPORT  ZTEST_NP_MARBLE NO STANDARD PAGE HEADING.
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
* I N C L U D E
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
INCLUDE <ICON>.

*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
* D A T A   D E F I N I T I O N
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
*….Types
TYPES: BEGIN OF TY_SCORE,
       SRL   TYPE I,
       UNAME TYPE SY-UNAME,
       SCORE TYPE I,
       TIME  TYPE I,
       END   OF TY_SCORE.
*….Internal Tables
DATA: BEGIN OF ITAB OCCURS 0,
      C1,  C2,  C3,
      C4,  C5,  C6,
      C7,  C8,  C9,
      END   OF ITAB.
DATA: BEGIN OF IT_PRINT OCCURS 0,
      C1(4), C2(4), C3(4),
      C4(4), C5(4), C6(4),
      C7(4), C8(4), C9(4),
      END   OF IT_PRINT.
DATA: IT_SCORE TYPE STANDARD TABLE OF TY_SCORE.
*….Work Areas
DATA: WA_ITAB  LIKE ITAB,
      WA_PRINT LIKE IT_PRINT,
      W_SCORE  TYPE TY_SCORE.
*….Globle Variables
DATA: L_NO_M      TYPE I,
      L_NO_S      TYPE I,
      L_NO_C      TYPE CHAR10,
      L_HALF      TYPE I,
      L_HALF_HALF TYPE I,
      L_PRINT     TYPE FLAG,
      L_NAME      TYPE CHAR20,
      L_MOD       TYPE I.
DATA: W_ON        TYPE FLAG,
      W_SEL_LINE  TYPE I,
      W_SEL_COL   TYPE CHAR1,
      W_DEST_OK   TYPE FLAG,
      W_DEST_LINE TYPE I,
      W_DEST_COL  TYPE CHAR1,
      W_FIELD     TYPE CHAR20,
      W_LINE      TYPE I,
      W_GAME_OVER TYPE FLAG,
      W_TOTAL     TYPE I,
      W_REM       TYPE I,
      W_GONE      TYPE I,
      W_ST_TIME   TYPE I,
      W_END_TIME  TYPE I,
      W_EXPORTED  TYPE FLAG.
*….Field symbols
FIELD-SYMBOLS: <F> TYPE ANY.
*….Constants
CONSTANTS: ICON_0(40) TYPE C VALUE ICON_WD_RADIO_BUTTON_EMPTY,
           ICON_1(40) TYPE C VALUE ICON_RADIOBUTTON,
           ICON_2(40) TYPE C VALUE ICON_COLOR.
*.. Some systems don’t have above listed ICONs You can use:
**….Constants
*CONSTANTS: ICON_0(40) TYPE C VALUE ICON_AVERAGE,      ” ICON_WD_RADIO_BUTTON_EMPTY,
*           ICON_1(40) TYPE C VALUE ICON_POSITIVE,     ” ICON_RADIOBUTTON,
*           ICON_2(40) TYPE C VALUE ICON_COLOR.

*….Ranges
RANGES: R_NOT_GREY FOR ABDOCMODE-FLAG.
*….Macros
DEFINE CONV_I_C.
  &2 = &1.
  CONDENSE &2.
END-OF-DEFINITION.

*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
* S E L E C T I O N   S C R E E N
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
PARAMETERS: P_NUM TYPE I DEFAULT 7.
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
* A T   S E L E C T I O N – S C R E E N .
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
AT SELECTION-SCREEN.
  IF  P_NUM GT 9
  OR  P_NUM LT 5.
    MESSAGE E398(00) WITH ‘Currently allowed only: 5, 7, 9’.
  ENDIF.
  L_MOD = P_NUM MOD 2.
  IF L_MOD = 0.
    MESSAGE E398(00) WITH ‘Only odd numbers are allowed’.
  ENDIF.
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
* S T A R T   O F   S E L E C T I O N
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
START-OF-SELECTION.
  GET TIME FIELD W_ST_TIME.
  PERFORM FILL_MARBLES.
  PERFORM FILL_PRINT_TABLE.
  PERFORM WRITE_MARBLES.
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
* A T   L I N E   S E L E C T I O N
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
AT LINE-SELECTION.
  GET CURSOR FIELD W_FIELD.
  PERFORM CALCULATE_MARBLES.
  PERFORM FILL_PRINT_TABLE.
  SY-LSIND = 0.
  PERFORM WRITE_MARBLES.
  PERFORM CHECK_GAME_OVER.
*&———————————————————————*
*&      Form  fill_marbles
*&———————————————————————*
*       Fillup the initial table for the marbles
*———————————————————————-*
FORM FILL_MARBLES .
* Grey cells
  L_HALF = FLOOR( P_NUM / 2 ).
  L_HALF_HALF = L_HALF / 2.
  R_NOT_GREY-SIGN   = ‘I’.
  R_NOT_GREY-OPTION = ‘BT’.
  R_NOT_GREY-LOW  = ( L_HALF – L_HALF_HALF ) + 1.
  R_NOT_GREY-HIGH = ( L_HALF + L_HALF_HALF ) – 1.
  APPEND R_NOT_GREY.
  CLEAR  R_NOT_GREY.
* Filling up the table
  DO P_NUM TIMES.
    L_NO_M = SY-INDEX.
    NEW-LINE.
    DO P_NUM TIMES.
      L_NO_S = SY-INDEX.
      CLEAR: L_PRINT.
      IF L_NO_M IN R_NOT_GREY.
        L_PRINT = ‘X’.
      ENDIF.
      IF L_NO_S IN R_NOT_GREY.
        L_PRINT = ‘X’.
      ENDIF.
      IF L_PRINT = ‘X’.
        CONV_I_C L_NO_S L_NO_C.
        CONCATENATE ‘WA_ITAB-C’ L_NO_C INTO L_NAME.
        ASSIGN (L_NAME) TO <F>.
        IF  L_NO_S = L_HALF
        AND L_NO_M = L_HALF.
          <F> = ‘0’.
          W_TOTAL = W_TOTAL – 1.
        ELSE.
          <F> = ‘1’.
          W_TOTAL = W_TOTAL + 1.
        ENDIF.
      ELSE.
        WRITE: ‘ ‘.
      ENDIF.
    ENDDO.
    APPEND WA_ITAB TO ITAB.
    CLEAR  WA_ITAB.
  ENDDO.
  W_REM = W_TOTAL.
ENDFORM.                    ” fill_marbles
*&———————————————————————*
*&      Form  fill_print_Table
*&———————————————————————*
*       Convert ITAB value to PRINT table value .
*———————————————————————-*
FORM FILL_PRINT_TABLE .
  FIELD-SYMBOLS: <F1> TYPE ANY.
  REFRESH IT_PRINT.
  LOOP AT ITAB INTO WA_ITAB.
    L_NO_M = SY-INDEX.
    DO P_NUM TIMES.
      CONV_I_C SY-INDEX L_NO_C.
      CLEAR L_NAME.
      CONCATENATE ‘WA_ITAB-C’ L_NO_C INTO L_NAME.
      ASSIGN (L_NAME) TO <F>.
      CLEAR L_NAME.
      CONCATENATE ‘WA_PRINT-C’ L_NO_C INTO L_NAME.
      ASSIGN (L_NAME) TO <F1>.
      CASE <F>.
        WHEN ‘1’.
          <F1> = ICON_1.
        WHEN ‘0’.
          <F1> = ICON_0.
        WHEN ‘2’.
          <F1> = ICON_2.
        WHEN OTHERS.
      ENDCASE.
    ENDDO.
    APPEND WA_PRINT TO IT_PRINT.
    CLEAR  WA_PRINT.
  ENDLOOP.
ENDFORM.                    ” fill_print_Table
*&———————————————————————*
*&      Form  write_marbles
*&———————————————————————*
*       Write marbles from the PRINT table
*———————————————————————-*
FORM WRITE_MARBLES .
  FIELD-SYMBOLS: <F1> TYPE ANY.
  IF W_GAME_OVER IS INITIAL.
    LOOP AT IT_PRINT INTO WA_PRINT.
      SKIP 1.
      W_LINE = SY-TABIX.
      WRITE: (2) W_LINE.
      HIDE  W_LINE.
      DO P_NUM TIMES.
        CONV_I_C SY-INDEX L_NO_C.
        CLEAR L_NAME.
        CONCATENATE ‘WA_PRINT-C’ L_NO_C INTO L_NAME.
        ASSIGN (L_NAME) TO <F1>.
        IF NOT <F1> IS INITIAL.
          WRITE: (2) <F1> AS ICON HOTSPOT ON, (2) ‘ ‘.
        ELSE.
          WRITE: (2) ‘ ‘, (2) ‘ ‘.
        ENDIF.
      ENDDO.
    ENDLOOP.
  ENDIF.
  SKIP 4.
  WRITE: /(30) ‘Total Marbles:’,    W_TOTAL.
  WRITE: /(30) ‘Remaining Marbles’, W_REM.
  SKIP 4.
  PERFORM WRITE_5_HIGH_SCORE.
ENDFORM.                    ” write_marbles
*&———————————————————————*
*&      Form  calculate_marbles
*&———————————————————————*
*       Calculate the marbles after the user input in line selection
*———————————————————————-*
FORM CALCULATE_MARBLES .
* No marble has been selected
  IF W_ON IS INITIAL.
    PERFORM VALIDATE_INPUT.
  ELSE.
* remove the seleced marble
    PERFORM DESELECT_MARBLE.
    IF W_ON = ‘X’.
*     Check destination cell, if the same marble has not been selected
      PERFORM CHECK_DESTINATION.
    ENDIF.
  ENDIF.
* Destination is ok ..? rearrange the marbles in ITAB
  IF W_DEST_OK = ‘X’.
    PERFORM REARRANGE_MARBLES.
  ENDIF.
ENDFORM.                    ” calculate_marbles
*&———————————————————————*
*&      Form  validate_input
*&———————————————————————*
*       Validating the selected marble, is it movable or not
*       if marble is movable, highlight it
*———————————————————————-*
FORM VALIDATE_INPUT .
  DATA: L_SEL_FIELD(20),
        L_TMP_FIELD(20),
        L_SEL_COL(1),
        L_TMP_COL(2),
        L_TMP_LINE TYPE I,
        L_OK TYPE FLAG.
  FIELD-SYMBOLS: <F1> TYPE ANY,
                 <F2> TYPE ANY.
  READ TABLE ITAB INTO WA_ITAB INDEX W_LINE.
  L_SEL_FIELD = W_FIELD.
  L_SEL_COL   = W_FIELD+10(1).
  REPLACE ‘PRINT’ INTO L_SEL_FIELD WITH ‘ITAB’.
  CONDENSE L_SEL_FIELD.
  ASSIGN (L_SEL_FIELD) TO <F1>.
* value = 0 >> No marble
  IF <F1> = ‘0’.
    MESSAGE S398(00) WITH ‘No marble to select.!’.
    EXIT.
  ENDIF.
* Check right
  L_TMP_COL = L_SEL_COL + 2.
  IF L_TMP_COL < 9.
    CONCATENATE ‘WA_ITAB-C’ L_TMP_COL INTO L_TMP_FIELD.
    CONDENSE L_TMP_FIELD.
    ASSIGN (L_TMP_FIELD) TO <F2>.
    IF <F2> = ‘0’.
      L_OK = ‘X’.
    ENDIF.
  ENDIF.
* Check left
  IF L_OK IS INITIAL.
    L_TMP_COL = L_SEL_COL – 2.
    IF L_TMP_COL > 0.
      CONCATENATE ‘WA_ITAB-C’ L_TMP_COL INTO L_TMP_FIELD.
      CONDENSE L_TMP_FIELD.
      ASSIGN (L_TMP_FIELD) TO <F2>.
      IF <F2> = ‘0’.
        L_OK = ‘X’.
      ENDIF.
    ENDIF.
  ENDIF.
* check Above
  IF L_OK IS INITIAL.
    L_TMP_LINE = W_LINE – 2.
    IF L_TMP_LINE > 0.
      READ TABLE ITAB INTO WA_ITAB INDEX L_TMP_LINE.
      IF <F1> = ‘0’.
        L_OK = ‘X’.
      ENDIF.
      READ TABLE ITAB INTO WA_ITAB INDEX W_LINE.
    ENDIF.
  ENDIF.
* Check underneath
  IF L_OK IS INITIAL.
    L_TMP_LINE = W_LINE + 2.
    IF L_TMP_LINE < 9.
      READ TABLE ITAB INTO WA_ITAB INDEX L_TMP_LINE.
      IF <F1> = ‘0’.
        L_OK = ‘X’.
      ENDIF.
      READ TABLE ITAB INTO WA_ITAB INDEX W_LINE.
    ENDIF.
  ENDIF.
* Ok .. than ON
  IF L_OK = ‘X’.
    W_ON = ‘X’.
    <F1> = ‘2’.
    MODIFY ITAB FROM WA_ITAB INDEX W_LINE.
    W_SEL_LINE = W_LINE.
    W_SEL_COL  = L_SEL_COL .
  ELSE.
    MESSAGE S398(00) WITH ‘No marble to select.!’ ‘ ‘ ‘ ‘ ‘ ‘.
  ENDIF.
ENDFORM.                    ” validate_input
*&———————————————————————*
*&      Form  deselect_marble
*&———————————————————————*
*       Deselect the marble if the same marble is selected again
*———————————————————————-*
FORM DESELECT_MARBLE .
  DATA: L_SEL_FIELD(20).
  FIELD-SYMBOLS: <F1> TYPE ANY.
  READ TABLE ITAB INTO WA_ITAB INDEX W_LINE.
  L_SEL_FIELD = W_FIELD.
  REPLACE ‘PRINT’ INTO L_SEL_FIELD WITH ‘ITAB’.
  CONDENSE L_SEL_FIELD.
  ASSIGN (L_SEL_FIELD) TO <F1>.
  IF <F1> = ‘2’.
    <F1> = ‘1’.
    MODIFY ITAB FROM WA_ITAB INDEX W_LINE.
    MESSAGE S398(00) WITH ‘Marble was deselected..!!’.
    CLEAR: W_ON, W_SEL_LINE, W_SEL_COL.
  ENDIF.
ENDFORM.                    ” deselect_marble
*&———————————————————————*
*&      Form  check_destination
*&———————————————————————*
*       Check the destination cell, it should not be empty and distnce
*       between selected cell and destination cell must be 2
*———————————————————————-*
FORM CHECK_DESTINATION .
  DATA: L_DEST_FIELD(20),
        L_DEST_COL(1),
        L_DEST_NOT_OK TYPE FLAG,
        L_TMP_LINE TYPE I,
        L_TMP_COL  TYPE C.
  DATA: L_ITAB_DEST LIKE ITAB.
  FIELD-SYMBOLS: <F1> TYPE ANY.
  READ TABLE ITAB INTO L_ITAB_DEST INDEX W_LINE.
  L_DEST_FIELD = W_FIELD.
  L_DEST_COL   = W_FIELD+10(1).
  REPLACE ‘WA_PRINT’ INTO L_DEST_FIELD WITH ‘L_ITAB_DEST’.
  CONDENSE L_DEST_FIELD.
  ASSIGN (L_DEST_FIELD) TO <F1>.
* Destination should be empty
  IF <F1> <> ‘0’.
    L_DEST_NOT_OK = ‘X’.
  ENDIF.
* Calcualate the distance between selected marble and destination
  IF L_DEST_NOT_OK IS INITIAL.
    IF W_SEL_LINE <> W_LINE.
      L_TMP_LINE = ABS( W_SEL_LINE – W_LINE ).
      IF L_TMP_LINE <> ‘2’.
        L_DEST_NOT_OK = ‘X’.
      ENDIF.
    ENDIF.
  ENDIF.
  IF L_DEST_NOT_OK IS INITIAL.
    IF W_SEL_COL <> L_DEST_COL.
      L_TMP_COL = ABS( W_SEL_COL – L_DEST_COL ).
      IF L_TMP_COL <> ‘2’.
        L_DEST_NOT_OK = ‘X’.
      ENDIF.
    ENDIF.
  ENDIF.
* destination not ok
  IF L_DEST_NOT_OK = ‘X’.
    MESSAGE S398(00) WITH ‘Destination is not GOOD’ ‘ ‘ ‘ ‘ ‘ ‘.
  ELSE.
    W_DEST_OK = ‘X’.
    W_DEST_LINE = W_LINE.
    W_DEST_COL  = L_DEST_COL.
  ENDIF.
ENDFORM.                    ” check_destination
*&———————————————————————*
*&      Form  rearrange_marbles
*&———————————————————————*
*       Rearrange marbles
*     1 Remove the marble which is inbetween the selected & destination
*     2 Remove the marble from the selected cell
*     3 Put marble on the destination cell
*———————————————————————-*
FORM REARRANGE_MARBLES .
  DATA: L_FIELD(20),
        L_TMP_LINE TYPE I,
        L_TMP_COL  TYPE CHAR1,
        L_NO_MOVE  TYPE FLAG,
        L_ITAB LIKE ITAB.

  FIELD-SYMBOLS: <F1> TYPE ANY.
* Make the inbetween column as 0 if both lines are same
  IF W_SEL_LINE = W_DEST_LINE.
    IF W_SEL_COL > W_DEST_COL.
      L_TMP_COL = W_DEST_COL + 1.
    ELSE.
      L_TMP_COL = W_SEL_COL + 1.
    ENDIF.
    READ TABLE ITAB INTO L_ITAB INDEX W_SEL_LINE.
    L_FIELD = W_FIELD.
    REPLACE ‘WA_PRINT’ INTO L_FIELD WITH ‘L_ITAB’.
    CONDENSE L_FIELD.
    L_FIELD+8(1) = L_TMP_COL.
    ASSIGN (L_FIELD) TO <F1>.
    IF <F1> = 1.
      <F1> = ‘0’.
      W_GONE = W_GONE + 1.
      MODIFY ITAB FROM L_ITAB INDEX W_SEL_LINE.
    ELSE.
      L_NO_MOVE = ‘X’.
    ENDIF.
    CLEAR  L_ITAB.
  ENDIF.
* Make the inbetween line as 0 if both lines are same
  IF W_SEL_COL = W_DEST_COL.
    IF W_SEL_LINE > W_DEST_LINE.
      L_TMP_LINE = W_DEST_LINE + 1.
    ELSE.
      L_TMP_LINE = W_SEL_LINE + 1.
    ENDIF.
    READ TABLE ITAB INTO L_ITAB INDEX L_TMP_LINE.
    L_FIELD = W_FIELD.
    REPLACE ‘WA_PRINT’ INTO L_FIELD WITH ‘L_ITAB’.
    CONDENSE L_FIELD.
    L_FIELD+8(1) = W_SEL_COL.
    ASSIGN (L_FIELD) TO <F1>.
    IF <F1> = 1.
      <F1> = ‘0’.
      W_GONE = W_GONE + 1.
      MODIFY ITAB FROM L_ITAB INDEX L_TMP_LINE.
    ELSE.
      L_NO_MOVE = ‘X’.
    ENDIF.
    CLEAR  L_ITAB.
  ENDIF.
  IF L_NO_MOVE IS INITIAL.
*   Make Destination = 1
    READ TABLE ITAB INTO L_ITAB INDEX W_DEST_LINE.
    L_FIELD = W_FIELD.
    REPLACE ‘WA_PRINT’ INTO L_FIELD WITH ‘L_ITAB’.
    CONDENSE L_FIELD.
    L_FIELD+8(1) = W_DEST_COL.
    ASSIGN (L_FIELD) TO <F1>.
    <F1> = ‘1’.
    MODIFY ITAB FROM L_ITAB INDEX W_DEST_LINE.
    CLEAR  L_ITAB.
*   Make.
    READ TABLE ITAB INTO L_ITAB INDEX W_SEL_LINE.
    L_FIELD = W_FIELD.
    REPLACE ‘WA_PRINT’ INTO L_FIELD WITH ‘L_ITAB’.
    CONDENSE L_FIELD.
    L_FIELD+8(1) = W_SEL_COL.
    ASSIGN (L_FIELD) TO <F1>.
    <F1> = ‘0’.
    MODIFY ITAB FROM L_ITAB INDEX W_SEL_LINE.
    CLEAR  L_ITAB.
  ELSE.
*   Make Selected = 1 when no movement
    READ TABLE ITAB INTO L_ITAB INDEX W_SEL_LINE.
    L_FIELD = W_FIELD.
    REPLACE ‘WA_PRINT’ INTO L_FIELD WITH ‘L_ITAB’.
    CONDENSE L_FIELD.
    L_FIELD+8(1) = W_SEL_COL.
    ASSIGN (L_FIELD) TO <F1>.
    <F1> = ‘1’.
    MODIFY ITAB FROM L_ITAB INDEX W_SEL_LINE.
    CLEAR  L_ITAB.
  ENDIF.
  W_REM = W_TOTAL – W_GONE.
  CLEAR: W_DEST_OK, W_DEST_LINE, W_DEST_COL,
         W_ON,      W_SEL_LINE,  W_SEL_COL.

ENDFORM.                    ” rearrange_marbles
*&———————————————————————*
*&      Form  check_game_over
*&———————————————————————*
*       Check game over when the remaining marbles are half than
*         the original marbles. Check for all cells with the marbles and
*         check adjacent cells (right, left, above and underneath cells)
*         with the value. If the marble found in any adjacent cell than
*         GAME is NOT OVER
*———————————————————————-*
FORM CHECK_GAME_OVER .
  STATICS: L_TOT_HALF TYPE I.
  DATA: L_ITAB     LIKE ITAB,
        L_ITAB_TMP LIKE ITAB.
  DATA: L_TMP_FIELD(20),
        L_SEL_COL(1),
        L_TMP_COL(2),
        L_OK       TYPE FLAG,
        L_LINE     TYPE I,
        L_TMP_LINE TYPE I.
  CLEAR: L_OK.
  FIELD-SYMBOLS: <F1> TYPE ANY,
                 <F2> TYPE ANY.
  CHECK W_ON IS INITIAL.
  L_TOT_HALF = ABS( W_TOTAL / 2 ).
  CHECK W_REM < L_TOT_HALF.
  LOOP AT ITAB INTO L_ITAB.
    L_LINE = SY-TABIX.
    L_ITAB_TMP = L_ITAB.
    DO P_NUM TIMES.
      L_ITAB = L_ITAB_TMP.
      L_SEL_COL = SY-INDEX.
      CONV_I_C SY-INDEX L_NO_C.
      CLEAR L_NAME.
      CONCATENATE ‘L_ITAB-C’ L_NO_C INTO L_NAME.
      ASSIGN (L_NAME) TO <F1>.
      IF <F1> IS INITIAL
      OR <F1> = ‘0’.
        CONTINUE.
      ENDIF.
*      IF <F1> = ‘1’.
*        l_ok = ‘X’.
*        exit.
*      ENDIF.
*     right neighbour
      L_TMP_COL = L_SEL_COL + 1.
      IF L_TMP_COL < 9.
        CONCATENATE ‘L_ITAB-C’ L_TMP_COL INTO L_TMP_FIELD.
        CONDENSE L_TMP_FIELD.
        ASSIGN (L_TMP_FIELD) TO <F2>.
        IF <F2> = ‘1’.
          L_TMP_COL = L_SEL_COL + 2.
          IF L_TMP_COL < 9.
            CONCATENATE ‘L_ITAB-C’ L_TMP_COL INTO L_TMP_FIELD.
            CONDENSE L_TMP_FIELD.
            ASSIGN (L_TMP_FIELD) TO <F2>.
            IF <F2> = ‘0’.
              L_OK = ‘X’.
              EXIT.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.
*     Check left
      L_TMP_COL = L_SEL_COL – 1.
      IF L_TMP_COL > 0.
        CONCATENATE ‘L_ITAB-C’ L_TMP_COL INTO L_TMP_FIELD.
        CONDENSE L_TMP_FIELD.
        ASSIGN (L_TMP_FIELD) TO <F2>.
        IF <F2> = ‘1’.
          L_TMP_COL = L_SEL_COL – 2.
          IF L_TMP_COL > 0.
            CONCATENATE ‘L_ITAB-C’ L_TMP_COL INTO L_TMP_FIELD.
            CONDENSE L_TMP_FIELD.
            ASSIGN (L_TMP_FIELD) TO <F2>.
            IF <F2> = ‘0’.
              L_OK = ‘X’.
              EXIT.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.
      CONCATENATE ‘L_ITAB-C’ L_NO_C INTO L_TMP_FIELD.
      CONDENSE L_TMP_FIELD.
      ASSIGN (L_TMP_FIELD) TO <F2>.
*     check Above
      L_TMP_LINE = L_LINE – 1.
      IF L_TMP_LINE > 0.
        CLEAR L_ITAB.
        READ TABLE ITAB INTO L_ITAB INDEX L_TMP_LINE.
        IF <F2> = ‘1’.
          L_TMP_LINE = L_LINE – 2.
          IF L_TMP_LINE > 0.
            CLEAR L_ITAB.
            READ TABLE ITAB INTO L_ITAB INDEX L_TMP_LINE.
            IF <F2> = ‘0’.
              L_OK = ‘X’.
              EXIT.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.
*     Check underneath
      L_TMP_LINE = L_LINE + 1.
      IF L_TMP_LINE < 9.
        CLEAR L_ITAB.
        READ TABLE ITAB INTO L_ITAB INDEX L_TMP_LINE.
        IF <F2> = ‘1’.
          L_TMP_LINE = L_LINE + 2.
          IF L_TMP_LINE < 9.
            CLEAR L_ITAB.
            READ TABLE ITAB INTO L_ITAB INDEX L_TMP_LINE.
            IF <F2> = ‘0’.
              L_OK = ‘X’.
              EXIT.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDDO.
    IF L_OK = ‘X’.
      EXIT.
    ENDIF.
  ENDLOOP.
  IF L_OK IS INITIAL.
    W_GAME_OVER = ‘X’.
    MESSAGE S398(00) WITH ‘Game Over. Socre:’ W_REM.
    PERFORM EXPORT_HIGH_SCORE.
*    leave program.
  ENDIF.
ENDFORM.                    ” check_game_over
*&———————————————————————*
*&      Form  export_high_score
*&———————————————————————*
*       Export High Score to memory when the game is over
*———————————————————————-*
FORM EXPORT_HIGH_SCORE .
  DATA: L_TIME TYPE I.
  CHECK W_EXPORTED IS INITIAL.
  GET TIME FIELD W_END_TIME.
  L_TIME = W_END_TIME – W_ST_TIME.
  W_SCORE-UNAME = SY-UNAME.
  W_SCORE-SCORE = W_REM.
  W_SCORE-TIME  = L_TIME.
  APPEND W_SCORE TO IT_SCORE.
  SORT IT_SCORE BY SCORE TIME.
  LOOP AT IT_SCORE INTO W_SCORE.
    W_SCORE-SRL = SY-TABIX.
    MODIFY IT_SCORE FROM W_SCORE.
    CLEAR  W_SCORE.
  ENDLOOP.
  DELETE IT_SCORE WHERE SRL > 5.
  EXPORT IT_SCORE = IT_SCORE TO DATABASE INDX(ZZ)
         ID ‘ZGAME_MAR’.
  W_EXPORTED = ‘X’.
ENDFORM.                    ” export_high_score
*&———————————————————————*
*&      Form  write_5_high_score
*&———————————————————————*
*       Write 5 high scores
*———————————————————————-*
FORM WRITE_5_HIGH_SCORE .
  IMPORT IT_SCORE = IT_SCORE FROM DATABASE INDX(ZZ)
         ID ‘ZGAME_MAR’.
  WRITE: /(12) ‘User’,
          (10) ‘Score’ RIGHT-JUSTIFIED ,
          (10) ‘Time’  RIGHT-JUSTIFIED.
  WRITE: /(34) SY-ULINE.
  LOOP AT IT_SCORE INTO W_SCORE.
    WRITE: /(12) W_SCORE-UNAME,
            (10) W_SCORE-SCORE,
            (10) W_SCORE-TIME.
  ENDLOOP.
ENDFORM.                    ” write_5_high_score

02

02 2010

TicTacToe

report ztictactoe no standard page heading.

************************************************************************
* TYPES
************************************************************************
* build up table of possible, valid options
types:
begin of t_options,
key(1),
one(1),
two(1),
three(1),
four(1),
five(1),
six(1),
seven(1),
eight(1),
nine(1),
end of t_options.

* Build list of all possible numbers
types:
begin of t_possible,
number(2),
end of t_possible.

types:
begin of t_my_pick,
number(2),
end of t_my_pick.

types:
begin of t_your_pick,
number(2),
end of t_your_pick.

types:
begin of t_win_combo,
one(2),
two(2),
three(2),
end of t_win_combo.

types:
begin of t_best_for_me,
count type i,
importance type i,
best_number(2),
one(2),
two(2),
three(2),
end of t_best_for_me.

types:
begin of t_weighting,
number(2),
rank type i,
end of t_weighting.
************************************************************************
* DATA DECLARATIONS FOR INTERNAL TABLES
************************************************************************
data:
i_options type standard table of t_options,
wa_options type t_options,
i_possible type standard table of t_possible,
wa_possible type t_possible.

data:
i_my_pick type standard table of t_my_pick,
i_your_pick type standard table of t_your_pick,
i_win_combo type standard table of t_win_combo,
i_best_for_me type standard table of t_best_for_me,
i_best_for_you type standard table of t_best_for_me,
i_weighting type standard table of t_weighting,
wa_my_pick type t_my_pick,
wa_your_pick type t_your_pick,
wa_win_combo type t_win_combo,
wa_best_for_me type t_best_for_me,
wa_best_for_you type t_best_for_me,
wa_weighting type t_weighting.
************************************************************************
* DATA
************************************************************************
data:
best_save type i,
l_random type i,
once_only(1),
importance_save_me type i,
importance_save_you type i,
block(1),
my_lines like sy-dbcnt,
your_lines like sy-dbcnt,
total_lines like sy-dbcnt,
finish(1).

data:
p1(5),
p2(5),
p3(5),
p4(5),
p5(5),
p6(5),
p7(5),
p8(5),
p9(5).

data:
user_first(1) value ‘ ‘,
index(2) value ‘P5’,
cursor(5),
my_count type i,
your_count type i,
best(2),
best_number(2),
win_flag(1).

constants:
noughts(1) value ‘O’,
crosses(1) value ‘X’,
c_rank1 type i value ‘3’,
c_rank2 type i value ‘2’,
c_rank3 type i value ‘1’.
************************************************************************
* SETUP POSSIBLE VALUE MATRIX
************************************************************************
selection-screen begin of block main.

selection-screen pushbutton 15(25) p_head user-command us01.

selection-screen skip 1.

selection-screen pushbutton 15(25) p_tail user-command us02.

selection-screen end of block main.

************************************************************************
* INITIALIZATION
************************************************************************
initialization.

move ‘Heads’ to p_head.
move ‘Tails’ to p_tail.
************************************************************************
* PROCESSING
************************************************************************
************************************************************************
* AT SELECTION-SCREEN IS RUN FIRST
************************************************************************

at selection-screen.

check finish ne ‘X’.

check once_only = ‘ ‘.
once_only = ‘X’.
perform initialization.

* randomly pick heads or tails based on system time

check sy-ucomm eq ‘US01’ or sy-ucomm eq ‘US02’.

l_random = sy-uzeit mod 2.

if sy-ucomm eq ‘US01’.

if l_random eq 0.

p_head = ‘You Win’.
p_tail = ‘ ‘.
user_first = ‘X’.

else.

p_head = ‘You Lose’.
p_tail = ‘ ‘.

endif.

else.

if l_random eq 1.

p_tail = ‘You Win’.
p_head = ‘ ‘.
user_first = ‘X’.

else.

p_tail = ‘You Lose’.
p_head = ‘ ‘.
endif.
endif.

* Here work out, statistically what is the best number to have
perform get_best_number.

************************************************************************
* AT START-OF-SELECTION RUN SECOND
************************************************************************
start-of-selection.

skip 1.

check once_only = ‘X’.

if user_first eq ‘X’.

write:20 p1, sy-vline, p2, sy-vline, p3.
write:/20 sy-uline(21).
write:/20 p4, sy-vline, p5, sy-vline, p6.
write:/20 sy-uline(21).
write:/20 p7, sy-vline, p8, sy-vline, p9.

else.

perform write_screen using index
noughts
‘ ‘.

endif.

************************************************************************
* AT LINE SELECTION RUN FROM NOW ON
************************************************************************
at line-selection.

clear i_best_for_me[].
clear i_best_for_you[].
clear wa_best_for_me.
clear wa_best_for_you.

 

* Find where the user wishes to place their cross, this has to be the
* User
get cursor field cursor.

read table i_my_pick
into wa_my_pick
with key number = cursor.

if sy-subrc eq 0.

exit.

endif.

read table i_your_pick
into wa_your_pick
with key number = cursor.

if sy-subrc eq 0.

exit.

endif.

if cursor is initial.

exit.

endif.

perform write_screen using cursor
crosses
‘X’.

* Here we look at who has what against the winning combos
* What runs could I make, what runs could the user make
* rank the available numbers, then decide which is the best number
* for me or the user

loop at i_win_combo into wa_win_combo.

perform find_best_number using wa_win_combo-one.
perform find_best_number using wa_win_combo-two.
perform find_best_number using wa_win_combo-three.

case my_count.

when 0.

wa_best_for_me-importance = wa_best_for_me-importance * c_rank3.

when 1.

wa_best_for_me-importance = wa_best_for_me-importance * c_rank2.

when 2.

wa_best_for_me-importance = wa_best_for_me-importance * c_rank1.

endcase.
if my_count ge your_count.

move my_count to wa_best_for_me-count.
move wa_win_combo-one to wa_best_for_me-one.
move wa_win_combo-two to wa_best_for_me-two.
move wa_win_combo-three to wa_best_for_me-three.
append wa_best_for_me to i_best_for_me.

else.

move your_count to wa_best_for_you-count.
move wa_win_combo-one to wa_best_for_you-one.
move wa_win_combo-two to wa_best_for_you-two.
move wa_win_combo-three to wa_best_for_you-three.
append wa_best_for_you to i_best_for_you.

endif.

clear my_count.
clear your_count.
clear importance_save_me.
clear importance_save_you.
clear wa_best_for_me.
clear wa_best_for_you.

endloop.

sort i_best_for_me by count descending
importance descending.

sort i_best_for_you by count descending
importance descending.

delete i_best_for_me where importance is initial.
delete i_best_for_you where importance is initial.

read table i_best_for_me into wa_best_for_me index 1.

read table i_best_for_you into wa_best_for_you index 1.

* if both wa are initial then the end has come

* if we have two numbers and the user does not have the last
* put it in
if wa_best_for_me-count eq 2.

block = ‘X’.
win_flag = ‘X’.

endif.

if wa_best_for_you-count eq 2.

block = ‘X’.

endif.

if not block = ‘X’.

if wa_best_for_me-importance ge wa_best_for_you-importance.

* find which number they have put in
wait up to 2 seconds.
perform write_screen using wa_best_for_me-best_number
noughts
‘ ‘.

else.

wait up to 2 seconds.
perform write_screen using wa_best_for_you-best_number
noughts
‘ ‘.
endif.

else.

if win_flag = ‘X’.
* Computer has third of winning row and wins
wait up to 2 seconds.
perform write_screen using wa_best_for_me-best_number
noughts
‘ ‘.

write:/ ‘I win’.
finish = ‘X’.

else.

wait up to 2 seconds.

if not wa_best_for_you-best_number is initial.

perform write_screen using wa_best_for_you-best_number
noughts
‘ ‘.

else.

perform write_screen using wa_best_for_me-best_number
noughts
‘ ‘.

endif.

endif.

clear i_best_for_me[].
clear i_best_for_you[].

endif.

sort i_my_pick.
sort i_your_pick.

delete adjacent duplicates from i_my_pick.
delete adjacent duplicates from i_your_pick.

describe table i_my_pick lines my_lines.
describe table i_your_pick lines your_lines.

total_lines = my_lines + your_lines.

if total_lines ge 10.

write:/ ‘A Draw’.

finish = ‘X’.

endif.

*&———————————————————————*
*& Form write_screen
*&———————————————————————*
* text
*———————————————————————-*
* –> p1 text
* <– p2 text
*———————————————————————-*
FORM write_screen using cursor
marker
process.

case cursor.

when ‘P1’.

p1 = marker.

when ‘P2’.

p2 = marker.

when ‘P3’.

p3 = marker.

when ‘P4’.

p4 = marker.

when ‘P5’.

p5 = marker.

when ‘P6’.

p6 = marker.

when ‘P7’.

p7 = marker.

when ‘P8’.

p8 = marker.

when ‘P9’.

p9 = marker.
endcase.

if marker eq crosses.

move cursor to wa_your_pick.
append wa_your_pick to i_your_pick.
clear wa_your_pick.
else.

move cursor to wa_my_pick.
append wa_my_pick to i_my_pick.
clear wa_my_pick.

endif.

check process is initial.

skip 1.

write:20 p1, sy-vline, p2, sy-vline, p3.
write:/20 sy-uline(21).
write:/20 p4, sy-vline, p5, sy-vline, p6.
write:/20 sy-uline(21).
write:/20 p7, sy-vline, p8, sy-vline, p9.
ENDFORM. ” write_screen

*eject
*&———————————————————————*
*& Form initialization
*&———————————————————————*
FORM initialization.
* build vertical index agains horizontal columns
* fill win combo.

move ‘P1’ to wa_win_combo-one.
move ‘P2’ to wa_win_combo-two.
move ‘P3’ to wa_win_combo-three.
append wa_win_combo to i_win_combo.
clear wa_win_combo.

move ‘P4’ to wa_win_combo-one.
move ‘P5’ to wa_win_combo-two.
move ‘P6’ to wa_win_combo-three.
append wa_win_combo to i_win_combo.
clear wa_win_combo.

move ‘P7’ to wa_win_combo-one.
move ‘P8’ to wa_win_combo-two.
move ‘P9’ to wa_win_combo-three.
append wa_win_combo to i_win_combo.
clear wa_win_combo.

move ‘P1’ to wa_win_combo-one.
move ‘P4’ to wa_win_combo-two.
move ‘P7’ to wa_win_combo-three.
append wa_win_combo to i_win_combo.
clear wa_win_combo.

move ‘P2’ to wa_win_combo-one.
move ‘P5’ to wa_win_combo-two.
move ‘P8’ to wa_win_combo-three.
append wa_win_combo to i_win_combo.
clear wa_win_combo.

move ‘P3’ to wa_win_combo-one.
move ‘P6’ to wa_win_combo-two.
move ‘P9’ to wa_win_combo-three.
append wa_win_combo to i_win_combo.
clear wa_win_combo.

move ‘P1’ to wa_win_combo-one.
move ‘P5’ to wa_win_combo-two.
move ‘P9’ to wa_win_combo-three.
append wa_win_combo to i_win_combo.
clear wa_win_combo.

move ‘P7’ to wa_win_combo-one.
move ‘P5’ to wa_win_combo-two.
move ‘P3’ to wa_win_combo-three.
append wa_win_combo to i_win_combo.
clear wa_win_combo.

* fill weighting table
move ‘P5’ to wa_weighting-number.
move ‘9’ to wa_weighting-rank.
append wa_weighting to i_weighting.
clear wa_weighting.

move ‘P3’ to wa_weighting-number.
move ‘8’ to wa_weighting-rank.
append wa_weighting to i_weighting.
clear wa_weighting.

move ‘P7’ to wa_weighting-number.
move ‘7’ to wa_weighting-rank.
append wa_weighting to i_weighting.
clear wa_weighting.

move ‘P9’ to wa_weighting-number.
move ‘6’ to wa_weighting-rank.
append wa_weighting to i_weighting.
clear wa_weighting.

move ‘P1’ to wa_weighting-number.
move ‘5’ to wa_weighting-rank.
append wa_weighting to i_weighting.
clear wa_weighting.

move ‘P2’ to wa_weighting-number.
move ‘4’ to wa_weighting-rank.
append wa_weighting to i_weighting.
clear wa_weighting.

move ‘P8’ to wa_weighting-number.
move ‘3’ to wa_weighting-rank.
append wa_weighting to i_weighting.
clear wa_weighting.

move ‘P6’ to wa_weighting-number.
move ‘2’ to wa_weighting-rank.
append wa_weighting to i_weighting.
clear wa_weighting.

move ‘P4’ to wa_weighting-number.
move ‘1’ to wa_weighting-rank.
append wa_weighting to i_weighting.
clear wa_weighting.

 

* 1
write ‘1’ to wa_options-key.
write ‘ ‘ to wa_options-one.
write ‘1’ to wa_options-two.
write ‘1’ to wa_options-three.
write ‘1’ to wa_options-four.
write ‘1’ to wa_options-five.
write ‘ ‘ to wa_options-six.
write ‘1’ to wa_options-seven.
write ‘ ‘ to wa_options-eight.
write ‘1’ to wa_options-nine.

append wa_options to i_options.
clear wa_options.

* 2
write ‘2’ to wa_options-key.
write ‘1’ to wa_options-one.
write ‘ ‘ to wa_options-two.
write ‘1’ to wa_options-three.
write ‘ ‘ to wa_options-four.
write ‘1’ to wa_options-five.
write ‘ ‘ to wa_options-six.
write ‘ ‘ to wa_options-seven.
write ‘1’ to wa_options-eight.
write ‘ ‘ to wa_options-nine.

append wa_options to i_options.
clear wa_options.

* 3
write ‘3’ to wa_options-key.
write ‘1’ to wa_options-one.
write ‘1’ to wa_options-two.
write ‘ ‘ to wa_options-three.
write ‘ ‘ to wa_options-four.
write ‘1’ to wa_options-five.
write ‘1’ to wa_options-six.
write ‘1’ to wa_options-seven.
write ‘ ‘ to wa_options-eight.
write ‘1’ to wa_options-nine.

append wa_options to i_options.
clear wa_options.

* 4
write ‘4’ to wa_options-key.
write ‘1’ to wa_options-one.
write ‘ ‘ to wa_options-two.
write ‘ ‘ to wa_options-three.
write ‘ ‘ to wa_options-four.
write ‘1’ to wa_options-five.
write ‘1’ to wa_options-six.
write ‘1’ to wa_options-seven.
write ‘ ‘ to wa_options-eight.
write ‘ ‘ to wa_options-nine.

append wa_options to i_options.
clear wa_options.
* 5
write ‘5’ to wa_options-key.
write ‘1’ to wa_options-one.
write ‘1’ to wa_options-two.
write ‘1’ to wa_options-three.
write ‘1’ to wa_options-four.
write ‘ ‘ to wa_options-five.
write ‘1’ to wa_options-six.
write ‘1’ to wa_options-seven.
write ‘1’ to wa_options-eight.
write ‘1’ to wa_options-nine.

append wa_options to i_options.
clear wa_options.

* 6
write ‘6’ to wa_options-key.
write ‘ ‘ to wa_options-one.
write ‘ ‘ to wa_options-two.
write ‘1’ to wa_options-three.
write ‘1’ to wa_options-four.
write ‘1’ to wa_options-five.
write ‘ ‘ to wa_options-six.
write ‘ ‘ to wa_options-seven.
write ‘ ‘ to wa_options-eight.
write ‘1’ to wa_options-nine.

append wa_options to i_options.
clear wa_options.

* 7
write ‘7’ to wa_options-key.
write ‘1’ to wa_options-one.
write ‘ ‘ to wa_options-two.
write ‘1’ to wa_options-three.
write ‘1’ to wa_options-four.
write ‘1’ to wa_options-five.
write ‘ ‘ to wa_options-six.
write ‘ ‘ to wa_options-seven.
write ‘1’ to wa_options-eight.
write ‘1’ to wa_options-nine.

append wa_options to i_options.
clear wa_options.

* 8
write ‘8’ to wa_options-key.
write ‘ ‘ to wa_options-one.
write ‘1’ to wa_options-two.
write ‘ ‘ to wa_options-three.
write ‘ ‘ to wa_options-four.
write ‘1’ to wa_options-five.
write ‘ ‘ to wa_options-six.
write ‘1’ to wa_options-seven.
write ‘ ‘ to wa_options-eight.
write ‘1’ to wa_options-nine.

append wa_options to i_options.
clear wa_options.

* 9
write ‘9’ to wa_options-key.
write ‘1’ to wa_options-one.
write ‘ ‘ to wa_options-two.
write ‘1’ to wa_options-three.
write ‘ ‘ to wa_options-four.
write ‘1’ to wa_options-five.
write ‘1’ to wa_options-six.
write ‘1’ to wa_options-seven.
write ‘1’ to wa_options-eight.
write ‘ ‘ to wa_options-nine.

append wa_options to i_options.
clear wa_options.
* Initialization all possible numbers
write ‘P1’ to wa_possible-number.
append wa_possible to i_possible.

write ‘P2’ to wa_possible-number.
append wa_possible to i_possible.

write ‘P3’ to wa_possible-number.
append wa_possible to i_possible.

write ‘P4’ to wa_possible-number.
append wa_possible to i_possible.

write ‘P5’ to wa_possible-number.
append wa_possible to i_possible.

write ‘P6’ to wa_possible-number.
append wa_possible to i_possible.

write ‘P7’ to wa_possible-number.
append wa_possible to i_possible.

write ‘P8’ to wa_possible-number.
append wa_possible to i_possible.

write ‘P9’ to wa_possible-number.
append wa_possible to i_possible.

ENDFORM. ” initialization
*eject
*&———————————————————————*
*& Form get_best_number
*&———————————————————————*
* text
*———————————————————————-*
* –> p1 text
* <– p2 text
*———————————————————————-*
FORM get_best_number.

do 9 times.

loop at i_possible into wa_possible.

read table i_options
into wa_options
with key key = wa_possible-number.

best = wa_options-one +
wa_options-two +
wa_options-three +
wa_options-four +
wa_options-five +
wa_options-six +
wa_options-seven +
wa_options-eight +
wa_options-nine .

if best gt best_save.

best_save = best.
index = wa_possible-number.

endif.

clear wa_possible.
clear best.

endloop.

enddo.

* write index if it is my go first

if user_first = ‘X’.

perform write_screen using ‘ ‘
‘ ‘
‘ ‘.

else.

perform write_screen using index
noughts
‘ ‘.

endif.

ENDFORM. ” get_best_number

*eject
*&———————————————————————*
*& Form find_best_number
*&———————————————————————*
* text
*———————————————————————-*
* –>P_WA_WIN_COMBO_ONE text
*———————————————————————-*
FORM find_best_number USING WA_WIN_COMBO.

* Look at number 1 from win combo possible
read table i_my_pick
into wa_my_pick
with key number = wa_win_combo.

* Do I already have it

if sy-subrc eq 0.

my_count = my_count + 1.

else.

* If not check if the user has it

read table i_your_pick
into wa_your_pick
with key number = wa_win_combo.

if sy-subrc ne 0.

read table i_weighting
into wa_weighting
with key number = wa_win_combo.

wa_best_for_me-importance = wa_weighting-rank +
wa_best_for_me-importance.
if wa_weighting-rank ge importance_save_me.

importance_save_me = wa_weighting-rank.

wa_best_for_me-best_number = wa_win_combo.

endif.

wa_best_for_you-importance = wa_weighting-rank +
wa_best_for_you-importance.
if wa_weighting-rank ge importance_save_you.

importance_save_you = wa_weighting-rank.

wa_best_for_you-best_number = wa_win_combo.

endif.

else.

your_count = your_count + 1.

endif.

endif.
ENDFORM. ” find_best_number

02

02 2010

SAP BW Transaction Listesi

Başlıca SAP BW Transaction kodları
BAPI   Bapi explorer   
CMOD   Project Administration of SAP Enhancements 
FILE   Maintenance of logicla file paths 
LISTCUBE  List viewer for data targets (->Basis Cubes , ODS Objects, Charachtesistics Info Objects) 
LISTSCHEMA  Schema viewer for basis cubes (includeeing aggreagtes) 
PFCG   Role maintenance 
RRC1,RRC2,RRC3  Create/Change/Display currency exchange rate definitons 
RRMX   Starting BEX Analyzer 
RS12   Displaying and deleting lock entries in tables 
RSA1   Administrator Workbench (Modelling) 
RSA11   Administrator Workbench ( ->InfoProvider ) 
RSA12   Administrator Workbench ( ->InfoSources ) 
RSA13   Administrator Workbench ( ->SourceSystems ) 
RSA14   Administrator Workbench ( ->InfoObjects ) 
RSA3   Extractor Checker sapi 3.0 
RSA5   Transferring Datasources from Business Content 
RSA6   Post Processing Datasources and component hierarchy 
RSA7   Maintaining the delta queue 
RSA9   Transferring application component from Business Content 
RSBBS   Maintaining jumps for the RRI (Report to Report Interface) 
RSCUSTV1  Modifying the settting of flat files (-> Thousand, decimal and field seperators as well as field delimeters) 
RSCUSTV6  Modifying the threshold values for data loading processes (-> Package size, PSA partition size, frequency status IDOC)
RSCUSTV8  Changing the aggreagate change run settings (Threshold value for rebuild, block size) 
RSD1, RSD2, RSD3  Maintaining InfoObjects of Characteristics/Key Figures/Unit Types) 
RSD4, RSD5  Processing technical and time characteristics 
RSDBC   DB connect: Selecting tables and views 
RSDDV   Maintaining aggreates 
RSDIOBC  Editing InfoObjectCatalogs 
RSDMD   Maintiaiing master data for a characteristic 
RSDMPROM  Maintiaing multi providers 
RSDODS   Editing ODS Objects 
RSDV   Maintaiing the validity slice (->Basic cubes containşng key figures of non-cumulative value type 
RSFH   Testing tool for transaciton-data extractors 
RSIMG   BW Customizing gudelines 
RSISET   Maintenance of InfoSets 
RSKC   Maintenace of additional charachters allowed in BW 
RSMD   Testing tool for master-data extractors 
RSMO   Monitor 
RSMON   Administrator Workbench monitor 
RSMONCOLOR  Valuation of requests 
RSO2   Maintenance of generic datasources 
RSO3   Setting up of delta extraction for attributes and texts 
RSOR   Administration workbench (->Metadata Repository) 
RSORBCT  Administration workbench (->Business Content) 
RSPC   Maintenance of Process Chains 
RSRT   Query monitor 
RSRTRACE  Query trace 
RSRV   Analysis and repair of BW Objects 
RSSM   Maintenance of reporting authorization objects obsolote use RSECADMIN
RSU1,RSU2, RSU3 Create view change update rules (-> Basic Cubes and ODS Objects) 
SARA   Arrchive Administration 
SBIW   Viewing the guidelines (->Customizing Extractors) 
SE03   Transport organizor tools 
SICF   System Internet Communication Framework Mainteannce 
sM12   Lock entries 
SM21   Online evaluation system log 
SM59   Maintenance of RFC connections 
sm62    maintenance of events 
sm66   global work process overwiev 
SMX   system -> own jobs 
SQ02   sap query /ınfo Sets Maintenance 
SQ10   Assigning Query/ınfosets to user and role 
ST03   BW statistics 
ST05    performance analysis 
SU24   Maintenance of role templates 
SU53   resolving error codes at the authprization level 
TRSA   Testitng tool service API 
LBWE   Logistic extract structures customizing cockpit 
KEBO   Create view delete CO-PA Datasource 
RSA 
SMQ1   qrfc monitor (outbound queue)

02

02 2010