*&---------------------------------------------------------------------* *& Report Z_LINES * *&---------------------------------------------------------------------* *& Copyright 1998-1999 * *& ABAP-Version 2000 * *&---------------------------------------------------------------------* REPORT z_lines. * Eventhandler CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. CLASS-METHODS: on_control_click FOR EVENT control_click OF cl_gui_picture IMPORTING sender. ENDCLASS. * register events at control framework DATA events TYPE cntl_simple_events. DATA wa_events TYPE cntl_simple_event. TYPES: BEGIN OF boardline, ref_picture TYPE REF TO cl_gui_picture, index TYPE i, row TYPE i, column TYPE i, ref_container type ref to cl_gui_container, icon(4), END OF boardline, BEGIN OF koordinates, index TYPE i, row TYPE i, column TYPE i, END OF koordinates, BEGIN OF boardstatus, status(1), END OF boardstatus, BEGIN OF highscoreline, no(2), name(12), date(10), time(5), score(6), END OF highscoreline. DATA: it_board TYPE TABLE OF boardline. DATA: wa_board LIKE LINE OF it_board. DATA: wa_cell_from LIKE LINE OF it_board. DATA: wa_cell_to LIKE LINE OF it_board. DATA: wa_neighbour LIKE LINE OF it_board. DATA: it_freecells TYPE TABLE OF boardline. DATA: it_pattern TYPE TABLE OF boardline. DATA: it_moveable TYPE TABLE OF boardstatus. DATA: wa_moveable LIKE LINE OF it_moveable. DATA: it_to_be_checked TYPE TABLE OF koordinates. DATA: wa_to_be_checked LIKE LINE OF it_to_be_checked. DATA: l_to_be_checked LIKE wa_board-index. DATA: lc_icon(4). DATA: score TYPE i. DATA: oldscore TYPE i. DATA first_supply. DATA objects_created. DATA container TYPE REF TO cl_gui_custom_container. DATA splitter TYPE REF TO cl_gui_splitter_container. DATA from_clicked TYPE REF TO cl_gui_picture. DATA to_clicked TYPE REF TO cl_gui_picture. DATA event_handler TYPE REF TO lcl_event_handler. DATA it_highscore TYPE TABLE OF highscoreline. DATA wa_highscore LIKE LINE OF it_highscore. DATA tx_container TYPE REF TO cl_gui_custom_container. DATA tx_editor TYPE REF TO cl_gui_textedit. DATA tx_header TYPE thead. DATA tx_lines TYPE TABLE OF tline. DATA wa_lines LIKE LINE OF tx_lines. DATA pv1_container TYPE REF TO cl_gui_custom_container. DATA pv2_container TYPE REF TO cl_gui_custom_container. DATA pv3_container TYPE REF TO cl_gui_custom_container. DATA pv1 TYPE REF TO cl_gui_picture. DATA pv2 TYPE REF TO cl_gui_picture. DATA pv3 TYPE REF TO cl_gui_picture. DATA: pvi1 TYPE i. DATA: pvi2 TYPE i. DATA: pvi3 TYPE i. DATA svcode LIKE sy-ucomm. DATA okcode LIKE sy-ucomm. DATA l_counter TYPE i. * icons CONSTANTS c_icon1(4) VALUE '@03@'. CONSTANTS c_icon2(4) VALUE '@02@'. CONSTANTS c_icon3(4) VALUE '@1T@'. CONSTANTS c_icon4(4) VALUE '@KR@'. CONSTANTS c_icon5(4) VALUE '@K4@'. CONSTANTS c_icon6(4) VALUE '@5Y@'. CONSTANTS c_icon7(4) VALUE '@NR@'. * field-symbols FIELD-SYMBOLS: TYPE REF TO cl_gui_picture. START-OF-SELECTION. CALL SCREEN 100. *&---------------------------------------------------------------------* *& Module CREATE_OBJECTS OUTPUT *&---------------------------------------------------------------------* MODULE create_objects OUTPUT. CHECK objects_created IS INITIAL. objects_created = 'X'. * splittercontainer CREATE OBJECT container EXPORTING container_name = 'CONTAINER'. * splitter CREATE OBJECT splitter EXPORTING parent = container rows = 9 columns = 9 EXCEPTIONS others = 3. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. * Trenner fixieren CLEAR l_counter. DO 8 TIMES. l_counter = l_counter + 1. * Spalten CALL METHOD splitter->set_column_sash EXPORTING id = l_counter type = splitter->type_movable value = splitter->false EXCEPTIONS OTHERS = 3. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. * Zeilen CALL METHOD splitter->set_row_sash EXPORTING id = l_counter type = splitter->type_movable value = splitter->false EXCEPTIONS OTHERS = 3. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDDO. * Icon Preview CREATE OBJECT pv1_container EXPORTING container_name = 'PV1_CONTAINER'. CREATE OBJECT pv1 EXPORTING parent = pv1_container. CREATE OBJECT pv2_container EXPORTING container_name = 'PV2_CONTAINER'. CREATE OBJECT pv2 EXPORTING parent = pv2_container. CREATE OBJECT pv3_container EXPORTING container_name = 'PV3_CONTAINER'. CREATE OBJECT pv3 EXPORTING parent = pv3_container. * Highscore-Table PERFORM read_highscore. CREATE OBJECT tx_container EXPORTING container_name = 'TX_CONTAINER'. CREATE OBJECT tx_editor EXPORTING parent = tx_container wordwrap_mode = cl_gui_textedit=>wordwrap_at_fixed_position wordwrap_position = 42 wordwrap_to_linebreak_mode = cl_gui_textedit=>true. CALL METHOD tx_editor->set_text_as_r3table EXPORTING table = tx_lines. CALL METHOD tx_editor->set_toolbar_mode EXPORTING toolbar_mode = tx_editor->false. CALL METHOD tx_editor->set_statusbar_mode EXPORTING statusbar_mode = tx_editor->false. CALL METHOD tx_editor->set_readonly_mode EXPORTING readonly_mode = tx_editor->true. PERFORM board_init. PERFORM supply_new_icons. ENDMODULE. " CREATE_OBJECTS OUTPUT *&---------------------------------------------------------------------* *& Module SAVE_OKCODE INPUT *&---------------------------------------------------------------------* MODULE save_okcode INPUT. svcode = okcode. CLEAR okcode. ENDMODULE. " SAVE_OKCODE INPUT *&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------* MODULE user_command INPUT. CASE svcode. WHEN 'BACK'. PERFORM housekeeping. SET SCREEN 0. ENDCASE. ENDMODULE. " USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------* *& Module EXIT INPUT *&---------------------------------------------------------------------* MODULE exit INPUT. CASE okcode. WHEN 'EXIT'. PERFORM housekeeping. LEAVE PROGRAM. WHEN 'CANCEL'. PERFORM housekeeping. SET SCREEN 0. ENDCASE. ENDMODULE. " EXIT INPUT *&---------------------------------------------------------------------* *& Module STATUS_100 OUTPUT *&---------------------------------------------------------------------* MODULE status_100 OUTPUT. SET PF-STATUS 'BASE'. SET TITLEBAR 'BAS'. ENDMODULE. " STATUS_100 OUTPUT *&---------------------------------------------------------------------* *& Form SHOW_CELL *&---------------------------------------------------------------------* FORM show_cell USING p_row p_column p_container type ref to cl_gui_container p_picture type ref to cl_gui_picture p_icon. CASE p_icon. WHEN 1. lc_icon = c_icon1. WHEN 2. lc_icon = c_icon2. WHEN 3. lc_icon = c_icon3. WHEN 4. lc_icon = c_icon4. WHEN 5. lc_icon = c_icon5. WHEN 6. lc_icon = c_icon6. WHEN 7. lc_icon = c_icon7. ENDCASE. CALL METHOD splitter->get_container EXPORTING row = p_row column = p_column RECEIVING container = p_container. IF p_picture IS INITIAL. CREATE OBJECT p_picture EXPORTING parent = p_container. * register events wa_events-eventid = p_picture->eventid_control_click. APPEND wa_events TO events. CALL METHOD p_picture->set_registered_events EXPORTING events = events. SET HANDLER event_handler->on_control_click FOR p_picture. ENDIF. IF NOT p_icon IS INITIAL. CALL METHOD p_picture->load_picture_from_sap_icons EXPORTING icon = lc_icon. CALL METHOD p_picture->set_display_mode EXPORTING display_mode = cl_gui_picture=>display_mode_fit_center. ENDIF. ENDFORM. " SHOW_CELL *---------------------------------------------------------------------* * CLASS lcl_event_handler IMPLEMENTATION *---------------------------------------------------------------------* CLASS lcl_event_handler IMPLEMENTATION. METHOD on_control_click. * from_clicked IF from_clicked IS INITIAL. READ TABLE it_freecells INTO wa_cell_from WITH KEY ref_picture = sender. IF sy-subrc <> 0. CALL METHOD sender->set_display_mode EXPORTING display_mode = cl_gui_picture=>display_mode_normal_center. from_clicked = sender. ENDIF. ELSE. CHECK sender <> from_clicked. * to_clicked to_clicked = sender. READ TABLE it_freecells INTO wa_cell_to WITH KEY ref_picture = to_clicked. * cell free ? IF sy-subrc EQ 0. READ TABLE it_board INTO wa_cell_from WITH KEY ref_picture = from_clicked. PERFORM check_move. READ TABLE it_moveable INTO wa_moveable INDEX wa_cell_to-index. * legal move IF wa_moveable-status = space. PERFORM move_icon. oldscore = score. PERFORM check_pattern. IF score = oldscore. PERFORM supply_new_icons. ELSE. * cause field transport when scored CALL METHOD cl_gui_cfw=>set_new_ok_code EXPORTING new_code = 'ENTE'. ENDIF. CLEAR: from_clicked, to_clicked. ENDIF. ELSE. * to_clicked become from_clicked CALL METHOD to_clicked->set_display_mode EXPORTING display_mode = cl_gui_picture=>display_mode_normal_center. CALL METHOD from_clicked->set_display_mode EXPORTING display_mode = cl_gui_picture=>display_mode_fit_center. from_clicked = to_clicked. ENDIF. ENDIF. ENDMETHOD. ENDCLASS. *&---------------------------------------------------------------------* *& Form BOARD_INIT *&---------------------------------------------------------------------* FORM board_init. l_counter = 1. DO 81 TIMES. CLEAR wa_board. wa_board-index = l_counter. wa_board-column = l_counter MOD 9. wa_board-row = ( l_counter DIV 9 ) + 1. IF wa_board-column = 0. wa_board-column = 9. wa_board-row = wa_board-row - 1. ENDIF. PERFORM show_cell USING wa_board-row wa_board-column wa_board-ref_container wa_board-ref_picture space. APPEND wa_board TO it_board. APPEND wa_board TO it_freecells. l_counter = l_counter + 1. ENDDO. ENDFORM. " BOARD_INIT *&---------------------------------------------------------------------* *& Form SUPPLY_NEW_ICONS *&---------------------------------------------------------------------* FORM supply_new_icons. DATA: l_random_icon TYPE i, l_random_cell TYPE i, l_no_new_icons TYPE i, l_no_freecells TYPE i. DESCRIBE TABLE it_freecells LINES l_no_freecells. IF first_supply EQ space. l_no_new_icons = 5. ELSE. l_no_new_icons = 3. ENDIF. IF l_no_new_icons > l_no_freecells. l_no_new_icons = l_no_freecells. ENDIF. WHILE l_no_new_icons > 0. IF first_supply = space. * random selection of icon (1-7) CALL FUNCTION 'QF05_RANDOM_INTEGER' EXPORTING ran_int_max = 7 ran_int_min = 1 IMPORTING ran_int = l_random_icon. ELSE. CASE l_no_new_icons. WHEN 1. l_random_icon = pvi1. WHEN 2. l_random_icon = pvi2. WHEN 3. l_random_icon = pvi3. ENDCASE. ENDIF. * random selection of freecells (1-l_no_freecells) CALL FUNCTION 'QF05_RANDOM_INTEGER' EXPORTING ran_int_max = l_no_freecells ran_int_min = 1 IMPORTING ran_int = l_random_cell. * read/update freecells and board READ TABLE it_freecells INTO wa_board INDEX l_random_cell. * delete entry in freecells DELETE it_freecells INDEX sy-tabix. wa_board-icon = l_random_icon. MODIFY it_board FROM wa_board INDEX wa_board-index. * show new icon PERFORM show_cell USING wa_board-row wa_board-column wa_board-ref_container wa_board-ref_picture wa_board-icon. * check pattern READ TABLE it_board INTO wa_cell_to INDEX wa_board-index. PERFORM check_pattern. * check game over DESCRIBE TABLE it_freecells LINES l_no_freecells. IF l_no_freecells = 0. PERFORM game_over. ENDIF. l_no_new_icons = l_no_new_icons - 1. ENDWHILE. first_supply = 'X'. * Preview next 3 icons l_counter = 1. DO 3 TIMES. * random selection of icon (1-7) CALL FUNCTION 'QF05_RANDOM_INTEGER' EXPORTING ran_int_max = 7 ran_int_min = 1 IMPORTING ran_int = l_random_icon. CASE l_counter. WHEN 1. ASSIGN pv1 TO . pvi1 = l_random_icon. WHEN 2. ASSIGN pv2 TO . pvi2 = l_random_icon. WHEN 3. ASSIGN pv3 TO . pvi3 = l_random_icon. ENDCASE. CASE l_random_icon. WHEN 1. lc_icon = c_icon1. WHEN 2. lc_icon = c_icon2. WHEN 3. lc_icon = c_icon3. WHEN 4. lc_icon = c_icon4. WHEN 5. lc_icon = c_icon5. WHEN 6. lc_icon = c_icon6. WHEN 7. lc_icon = c_icon7. ENDCASE. CALL METHOD ->load_picture_from_sap_icons EXPORTING icon = lc_icon. CALL METHOD ->set_display_mode EXPORTING display_mode = cl_gui_picture=>display_mode_fit_center. l_counter = l_counter + 1. ENDDO. ENDFORM. " SUPPLY_NEW_ICONS *&---------------------------------------------------------------------* *& Form GAME_OVER *&---------------------------------------------------------------------* FORM game_over. DATA: l_no TYPE i. DATA: l_hs TYPE i. DATA: new_highscore(1). * New Highscore ? PERFORM read_highscore. l_counter = 5. l_no = 1. LOOP AT it_highscore INTO wa_highscore. READ TABLE tx_lines INTO wa_lines INDEX l_counter. IF score > wa_highscore-score AND new_highscore <> 'X'. new_highscore = 'X'. WRITE l_no NO-SIGN TO wa_lines-tdline(2). wa_lines-tdline+4(12) = sy-uname. WRITE sy-datum DD/MM/YYYY TO wa_lines-tdline+17(10). WRITE sy-uzeit(5) USING EDIT MASK '__:__' TO wa_lines-tdline+28(5) . WRITE score NO-SIGN TO wa_lines-tdline+34(6). l_hs = l_no. l_no = l_no + 1. MODIFY tx_lines FROM wa_lines INDEX l_counter. l_counter = l_counter + 1. ENDIF. CHECK l_no < 31. WRITE l_no NO-SIGN TO wa_lines-tdline(2). wa_lines-tdline+4(12) = wa_highscore-name. wa_lines-tdline+17(10) = wa_highscore-date. wa_lines-tdline+28(5) = wa_highscore-time. wa_lines-tdline+34(6) = wa_highscore-score. MODIFY tx_lines FROM wa_lines INDEX l_counter. l_counter = l_counter + 1. l_no = l_no + 1. ENDLOOP. IF new_highscore = 'X'. CALL FUNCTION 'SAVE_TEXT' EXPORTING header = tx_header TABLES lines = tx_lines EXCEPTIONS OTHERS = 5. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. CALL METHOD tx_editor->set_text_as_r3table EXPORTING table = tx_lines. MESSAGE i319(01) WITH 'New Highscore' 'No.' l_hs. ENDIF. CALL SCREEN 105 STARTING AT 10 10. LEAVE TO SCREEN 0. ENDFORM. " GAME_OVER *&---------------------------------------------------------------------* *& Form MOVE_ICON *&---------------------------------------------------------------------* FORM move_icon. * kill cell_to from freecells DELETE it_freecells WHERE index = wa_cell_to-index. * handling of cell_from CALL METHOD from_clicked->clear_picture. wa_cell_to-icon = wa_cell_from-icon. CLEAR wa_cell_from-icon. MODIFY it_board FROM wa_cell_from INDEX wa_cell_from-index. APPEND wa_cell_from TO it_freecells. * handling of cell_to (buffered in wa_board) MODIFY it_board FROM wa_cell_to INDEX wa_cell_to-index. PERFORM show_cell USING wa_cell_to-row wa_cell_to-column wa_cell_to-ref_container wa_cell_to-ref_picture wa_cell_to-icon. ENDFORM. " MOVE_ICON *&---------------------------------------------------------------------* *& Form CHECK_PATTERN *&---------------------------------------------------------------------* FORM check_pattern. data: l_column type i. * horizontal check * check to the left l_to_be_checked = wa_cell_to-index - 1. DO. READ TABLE it_board INTO wa_neighbour INDEX l_to_be_checked. IF wa_cell_to-icon = wa_neighbour-icon AND wa_cell_to-row = wa_neighbour-row AND sy-subrc = 0. APPEND wa_neighbour TO it_pattern. l_to_be_checked = wa_neighbour-index - 1. ELSE. EXIT. ENDIF. ENDDO. * check to the right l_to_be_checked = wa_cell_to-index + 1. DO. READ TABLE it_board INTO wa_neighbour INDEX l_to_be_checked. IF wa_cell_to-icon = wa_neighbour-icon AND wa_cell_to-row = wa_neighbour-row AND sy-subrc = 0. l_to_be_checked = wa_neighbour-index + 1. APPEND wa_neighbour TO it_pattern. ELSE. EXIT. ENDIF. ENDDO. perform pattern_found. * vertical check * check upward l_to_be_checked = wa_cell_to-index - 9. DO. READ TABLE it_board INTO wa_neighbour INDEX l_to_be_checked. IF wa_cell_to-icon = wa_neighbour-icon AND wa_cell_to-column = wa_neighbour-column AND sy-subrc = 0. APPEND wa_neighbour TO it_pattern. l_to_be_checked = wa_neighbour-index - 9. ELSE. EXIT. ENDIF. ENDDO. * check down l_to_be_checked = wa_cell_to-index + 9. DO. READ TABLE it_board INTO wa_neighbour INDEX l_to_be_checked. IF wa_cell_to-icon = wa_neighbour-icon AND wa_cell_to-column = wa_neighbour-column AND sy-subrc = 0. l_to_be_checked = wa_neighbour-index + 9. APPEND wa_neighbour TO it_pattern. ELSE. EXIT. ENDIF. ENDDO. perform pattern_found. * diagonal1 check * check leftup l_to_be_checked = wa_cell_to-index - 10. l_column = wa_cell_to-column - 1. DO. READ TABLE it_board INTO wa_neighbour INDEX l_to_be_checked. IF wa_cell_to-icon = wa_neighbour-icon AND sy-subrc = 0 and l_column > 0. APPEND wa_neighbour TO it_pattern. l_to_be_checked = wa_neighbour-index - 10. l_column = l_column - 1. ELSE. EXIT. ENDIF. ENDDO. * check rightdown l_to_be_checked = wa_cell_to-index + 10. l_column = wa_cell_to-column + 1. DO. READ TABLE it_board INTO wa_neighbour INDEX l_to_be_checked. IF wa_cell_to-icon = wa_neighbour-icon AND sy-subrc = 0 and l_column <= 9. APPEND wa_neighbour TO it_pattern. l_to_be_checked = wa_neighbour-index + 10. l_column = l_column + 1. ELSE. EXIT. ENDIF. ENDDO. perform pattern_found. * diagonal2 check * check rightup l_to_be_checked = wa_cell_to-index - 8. l_column = wa_cell_to-column + 1. DO. READ TABLE it_board INTO wa_neighbour INDEX l_to_be_checked. IF wa_cell_to-icon = wa_neighbour-icon AND sy-subrc = 0 and l_column <= 9. APPEND wa_neighbour TO it_pattern. l_to_be_checked = wa_neighbour-index - 8. l_column = l_column + 1. ELSE. EXIT. ENDIF. ENDDO. * check leftdown l_to_be_checked = wa_cell_to-index + 8. l_column = wa_cell_to-column - 1. DO. READ TABLE it_board INTO wa_neighbour INDEX l_to_be_checked. IF wa_cell_to-icon = wa_neighbour-icon AND sy-subrc = 0 and l_column > 0. l_to_be_checked = wa_neighbour-index + 8. APPEND wa_neighbour TO it_pattern. l_column = l_column - 1. ELSE. EXIT. ENDIF. ENDDO. perform pattern_found. * delete moved icon IF score <> oldscore. APPEND wa_cell_to TO it_pattern. LOOP AT it_pattern INTO wa_neighbour. CALL METHOD wa_neighbour-ref_picture->clear_picture. CLEAR wa_neighbour-icon. MODIFY it_board FROM wa_neighbour INDEX wa_neighbour-index. APPEND wa_neighbour TO it_freecells. score = score + 1. ENDLOOP. REFRESH it_pattern. ENDIF. ENDFORM. " CHECK_PATTERN *&---------------------------------------------------------------------* *& Form CHECK_MOVE *&---------------------------------------------------------------------* FORM check_move. * initialize tables REFRESH: it_to_be_checked, it_moveable. DO 81 TIMES. wa_moveable-status = 'I'. APPEND wa_moveable TO it_moveable. ENDDO. wa_moveable-status = 'X'. MODIFY it_moveable FROM wa_moveable INDEX wa_cell_from-index. l_counter = 1. wa_to_be_checked-index = wa_cell_from-index. wa_to_be_checked-row = wa_cell_from-row. wa_to_be_checked-column = wa_cell_from-column. APPEND wa_to_be_checked TO it_to_be_checked. WHILE l_counter > 0. * to the right READ TABLE it_to_be_checked INTO wa_to_be_checked INDEX 1. l_to_be_checked = wa_to_be_checked-index - 1. READ TABLE it_moveable INTO wa_moveable INDEX l_to_be_checked. IF wa_moveable-status = 'I'. READ TABLE it_board INTO wa_neighbour INDEX l_to_be_checked. IF sy-subrc = 0 AND wa_neighbour-icon IS INITIAL AND wa_to_be_checked-row = wa_neighbour-row. wa_moveable-status = space. wa_to_be_checked-index = l_to_be_checked. wa_to_be_checked-row = wa_neighbour-row. wa_to_be_checked-column = wa_neighbour-column. APPEND wa_to_be_checked TO it_to_be_checked. ELSE. IF wa_to_be_checked-row = wa_neighbour-row. wa_moveable-status = 'X'. ENDIF. ENDIF. IF l_to_be_checked > 0 AND l_to_be_checked < 82. MODIFY it_moveable FROM wa_moveable INDEX l_to_be_checked. ENDIF. ENDIF. * to the left READ TABLE it_to_be_checked INTO wa_to_be_checked INDEX 1. l_to_be_checked = wa_to_be_checked-index + 1. READ TABLE it_moveable INTO wa_moveable INDEX l_to_be_checked. IF wa_moveable-status = 'I'. READ TABLE it_board INTO wa_neighbour INDEX l_to_be_checked. IF sy-subrc = 0 AND wa_neighbour-icon IS INITIAL AND wa_to_be_checked-row = wa_neighbour-row. wa_moveable-status = space. wa_to_be_checked-index = l_to_be_checked. wa_to_be_checked-row = wa_neighbour-row. wa_to_be_checked-column = wa_neighbour-column. APPEND wa_to_be_checked TO it_to_be_checked. ELSE. IF wa_to_be_checked-row = wa_neighbour-row. wa_moveable-status = 'X'. ENDIF. ENDIF. IF l_to_be_checked > 0 AND l_to_be_checked < 82. MODIFY it_moveable FROM wa_moveable INDEX l_to_be_checked. ENDIF. ENDIF. * upward READ TABLE it_to_be_checked INTO wa_to_be_checked INDEX 1. l_to_be_checked = wa_to_be_checked-index - 9. READ TABLE it_moveable INTO wa_moveable INDEX l_to_be_checked. IF wa_moveable-status = 'I'. READ TABLE it_board INTO wa_neighbour INDEX l_to_be_checked. IF sy-subrc = 0 AND wa_neighbour-icon IS INITIAL. wa_moveable-status = space. wa_to_be_checked-index = l_to_be_checked. wa_to_be_checked-row = wa_neighbour-row. wa_to_be_checked-column = wa_neighbour-column. APPEND wa_to_be_checked TO it_to_be_checked. ELSE. wa_moveable-status = 'X'. ENDIF. IF l_to_be_checked > 0 AND l_to_be_checked < 82. MODIFY it_moveable FROM wa_moveable INDEX l_to_be_checked. ENDIF. ENDIF. * downward READ TABLE it_to_be_checked INTO wa_to_be_checked INDEX 1. l_to_be_checked = wa_to_be_checked-index + 9. READ TABLE it_moveable INTO wa_moveable INDEX l_to_be_checked. IF wa_moveable-status = 'I'. READ TABLE it_board INTO wa_neighbour INDEX l_to_be_checked. IF sy-subrc = 0 AND wa_neighbour-icon IS INITIAL. wa_moveable-status = space. wa_to_be_checked-index = l_to_be_checked. wa_to_be_checked-row = wa_neighbour-row. wa_to_be_checked-column = wa_neighbour-column. APPEND wa_to_be_checked TO it_to_be_checked. ELSE. wa_moveable-status = 'X'. ENDIF. IF l_to_be_checked > 0 AND l_to_be_checked < 82. MODIFY it_moveable FROM wa_moveable INDEX l_to_be_checked. ENDIF. ENDIF. DELETE it_to_be_checked INDEX 1. DESCRIBE TABLE it_to_be_checked LINES l_counter. ENDWHILE. ENDFORM. " CHECK_MOVE *&---------------------------------------------------------------------* *& Form read_highscore *&---------------------------------------------------------------------* FORM read_highscore. REFRESH it_highscore. tx_header-tdobject = 'TEXT'. tx_header-tdname = sy-repid. tx_header-tdid = 'ST'. tx_header-tdspras = 'DE'. tx_header-tdlinesize = 42. CALL FUNCTION 'READ_TEXT' EXPORTING id = tx_header-tdid language = tx_header-tdspras name = tx_header-tdname object = tx_header-tdobject TABLES lines = tx_lines EXCEPTIONS not_found = 4 OTHERS = 8. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. LOOP AT tx_lines INTO wa_lines. IF sy-tabix > 4. CLEAR wa_highscore. wa_highscore-no = wa_lines-tdline(2). wa_highscore-name = wa_lines-tdline+4(12). wa_highscore-date = wa_lines-tdline+17(10). wa_highscore-time = wa_lines-tdline+28(5). wa_highscore-score = wa_lines-tdline+34(6). APPEND wa_highscore TO it_highscore. ENDIF. ENDLOOP. ENDFORM. " read_highscore *&---------------------------------------------------------------------* *& Form housekeeping *&---------------------------------------------------------------------* FORM housekeeping. LOOP AT it_board INTO wa_board. IF NOT wa_board-ref_picture IS INITIAL. CALL METHOD wa_board-ref_picture->free. ENDIF. CALL METHOD wa_board-ref_container->free. ENDLOOP. CALL METHOD pv1->free. CALL METHOD pv1_container->free. CALL METHOD pv2->free. CALL METHOD pv2_container->free. CALL METHOD pv3->free. CALL METHOD pv3_container->free. CALL METHOD tx_editor->free. CALL METHOD tx_container->free. ENDFORM. " housekeeping *&---------------------------------------------------------------------* *& Form PATTERN_FOUND *&---------------------------------------------------------------------* form pattern_found. * pattern found ? DESCRIBE TABLE it_pattern LINES l_counter. IF l_counter >= 4. * normal LOOP AT it_pattern INTO wa_neighbour. CALL METHOD wa_neighbour-ref_picture->set_display_mode EXPORTING display_mode = cl_gui_picture=>display_mode_normal_center. ENDLOOP. call method cl_gui_cfw=>update_view. wait up to 1 seconds. * hide LOOP AT it_pattern INTO wa_neighbour. CALL METHOD wa_neighbour-ref_picture->clear_picture. CLEAR wa_neighbour-icon. MODIFY it_board FROM wa_neighbour INDEX wa_neighbour-index. APPEND wa_neighbour TO it_freecells. score = score + 1. ENDLOOP. ENDIF. REFRESH it_pattern. endform. " PATTERN_FOUND