Pages

Wednesday, January 19, 2011

Game - Minehunter

Need to create screens for this program to run.


"
*&---------------------------------------------------------------------*
*& Report ZRR_MINEHUNT *
*&---------------------------------------------------------------------*
*& ABAP-Version Oktober 2000 Ralf Rubel *
**&---------------------------------------------------------------------
REPORT ZAGS_102.
* Eventhandler
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
CLASS-METHODS: on_control_click FOR EVENT control_click OF
cl_gui_picture
IMPORTING sender.
ENDCLASS. "lcl_event_handler DEFINITION
* register events at control framework
DATA events TYPE cntl_simple_events.
DATA wa_events TYPE cntl_simple_event.

TYPES:
lty_tdline(132),
BEGIN OF boardline,
picture TYPE REF TO cl_gui_picture,
container TYPE REF TO cl_gui_container,
index TYPE i,
row TYPE i,
column TYPE i,
icon(4),
status(1),
visible(1),
END OF boardline,
BEGIN OF highscoreline,
no(2),
name(12),
date(10),
time(5),
score TYPE i,
END OF highscoreline.

DATA: it_board TYPE TABLE OF boardline.
DATA: wa_board TYPE boardline.
DATA: wa_check TYPE boardline.
DATA: it_to_be_checked TYPE TABLE OF i.
DATA: wa_to_be_checked TYPE i.

DATA: it_freecells TYPE TABLE OF boardline.
DATA: score TYPE i.
DATA: l_start(11) TYPE p DECIMALS 7.
DATA: l_stop(11) TYPE p DECIMALS 7.

DATA objects_created.
DATA replay.
DATA container TYPE REF TO cl_gui_custom_container.
DATA splitter TYPE REF TO cl_gui_splitter_container.
DATA event_handler TYPE REF TO lcl_event_handler.

DATA mines_left TYPE i.
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_lines TYPE TABLE OF lty_tdline.
DATA wa_lines LIKE LINE OF tx_lines.

DATA svcode LIKE sy-ucomm.
DATA okcode LIKE sy-ucomm.
DATA l_counter TYPE i.
DATA l_index TYPE i.
DATA l_row TYPE i.
DATA ax_container TYPE REF TO cl_gui_custom_container.
DATA ax_picture TYPE REF TO cl_gui_picture.
DATA ax_clicked(1).
DATA l_succeeded(1).

* board constants
DATA gf_tdname(20) TYPE c.
DATA gf_rows TYPE i.
DATA gf_columns TYPE i.
DATA gf_cells TYPE i. "row*columns
DATA gf_bombs TYPE i.

* icons
CONSTANTS c_bomb(4) VALUE '@9Y@'.
CONSTANTS c_flag(4) VALUE '@5Y@'.
CONSTANTS c_wrong(4) VALUE '@2B@'.
CONSTANTS c_blank(4) VALUE '@5D@'.
CONSTANTS c_icon1(4) VALUE '@KW@'.
CONSTANTS c_icon2(4) VALUE '@KX@'.
CONSTANTS c_icon3(4) VALUE '@KY@'.
CONSTANTS c_icon4(4) VALUE '@KZ@'.
CONSTANTS c_icon5(4) VALUE '@L0@'.
CONSTANTS c_iconx(4) VALUE '@1I@'.

* Selection-Screen
SELECTION-SCREEN BEGIN OF BLOCK level WITH FRAME TITLE text-lev.

PARAMETERS: easy RADIOBUTTON GROUP radi DEFAULT 'X',
medium RADIOBUTTON GROUP radi,
hard RADIOBUTTON GROUP radi.
SELECTION-SCREEN END OF BLOCK level.


START-OF-SELECTION.

* set level dependent variables
IF easy <> space.
gf_tdname = 'MINEHUNT_E'.
gf_rows = 10.
gf_columns = 11.
gf_cells = 110. "row*columns
gf_bombs = 20.
ELSEIF medium <> space.
gf_tdname = 'MINEHUNT_M'.
gf_rows = 13.
gf_columns = 13.
gf_cells = 169. "row*columns
gf_bombs = 40.
ELSE.
gf_tdname = 'MINEHUNT_H'.
gf_rows = 16.
gf_columns = 16.
gf_cells = 256. "row*columns
gf_bombs = 80.
ENDIF.

