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"

No comments:

Post a Comment