Professional Documents
Culture Documents
*---------------------------------------------------------------------*
DATA: stakan TYPE c OCCURS 0,
stakan_fig LIKE stakan,
stakan_fig_old LIKE stakan,
stakan_zad LIKE stakan.
DATA: sz, st, sf,
data0,
data1,
data2,
data3,
data4,
data5,
data6,
data7,
data8,
data9.
DATA: err, fl_new.
DATA: row TYPE i, col TYPE i.
DATA: st_width TYPE i VALUE 12, st_height TYPE i VALUE 20.
TYPES: BEGIN OF figure,
* cur_pos TYPE i,
* start_pos type I,
name(10),
width TYPE i,
height TYPE i,
* nextfig type figure,
body1 TYPE i,
body2 TYPE i,
body3 TYPE i,
body4 TYPE i,
old_body1 TYPE i,
old_body2 TYPE i,
old_body3 TYPE i,
old_body4 TYPE i,
END OF figure.
DATA: square TYPE figure,
line1 TYPE figure,
line2 TYPE figure,
lzz1 TYPE figure,
lzz2 TYPE figure,
rzz1 TYPE figure,
rzz2 TYPE figure,
tri1 TYPE figure,
tri2 TYPE figure,
tri3 TYPE figure,
tri4 TYPE figure,
lgg1 TYPE figure,
lgg2 TYPE figure,
lgg3 TYPE figure,
lgg4 TYPE figure,
rgg1 TYPE figure,
rgg2 TYPE figure,
rgg3 TYPE figure,
rgg4 TYPE figure
.
DATA cur_fig TYPE figure.
START-OF-SELECTION.
PERFORM init_figures.
PERFORM init_stakan.
PERFORM put_next_fig.
SET PF-STATUS 'STATUS_0'.
CALL SCREEN 100.
AT USER-COMMAND.
CASE sy-ucomm.
WHEN 'BACK' OR 'UP' OR 'EXIT'.
LEAVE PROGRAM.
* PERFORM f_read_data.
* is_selfield-refresh = 'X'.
* SET USER-COMMAND '&OPT'. " Optimize columns width
ENDCASE.
*Drop
AT PF21.
CLEAR: err, count.
DO.
PERFORM fig_move USING 'DOWN' CHANGING err.
IF err EQ 'X'.
EXIT.
ENDIF.
ADD 1 TO count.
ENDDO.
ADD count TO scores.
PERFORM out.
PERFORM f_call_rfc_wait.
AT PF22.
PERFORM fig_move USING 'LEFT' CHANGING err.
PERFORM out.
PERFORM f_call_rfc_wait.
AT PF23.
PERFORM fig_rotate.
PERFORM out.
PERFORM f_call_rfc_wait.
AT PF24.
PERFORM fig_move USING 'RIGHT' CHANGING err.
PERFORM out.
PERFORM f_call_rfc_wait.
AT PF25.
* set user-command 'PF21'.
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING new_code = 'PF21'.
LEAVE LIST-PROCESSING.
AT PF26.
PERFORM fig_move USING 'DOWN' CHANGING err.
PERFORM out.
IF err = 'X'.
PERFORM fig_append.
PERFORM check_full_line.
PERFORM put_next_fig.
ENDIF.
PERFORM f_call_rfc_wait.
*---------------------------------------------------------------------*
* FORM out *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM out.
DATA outstring(100).
DATA: lc TYPE i, otstup TYPE i.
DATA stakan_out LIKE stakan.
DATA so(2).
otstup = st_width * 4.
stakan_out[] = stakan[].
MODIFY stakan_out FROM 'X' INDEX cur_fig-body1.
MODIFY stakan_out FROM 'X' INDEX cur_fig-body2.
MODIFY stakan_out FROM 'X' INDEX cur_fig-body3.
MODIFY stakan_out FROM 'X' INDEX cur_fig-body4.
CLEAR outstring.
WRITE AT 30 'Score: '.
WRITE scores .
LOOP AT stakan_out INTO st.
IF sy-tabix LE otstup. CONTINUE. ENDIF.
lc = sy-tabix MOD st_width .
CASE st.
WHEN ','. so = '::'.
WHEN 'O'. so = 'OO'.
WHEN 'X'. so = '[]'.
ENDCASE.
CONCATENATE outstring so INTO outstring.
IF lc = 0.
NEW-LINE.
TRANSLATE outstring USING ': '.
*WRITE outstring INTENSIFIED ON .
*WRITE outstring COLOR COL_negative." INVERSE ON .
WRITE (24) outstring .
* WRITE outstring+1(st_width) INVERSE ON .
* write: outstring(1).
* WRITE: outstring .
CLEAR outstring.
ENDIF.
ENDLOOP.
ENDFORM.
*---------------------------------------------------------------------*
* Form F_CALL_RFC_WAIT
*---------------------------------------------------------------------*
FORM f_call_rfc_wait.
DATA lv_mssg(80). "#EC NEEDED
* Wait in a task
* You need to create functional module 'Z_NBCSH_DELAY'
* to try delay less then 1 second
* DATA seconds TYPE f.
*
*
*
*
*
*
*
*
*
*
seconds = '0.5'.
CALL FUNCTION 'Z_NBCSH_DELAY' STARTING NEW TASK '001'
PERFORMING f_task_end ON END OF TASK
EXPORTING
delay = seconds
EXCEPTIONS
RESOURCE_FAILURE = 1
communication_failure = 2 MESSAGE lv_mssg
system_failure = 3 MESSAGE lv_mssg
OTHERS = 4.
* leave screen.
* SET TITLEBAR 'xxx'.
* DATA lv_mssg(80). "#EC NEEDED
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
CASE sy-ucomm.
WHEN 'BACK' OR 'UP' OR 'EXIT'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
*---------------------------------------------------------------------*
* MODULE exx INPUT *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
MODULE exx INPUT.
LEAVE PROGRAM.
ENDMODULE. " EXX INPUT
*---------------------------------------------------------------------*
* FORM init_figures *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM init_figures.
DATA s TYPE i.
DATA w TYPE i.
w = st_width. "
s = w DIV 2. "
square-name = 'SQUARE'.
square-body1 = s.
square-body2 = s + 1.
square-body3 = s + w.
square-body4 = s + w + 1.
square-width = 2.
square-height = 2.
line1-name = 'LINE1'.
line1-body1 = s - 2.
line1-body2 = s - 1.
line1-body3 = s .
line1-body4 = s + 1.
line1-width = 4.
line1-height = 1.
line2-name = 'LINE2'.
line2-body1 = s .
line2-body2 = s + w.
line2-body3 = s + w + w.
line2-body4 = s + w + w + w.
line2-width = 1.
line2-height = 4.
lzz1-name = 'LZZ1'.
lzz1-body1 = s .
lzz1-body2 = s + w.
lzz1-body3 = s + 1 + w.
lzz1-body4 = s + 1 + w + w.
lzz1-width = 2.
lzz1-height = 3.
lzz2-name = 'LZZ2'.
lzz2-body1 = s .
lzz2-body2 = s + 1.
lzz2-body3 = s + w - 1.
lzz2-body4 = s + w.
lzz2-width = 3.
lzz2-height = 2.
rzz1-name = 'RZZ1'.
rzz1-body1 = s + 1.
rzz1-body2 = s + w .
rzz1-body3 = s + w + 1.
rzz1-body4 = s + w + w.
rzz1-width = 2.
rzz1-height = 3.
rzz2-name = 'RZZ2'.
rzz2-body1 = s - 1.
rzz2-body2 = s .
rzz2-body3 = s + w.
rzz2-body4 = s + 1 + w.
rzz2-width = 3.
rzz2-height = 2.
tri1-name = 'TRI1'.
tri1-body1 = s .
tri1-body2 = s + w - 1.
tri1-body3 = s + w.
tri1-body4 = s + 1 + w.
tri1-width = 3.
tri1-height = 2.
tri2-name = 'TRI2'.
tri2-body1 = s - 1.
tri2-body2 = s + w - 1.
tri2-body3 = s + w.
tri2-body4 = s - 1 + w + w.
tri2-width = 2.
tri2-height = 3.
tri3-name = 'TRI3'.
tri3-body1 = s - 1.
tri3-body2 = s .
tri3-body3 = s + 1.
tri3-body4 = s + w.
tri3-width = 3.
tri3-height = 2.
tri4-name = 'TRI4'.
tri4-body1 = s .
tri4-body2 = s - 1 + w.
tri4-body3 = s + w.
tri4-body4 = s + w + w.
tri4-width = 2.
tri4-height = 3.
lgg1-name = 'LGG1'.
lgg1-body1 = s .
lgg1-body2 = s + w.
lgg1-body3 = s + w + w.
lgg1-body4 = s + w + w + 1.
lgg1-width = 2.
lgg1-height = 3.
lgg2-name = 'LGG2'.
lgg2-body1 = s - 1.
lgg2-body2 = s .
lgg2-body3 = s + 1.
lgg2-body4 = s + w - 1.
lgg2-width = 2.
lgg2-height = 3.
lgg3-name = 'LGG3'.
lgg3-body1 = s .
lgg3-body2 = s + 1.
lgg3-body3 = s + w + 1.
lgg3-body4 = s + w + w + 1.
lgg3-width = 2.
lgg3-height = 3.
lgg4-name = 'LGG4'.
lgg4-body1 = s + 1.
lgg4-body2 = s - 1 + w.
lgg4-body3 = s + w.
lgg4-body4 = s + w + 1.
lgg4-width = 2.
lgg4-height = 3.
rgg1-name = 'RGG1'.
rgg1-body1 = s + 1.
rgg1-body2 = s + w + 1.
rgg1-body3 = s + w + w .
rgg1-body4 = s + w + w + 1.
rgg1-width = 2.
rgg1-height = 3.
rgg2-name = 'RGG2'.
rgg2-body1 = s - 1.
rgg2-body2 = s + w - 1.
rgg2-body3 = s + w.
rgg2-body4 = s + w + 1.
rgg2-width = 2.
rgg2-height = 3.
rgg3-name = 'RGG3'.
rgg3-body1 = s .
rgg3-body2 = s + 1.
rgg3-body3 = s + w .
rgg3-body4 = s + w + w.
rgg3-width = 2.
rgg3-height = 3.
rgg4-name = 'RGG4'.
rgg4-body1 = s - 1.
rgg4-body2 = s .
rgg4-body3 = s + 1.
rgg4-body4 = s + w + 1.
rgg4-width = 2.
rgg4-height = 3.
ENDFORM.
*---------------------------------------------------------------------*
* FORM init_stakan_zad *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM init_stakan.
DATA size_v TYPE i.
DATA size_h TYPE i.
size_v = st_height + 4 .
size_h = st_width - 2.
CLEAR stakan.
DO size_v TIMES.
APPEND 'O' TO stakan.
DO size_h TIMES.
APPEND ',' TO stakan.
ENDDO.
APPEND 'O' TO stakan.
ENDDO.
APPEND ',' TO stakan.
DO size_h TIMES.
APPEND 'O' TO stakan.
ENDDO.
APPEND ',' TO stakan.
ENDFORM.
*---------------------------------------------------------------------*
* FORM put_next_fig *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> FIG *
*---------------------------------------------------------------------*
FORM put_next_fig.
* DATA rnd LIKE bbseg-wrbtr.
*
* CALL FUNCTION 'RANDOM_AMOUNT'
* EXPORTING
* rnd_min = '1'
* rnd_max = '7'
** VALCURR = 'DEM'
* IMPORTING
* rnd_amount = rnd
* .
DATA rnd TYPE i.
CALL FUNCTION 'QF05_RANDOM_INTEGER'
EXPORTING
ran_int_max = 7
ran_int_min = 1
IMPORTING
ran_int = rnd
* EXCEPTIONS
* INVALID_INPUT = 1
* OTHERS = 2
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* CONDENSE rnd.
CASE rnd.
WHEN '1'.
cur_fig = square.
WHEN '2'.
cur_fig = line1.
WHEN '3'.
cur_fig = rzz1.
WHEN '4'.
cur_fig = lzz1.
WHEN '5'.
cur_fig = tri1.
WHEN '6'.
cur_fig = lgg1.
WHEN '7'.
cur_fig = rgg1.
ENDCASE.
PERFORM fig_move USING 'INIT' CHANGING err.
IF NOT err IS INITIAL.
DATA result(20).
WRITE scores TO result.
CONDENSE result.
CONCATENATE 'You score:' result INTO result SEPARATED BY space.
DATA answer.
CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE'
EXPORTING
defaultoption = 'Y'
diagnosetext1 = result
diagnosetext2 = 'you_max_result'
diagnosetext3 = 'max_result'
textline1 = 'Play again?'
* TEXTLINE2 = ' '
titel = 'GAME OVER'
* START_COLUMN = 25
* START_ROW = 6
cancel_display = ''
IMPORTING
answer = answer
.
IF answer EQ 'N'.
LEAVE PROGRAM.
ELSE.
PERFORM init_stakan.
PERFORM put_next_fig.
ENDIF.
ENDIF.
ENDFORM.
*---------------------------------------------------------------------*
* FORM fig_move *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> DIR *
*---------------------------------------------------------------------*
FORM fig_move USING dir TYPE char5 CHANGING error.
DATA: shft TYPE i.
error = ''.
DATA temp_fig LIKE cur_fig.
temp_fig = cur_fig.
* PERFORM SAVE_POS.
CASE dir.
WHEN 'DOWN'.
shft = st_width.
WHEN 'LEFT'.
shft = -1.
WHEN 'RIGHT'.
shft = 1.
WHEN 'INIT'.
shft = st_width * 4.
ENDCASE.
ADD
ADD
ADD
ADD
shft
shft
shft
shft
TO
TO
TO
TO
cur_fig-body1.
cur_fig-body2.
cur_fig-body3.
cur_fig-body4.
cur_fig = tri1.
shft = - w2 .
WHEN 'LGG1'.
cur_fig = lgg2.
shft = - w2 + 1 .
WHEN 'LGG2'.
cur_fig = lgg3.
shft = - w2 .
WHEN 'LGG3'.
cur_fig = lgg4.
shft = - w2 .
WHEN 'LGG4'.
cur_fig = lgg1.
shft = - w2 - 1 .
WHEN 'RGG1'.
cur_fig = rgg2.
shft = - w2 .
WHEN 'RGG2'.
cur_fig = rgg3.
shft = - w2 .
WHEN 'RGG3'.
cur_fig = rgg4.
shft = - w2 + 1 .
WHEN 'RGG4'.
cur_fig = rgg1.
shft = - w2 .
WHEN 'SQUARE'.
cur_fig = square.
shft = - st_width DIV
ENDCASE.
cur_fig-body1 = start
cur_fig-body2 = start
cur_fig-body3 = start
cur_fig-body4 = start
2 .
+
+
+
+
cur_fig-body1
cur_fig-body2
cur_fig-body3
cur_fig-body4
+
+
+
+
shft.
shft.
shft.
shft.
""""-
temp_fig-body1.
temp_fig-body2.
temp_fig-body3.
temp_fig-body4.
* <-- p2 text
*----------------------------------------------------------------------*
FORM check_full_line.
DATA count_line TYPE i.
DATA: n1 TYPE i, n2 TYPE i.
DATA outstring(20).
DATA: s TYPE i, s10 TYPE i, sw TYPE i.
DATA lc TYPE i.
sw = st_width - 2.
CLEAR outstring.
LOOP AT stakan INTO st.
lc = sy-tabix MOD st_width .
IF lc = 1.
s = sy-tabix.
s10 = s + st_width - 1.
ENDIF.
CONCATENATE outstring st INTO outstring.
IF lc = 0.
SEARCH outstring FOR ','.
IF sy-subrc NE 0.
DELETE stakan FROM s TO s10.
ADD 1 TO count_line.
ENDIF.
CLEAR outstring.
ENDIF.
ENDLOOP.
CLEAR: n1, n2.
DO count_line TIMES.
ADD 10 TO n1.
ADD n1 TO n2.
* 10 for one line, 10+20 for
INSERT 'O' INTO stakan INDEX
DO sw TIMES.
INSERT ',' INTO stakan INDEX
ENDDO.
INSERT 'O' INTO stakan INDEX
ENDDO.
ADD n2 TO scores.
ENDFORM. " check_full_line