CALL SCREEN 100.

*&---------------------------------------------------------------------*
*& Module CREATE_OBJECTS OUTPUT
*&---------------------------------------------------------------------*
MODULE create_objects OUTPUT.
CHECK objects_created IS INITIAL.
objects_created = 'X'.

* Init Random Generator
PERFORM init_randomizer.
* splittercontainer
CREATE OBJECT container
EXPORTING
container_name = 'CONTAINER'.
* splitter
CREATE OBJECT splitter
EXPORTING
parent = container
rows = gf_rows
columns = gf_columns
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.
* fixing seperators
CLEAR l_counter.
DO gf_rows TIMES.
l_counter = l_counter + 1.
* columns
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.
* rows
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.

* Action-Control
CREATE OBJECT ax_container
EXPORTING
container_name = 'AX_CONTAINER'.
CREATE OBJECT ax_picture
EXPORTING
parent = ax_container.
* register events
wa_events-eventid = ax_picture->eventid_control_click.
APPEND wa_events TO events.
CALL METHOD ax_picture->set_registered_events
EXPORTING
events = events.
SET HANDLER event_handler->on_control_click FOR ax_picture.
CALL METHOD ax_picture->load_picture_from_sap_icons
EXPORTING
icon = c_flag.
CALL METHOD ax_picture->set_display_mode
EXPORTING
display_mode = cl_gui_picture=>display_mode_fit_center.

* 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.
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.
WHEN 'NEWG'.
PERFORM board_init.
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.

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 = p_icon.

CALL METHOD p_picture->set_display_mode
EXPORTING
display_mode = cl_gui_picture=>display_mode_fit_center.

ELSE.
CALL METHOD p_picture->clear_picture.
ENDIF.

ENDFORM. " SHOW_CELL

*---------------------------------------------------------------------*
* CLASS lcl_event_handler IMPLEMENTATION
*---------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.
METHOD on_control_click.

* action_clicked
IF sender = ax_picture.

IF ax_clicked IS INITIAL.
CALL METHOD sender->set_display_mode
EXPORTING
display_mode = cl_gui_picture=>display_mode_normal_center.
ax_clicked = 'X'.
ELSE.
CALL METHOD sender->set_display_mode
EXPORTING
display_mode = cl_gui_picture=>display_mode_fit_center.
CLEAR ax_clicked.
ENDIF.

ELSE.

READ TABLE it_board INTO wa_board
WITH KEY picture = sender.

* unflag
IF wa_board-icon = c_flag.
CASE wa_board-status.
WHEN '0'.
wa_board-icon = c_blank.
WHEN '1'.
wa_board-icon = c_icon1.
WHEN '2'.
wa_board-icon = c_icon2.
WHEN '3'.
wa_board-icon = c_icon3.
WHEN '4'.
wa_board-icon = c_icon4.
WHEN '5'.
wa_board-icon = c_icon5.
WHEN '6' OR '7' OR '8'.
wa_board-icon = c_iconx.
WHEN 'B'.
wa_board-icon = c_bomb.
ENDCASE.
CLEAR wa_board-visible.
MODIFY it_board FROM wa_board INDEX wa_board-index.
CALL METHOD sender->clear_picture.
mines_left = mines_left + 1.
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'ENTE'.
EXIT.
ENDIF.

CHECK wa_board-visible IS INITIAL.

* set flag
IF ax_clicked = 'X'.
wa_board-visible = 'X'.
wa_board-icon = c_flag.
mines_left = mines_left - 1.
* cause field transport
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'ENTE'.

CALL METHOD ax_picture->set_display_mode
EXPORTING
display_mode = cl_gui_picture=>display_mode_fit_center.
CLEAR ax_clicked.
ELSE.
CASE wa_board-status.
WHEN 'B'.
* game lost
l_counter = 1.
DO gf_cells TIMES.
READ TABLE it_board INTO wa_board INDEX l_counter.
IF wa_board-status = 'B'.
PERFORM show_cell USING wa_board-row wa_board-column
wa_board-container wa_board-picture wa_board-icon.
ELSE.
* flag, but no bomb
IF wa_board-icon = c_flag.
wa_board-icon = c_wrong.
PERFORM show_cell USING wa_board-row wa_board-column
wa_board-container wa_board-picture wa_board-icon.
ENDIF.
ENDIF.
l_counter = l_counter + 1.
ENDDO.
CALL METHOD cl_gui_cfw=>update_view.

MESSAGE i319(01) WITH 'Kawoom!!! ...and Game Over'.

PERFORM board_init.
EXIT.
WHEN '0'.
* uncover
PERFORM show_cell USING wa_board-row wa_board-column
wa_board-container wa_board-picture wa_board-icon.
REFRESH it_to_be_checked.
wa_to_be_checked = wa_board-index.
APPEND wa_to_be_checked TO it_to_be_checked.
l_counter = 1.

WHILE l_counter > 0.
READ TABLE it_to_be_checked INTO wa_to_be_checked INDEX 1.
READ TABLE it_board INTO wa_board
INDEX wa_to_be_checked.
wa_board-visible = 'X'.
MODIFY it_board FROM wa_board INDEX wa_board-index.

l_index = wa_board-index - 1.
l_row = wa_board-row.
READ TABLE it_board INTO wa_check
INDEX l_index.
IF sy-subrc EQ 0 AND
wa_check-visible IS INITIAL AND
wa_check-row = l_row.
IF wa_check-status = 0.
wa_to_be_checked = wa_check-index.
APPEND wa_to_be_checked TO it_to_be_checked.
ENDIF.
IF wa_check-status >= 0 AND wa_check-status <= 8.
wa_check-visible = 'X'.
MODIFY it_board FROM wa_check INDEX wa_check-index.
PERFORM show_cell USING wa_check-row wa_check-column
wa_check-container wa_check-picture wa_check-icon.
ENDIF.
ENDIF.

l_index = wa_board-index - ( gf_columns + 1 ).
l_row = wa_board-row - 1.
READ TABLE it_board INTO wa_check
INDEX l_index.
IF sy-subrc EQ 0 AND
wa_check-visible IS INITIAL AND
wa_check-row = l_row.
IF wa_check-status = 0.
wa_to_be_checked = wa_check-index.
APPEND wa_to_be_checked TO it_to_be_checked.
ENDIF.
IF wa_check-status >= 0 AND wa_check-status <= 8.
wa_check-visible = 'X'.
MODIFY it_board FROM wa_check INDEX wa_check-index.
PERFORM show_cell USING wa_check-row wa_check-column
wa_check-container wa_check-picture wa_check-icon.
ENDIF.
ENDIF.

l_index = wa_board-index - gf_columns.
l_row = wa_board-row - 1.
READ TABLE it_board INTO wa_check
INDEX l_index.
IF sy-subrc EQ 0 AND
wa_check-visible IS INITIAL AND
wa_check-row = l_row.
IF wa_check-status = 0.
wa_to_be_checked = wa_check-index.
APPEND wa_to_be_checked TO it_to_be_checked.
ENDIF.
IF wa_check-status >= 0 AND wa_check-status <= 8.
wa_check-visible = 'X'.
MODIFY it_board FROM wa_check INDEX wa_check-index.
PERFORM show_cell USING wa_check-row wa_check-column
wa_check-container wa_check-picture wa_check-icon.
ENDIF.
ENDIF.

l_index = wa_board-index - ( gf_columns - 1 ).
l_row = wa_board-row - 1.
READ TABLE it_board INTO wa_check
INDEX l_index.
IF sy-subrc EQ 0 AND
wa_check-visible IS INITIAL AND
wa_check-row = l_row.
IF wa_check-status = 0.
wa_to_be_checked = wa_check-index.
APPEND wa_to_be_checked TO it_to_be_checked.
ENDIF.
IF wa_check-status >= 0 AND wa_check-status <= 8.
wa_check-visible = 'X'.
MODIFY it_board FROM wa_check INDEX wa_check-index.
PERFORM show_cell USING wa_check-row wa_check-column
wa_check-container wa_check-picture wa_check-icon.
ENDIF.
ENDIF.

l_index = wa_board-index + 1.
l_row = wa_board-row.
READ TABLE it_board INTO wa_check
INDEX l_index.
IF sy-subrc EQ 0 AND
wa_check-visible IS INITIAL AND
wa_check-row = l_row.
IF wa_check-status = 0.
wa_to_be_checked = wa_check-index.
APPEND wa_to_be_checked TO it_to_be_checked.
ENDIF.
IF wa_check-status >= 0 AND wa_check-status <= 8.
wa_check-visible = 'X'.
MODIFY it_board FROM wa_check INDEX wa_check-index.
PERFORM show_cell USING wa_check-row wa_check-column
wa_check-container wa_check-picture wa_check-icon.
ENDIF.
ENDIF.

l_index = wa_board-index + ( gf_columns - 1 ).
l_row = wa_board-row + 1.
READ TABLE it_board INTO wa_check
INDEX l_index.
IF sy-subrc EQ 0 AND
wa_check-visible IS INITIAL AND
wa_check-row = l_row.
IF wa_check-status = 0.
wa_to_be_checked = wa_check-index.
APPEND wa_to_be_checked TO it_to_be_checked.
ENDIF.
IF wa_check-status >= 0 AND wa_check-status <= 8.
wa_check-visible = 'X'.
MODIFY it_board FROM wa_check INDEX wa_check-index.
PERFORM show_cell USING wa_check-row wa_check-column
wa_check-container wa_check-picture wa_check-icon.
ENDIF.
ENDIF.

l_index = wa_board-index + gf_columns.
l_row = wa_board-row + 1.
READ TABLE it_board INTO wa_check
INDEX l_index.
IF sy-subrc EQ 0 AND
wa_check-visible IS INITIAL AND
wa_check-row = l_row.
IF wa_check-status = 0.
wa_to_be_checked = wa_check-index.
APPEND wa_to_be_checked TO it_to_be_checked.
ENDIF.
IF wa_check-status >= 0 AND wa_check-status <= 8.
wa_check-visible = 'X'.
MODIFY it_board FROM wa_check INDEX wa_check-index.
PERFORM show_cell USING wa_check-row wa_check-column
wa_check-container wa_check-picture wa_check-icon.
ENDIF.
ENDIF.

l_index = wa_board-index + ( gf_columns + 1 ).
l_row = wa_board-row + 1.
READ TABLE it_board INTO wa_check
INDEX l_index.
IF sy-subrc EQ 0 AND
wa_check-visible IS INITIAL AND
wa_check-row = l_row.
IF wa_check-status = 0.
wa_to_be_checked = wa_check-index.
APPEND wa_to_be_checked TO it_to_be_checked.
ENDIF.
IF wa_check-status >= 0 AND wa_check-status <= 8.
wa_check-visible = 'X'.
MODIFY it_board FROM wa_check INDEX wa_check-index.
PERFORM show_cell USING wa_check-row wa_check-column
wa_check-container wa_check-picture wa_check-icon.
ENDIF.
ENDIF.

DELETE it_to_be_checked INDEX 1.
DESCRIBE TABLE it_to_be_checked LINES l_counter.

ENDWHILE.
WHEN OTHERS.
* Status 1 - 8
wa_board-visible = 'X'.
ENDCASE.
ENDIF.

PERFORM show_cell USING wa_board-row wa_board-column
wa_board-container wa_board-picture wa_board-icon.
MODIFY it_board FROM wa_board INDEX wa_board-index.

* Succeeded End
CLEAR l_succeeded.
LOOP AT it_board INTO wa_board.
IF wa_board-visible IS INITIAL.
l_succeeded = 'X'.
EXIT.
ENDIF.
ENDLOOP.
IF l_succeeded IS INITIAL.
GET TIME STAMP FIELD l_stop.
score = l_stop - l_start.
PERFORM game_succeeded.
ENDIF.
ENDIF.

ENDMETHOD. "on_control_click

ENDCLASS. "lcl_event_handler IMPLEMENTATION

*&---------------------------------------------------------------------*
*& Form BOARD_INIT
*&---------------------------------------------------------------------*
FORM board_init.
DATA: l_no_freecells TYPE i,
l_random_cell TYPE i.

DATA lt_random_numbers TYPE STANDARD TABLE OF i.

REFRESH: it_freecells.

DESCRIBE TABLE it_board.
IF sy-tfill GT 0.
replay = 'x'.
ENDIF.

l_counter = 1.
DO gf_cells TIMES.
CLEAR wa_board.

IF replay NE space.
READ TABLE it_board INDEX l_counter INTO wa_board.
CLEAR: wa_board-visible, wa_board-status, wa_board-icon.
ENDIF.

wa_board-index = l_counter.
wa_board-column = l_counter MOD gf_columns.
wa_board-row = ( l_counter DIV gf_columns ) + 1.
IF wa_board-column = 0.
wa_board-column = gf_columns.
wa_board-row = wa_board-row - 1.
ENDIF.

PERFORM show_cell USING wa_board-row wa_board-column
wa_board-container wa_board-picture space.

IF replay NE space.
MODIFY it_board FROM wa_board INDEX l_counter.
ELSE.
APPEND wa_board TO it_board.
ENDIF.
APPEND wa_board TO it_freecells.
l_counter = l_counter + 1.
ENDDO.

* distribute bombs
DO gf_bombs TIMES.
DESCRIBE TABLE it_freecells LINES l_no_freecells.
* random selection of freecells (1-l_no_freecells)
CALL FUNCTION 'AQ_INT_RANDOM_NUMBERS'
EXPORTING
low = 1
high = l_no_freecells
num_values = 1
IMPORTING
random_numbers = lt_random_numbers.
READ TABLE lt_random_numbers INTO l_random_cell INDEX 1.
* CALL FUNCTION 'QF05_RANDOM_INTEGER'
* EXPORTING
* ran_int_max = l_no_freecells
* ran_int_min = 1
* IMPORTING
* ran_int = l_random_cell.

* read freecells
READ TABLE it_freecells INTO wa_board
INDEX l_random_cell.

* delete entry in freecells
DELETE it_freecells INDEX sy-tabix.

* update board
wa_board-icon = c_bomb.
wa_board-status = 'B'.
MODIFY it_board FROM wa_board INDEX wa_board-index.

ENDDO.
mines_left = gf_bombs.
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'ENTE'.

REFRESH it_freecells.

* calulate status
DATA: l_bombs_count TYPE i.

l_counter = 1.
DO gf_cells TIMES.

READ TABLE it_board INTO wa_board
INDEX l_counter.

IF wa_board-status IS INITIAL.


l_bombs_count = 0.
l_index = l_counter - 1.
l_row = wa_board-row.
READ TABLE it_board INTO wa_check
INDEX l_index.
IF sy-subrc EQ 0 AND
wa_check-row = l_row AND
wa_check-status = 'B'.
l_bombs_count = l_bombs_count + 1.
ENDIF.

l_index = l_counter - ( gf_columns + 1 ).
l_row = wa_board-row - 1.
READ TABLE it_board INTO wa_check
INDEX l_index.
IF sy-subrc EQ 0 AND
wa_check-row = l_row AND
wa_check-status = 'B'.
l_bombs_count = l_bombs_count + 1.
ENDIF.

l_index = l_counter - gf_columns.
l_row = wa_board-row - 1.
READ TABLE it_board INTO wa_check
INDEX l_index.
IF sy-subrc EQ 0 AND
wa_check-row = l_row AND
wa_check-status = 'B'.
l_bombs_count = l_bombs_count + 1.
ENDIF.

l_index = l_counter - ( gf_columns - 1 ).
l_row = wa_board-row - 1.
READ TABLE it_board INTO wa_check
INDEX l_index.
IF sy-subrc EQ 0 AND
wa_check-row = l_row AND
wa_check-status = 'B'.
l_bombs_count = l_bombs_count + 1.
ENDIF.

l_index = l_counter + 1.
l_row = wa_board-row.
READ TABLE it_board INTO wa_check
INDEX l_index.
IF sy-subrc EQ 0 AND
wa_check-row = l_row AND
wa_check-status = 'B'.
l_bombs_count = l_bombs_count + 1.
ENDIF.

l_index = l_counter + ( gf_columns - 1 ).
l_row = wa_board-row + 1.
READ TABLE it_board INTO wa_check
INDEX l_index.
IF sy-subrc EQ 0 AND
wa_check-row = l_row AND
wa_check-status = 'B'.
l_bombs_count = l_bombs_count + 1.
ENDIF.

l_index = l_counter + gf_columns.
l_row = wa_board-row + 1.
READ TABLE it_board INTO wa_check
INDEX l_index.
IF sy-subrc EQ 0 AND
wa_check-row = l_row AND
wa_check-status = 'B'.
l_bombs_count = l_bombs_count + 1.
ENDIF.

l_index = l_counter + ( gf_columns + 1 ).
l_row = wa_board-row + 1.
READ TABLE it_board INTO wa_check
INDEX l_index.
IF sy-subrc EQ 0 AND
wa_check-row = l_row AND
wa_check-status = 'B'.
l_bombs_count = l_bombs_count + 1.
ENDIF.

wa_board-status = l_bombs_count.

CASE l_bombs_count.
WHEN 0.
wa_board-icon = c_blank.
WHEN 1.
wa_board-icon = c_icon1.
WHEN 2.
wa_board-icon = c_icon2.
WHEN 3.
wa_board-icon = c_icon3.
WHEN 4.
wa_board-icon = c_icon4.
WHEN 5.
wa_board-icon = c_icon5.
WHEN 6 OR 7 OR 8.
wa_board-icon = c_iconx.
ENDCASE.

ENDIF.

MODIFY it_board FROM wa_board INDEX wa_board-index.
APPEND wa_board TO it_freecells.
l_counter = l_counter + 1.

ENDDO.
GET TIME STAMP FIELD l_start.
ENDFORM. " BOARD_INIT

*&---------------------------------------------------------------------*
*& Form GAME_SUCCEEDED
*&---------------------------------------------------------------------*
FORM game_succeeded.
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 < class="L1S52">AND
new_highscore <> 'X'.
new_highscore = 'X'.
WRITE l_no NO-SIGN TO wa_lines(2).
wa_lines+4(12) = sy-uname.
WRITE sy-datum DD/MM/YYYY TO wa_lines+17(10).
WRITE sy-uzeit(5)
USING EDIT MASK '__:__' TO wa_lines+28(5).
WRITE score NO-SIGN NO-GROUPING TO wa_lines+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(2).
wa_lines+4(12) = wa_highscore-name.
wa_lines+17(10) = wa_highscore-date.
wa_lines+28(5) = wa_highscore-time.
WRITE wa_highscore-score NO-SIGN NO-GROUPING
TO wa_lines+34(6).
MODIFY tx_lines FROM wa_lines INDEX l_counter.
l_counter = l_counter + 1.
l_no = l_no + 1.
ENDLOOP.
IF new_highscore = 'X'.
EXPORT tx_lines TO DATABASE indx(st) ID gf_tdname.

CALL METHOD tx_editor->set_text_as_r3table
EXPORTING
table = tx_lines.

MESSAGE i319(01) WITH 'New Highscore' 'No.' l_hs.
ENDIF.
PERFORM board_init.
ENDFORM. " GAME_SUCCEEDED

*&---------------------------------------------------------------------*
*& Form read_highscore
*&---------------------------------------------------------------------*
FORM read_highscore.
REFRESH it_highscore.

IMPORT tx_lines FROM DATABASE indx(st) ID gf_tdname.
DESCRIBE TABLE tx_lines.
IF sy-tfill = 0.
REFRESH tx_lines.
wa_lines = ' * * * High Scores * * *'.
APPEND wa_lines TO tx_lines.
wa_lines = ' '.
APPEND wa_lines TO tx_lines.
wa_lines = 'No. Name Date Time Score'.
APPEND wa_lines TO tx_lines.
wa_lines = '----------------------------------------'.
APPEND wa_lines TO tx_lines.
DATA: lf_count TYPE i.
lf_count = 1.
DO 30 TIMES.
wa_lines = '30. NN 01.01.2000 12:00 99999'
.
WRITE lf_count TO wa_lines(2).
APPEND wa_lines TO tx_lines.
lf_count = lf_count + 1.
ENDDO.
ENDIF.

LOOP AT tx_lines INTO wa_lines.
IF sy-tabix > 4.
CLEAR wa_highscore.
wa_highscore-no = wa_lines(2).
wa_highscore-name = wa_lines+4(12).
wa_highscore-date = wa_lines+17(10).
wa_highscore-time = wa_lines+28(5).
wa_highscore-score = wa_lines+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-picture IS INITIAL.
CALL METHOD wa_board-picture->free.
ENDIF.
CALL METHOD wa_board-container->free.
ENDLOOP.
CALL METHOD tx_editor->free.
CALL METHOD tx_container->free.
ENDFORM. " housekeeping
*&---------------------------------------------------------------------*
*& Form init_randomizer
*&---------------------------------------------------------------------*
FORM init_randomizer.
DATA: lf_start(11) TYPE p DECIMALS 7.

DATA: ran_int TYPE i,
lt_random_numbers TYPE STANDARD TABLE OF i.

GET TIME STAMP FIELD lf_start.
ran_int = lf_start MOD ( 32 ** 2 ).
ran_int = ran_int MOD 100.

CALL FUNCTION 'AQ_INT_RANDOM_NUMBERS'
EXPORTING
low = 1
high = ran_int
num_values = ran_int
IMPORTING
random_numbers = lt_random_numbers.

ENDFORM. " init_randomizer"

Game - Number puzzle

REPORT ZAGS_101.

* Declarations.
DATA: v_first TYPE xfeld,
v_won TYPE xfeld.
DATA: BEGIN OF v_name,
name TYPE char4,
num TYPE char1,
END OF v_name.
DATA: v_blank_push LIKE v_name.
DATA: v_name_tmp LIKE v_name.
DATA: v_fieldname TYPE fieldname.
DATA: BEGIN OF s_pos,
s TYPE char1,
t TYPE char1,
END OF s_pos,
t_pos LIKE STANDARD TABLE OF s_pos.
FIELD-SYMBOLS: ,.

* selection-screen objects.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE v_text.
SELECTION-SCREEN PUSHBUTTON /10(3) push1 USER-COMMAND push1.
SELECTION-SCREEN PUSHBUTTON 14(3) push2 USER-COMMAND push2.
SELECTION-SCREEN PUSHBUTTON 18(3) push3 USER-COMMAND push3.
SELECTION-SCREEN PUSHBUTTON /10(3) push4 USER-COMMAND push4.
SELECTION-SCREEN PUSHBUTTON 14(3) push5 USER-COMMAND push5.
SELECTION-SCREEN PUSHBUTTON 18(3) push6 USER-COMMAND push6.
SELECTION-SCREEN PUSHBUTTON /10(3) push7 USER-COMMAND push7.
SELECTION-SCREEN PUSHBUTTON 14(3) push8 USER-COMMAND push8.
SELECTION-SCREEN PUSHBUTTON 18(3) push9 USER-COMMAND push9.
SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN PUSHBUTTON /10(10) output USER-COMMAND output.
SELECTION-SCREEN PUSHBUTTON 22(10) start USER-COMMAND start.

* Initialization event.
INITIALIZATION.

* Move initial text.
PERFORM move_initial_text.

* At selection-screen output.
AT SELECTION-SCREEN OUTPUT.

LOOP AT SCREEN.

* First time.
IF v_first IS INITIAL.
IF screen-name = 'PUSH9'.
screen-invisible = 1.
MODIFY SCREEN.
ENDIF.
ELSE.
IF screen-name = v_name.
screen-invisible = 1.
MODIFY SCREEN.
ENDIF.
ENDIF.

ENDLOOP.

IF v_won = 'X'.
MESSAGE i208(00) WITH 'You won'.
ENDIF.

* Set the first flag.
IF v_first IS INITIAL.
v_first = 'X'.
ENDIF.

* At selection-screen.
AT SELECTION-SCREEN.

* Check the sy-ucomm.
CASE sy-ucomm.
WHEN 'OUTPUT'.
* Show the output.
PERFORM show_output.

WHEN 'START'.

* Move the initial text.
CLEAR v_first.
PERFORM move_initial_text.

ENDCASE.

* Check if the sy-ucomm is one of the push buttons.
CHECK sy-ucomm = 'PUSH1' OR
sy-ucomm = 'PUSH2' OR
sy-ucomm = 'PUSH3' OR
sy-ucomm = 'PUSH4' OR
sy-ucomm = 'PUSH5' OR
sy-ucomm = 'PUSH6' OR
sy-ucomm = 'PUSH7' OR
sy-ucomm = 'PUSH8' OR
sy-ucomm = 'PUSH9'.

* move the sy-ucomm.
v_name_tmp = sy-ucomm.

* Check valid button.
CLEAR: s_pos.
READ TABLE t_pos INTO s_pos WITH KEY s = v_name_tmp-num
t = v_blank_push-num.
IF sy-subrc <> 0.
v_name = v_blank_push.
EXIT.
ENDIF.

* Move the user command.
v_name = sy-ucomm.

* Get the text.
CLEAR v_fieldname.
CONCATENATE 'PUSH' v_name-num INTO v_fieldname.
ASSIGN (v_fieldname) TO .

* Get the blank push value.
CLEAR v_fieldname.
CONCATENATE 'PUSH' v_blank_push-num INTO v_fieldname.
ASSIGN (v_fieldname) TO .

* Move the values.
= .

* success.
IF push1 = '1' AND
push2 = '2' AND
push3 = '3' AND
push4 = '4' AND
push5 = '5' AND
push6 = '6' AND
push7 = '7' AND
push8 = '8'.
v_won = 'X'.
ENDIF.

* Move the blank push to the current.
v_blank_push = v_name.


DEFINE pop.
clear: s_pos.
s_pos-s = &1.
s_pos-t = &2.
append s_pos to t_pos.
END-OF-DEFINITION.
*---------------------------------------------------------------------*
* FORM move_initial_text *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM move_initial_text.

* Move frame title.
MOVE 'Game' TO v_text.
MOVE 'Output' TO output.
MOVE 'Start' TO start.

* Move values to the push button.
MOVE '4' TO push1.MOVE '3' TO push2.
MOVE '2' TO push3.MOVE '7' TO push4.
MOVE '5' TO push5.MOVE '6' TO push6.
MOVE '8' TO push7.MOVE '1' TO push8.
MOVE ' ' TO push9.

* Set the blank push.
v_blank_push = 'PUSH9'.

* Prepare the possible values for each place.
CLEAR: t_pos.
pop '1' '2'.pop '1' '4'.
pop '2' '1'.pop '2' '3'.pop '2' '5'.
pop '3' '2'.pop '3' '6'.
pop '4' '1'.pop '4' '5'.pop '4' '7'.
pop '5' '2'.pop '5' '4'.pop '5' '6'.pop '5' '8'.
pop '6' '3'.pop '6' '5'.pop '6' '9'.
pop '7' '4'.pop '7' '8'.
pop '8' '5'.pop '8' '7'.pop '8' '9'.
pop '9' '6'.pop '9' '8'.

ENDFORM.
*---------------------------------------------------------------------*
* FORM show_output *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM show_output.

* Move values to the push button.
MOVE '1' TO push1.MOVE '2' TO push2.
MOVE '3' TO push3.MOVE '4' TO push4.
MOVE '5' TO push5.MOVE '6' TO push6.
MOVE '7' TO push7.MOVE '8' TO push8.
MOVE ' ' TO push9.

* Set the blank push.
v_blank_push = 'PUSH9'.
CLEAR v_first.

ENDFORM.