用 SAP ABAP 编写的俄罗斯游戏

跳槽达人
• 阅读 1051

1984年6月6日,《俄罗斯方块》发布。因为由俄罗斯计算工程师,阿列克谢·帕基特诺夫发明而得名。 2007年,《电子游戏月刊》将该游戏列为史上最伟大的100个游戏中的第一位。 网上能找到各种编程语言实现的该游戏,当然少不了ABAP版本,源代码链接:https://github.com/alejogonza...

用 SAP ABAP 编写的俄罗斯游戏
用 SAP ABAP 编写的俄罗斯游戏

看下游戏画面:
用 SAP ABAP 编写的俄罗斯游戏

下面是具体创建方式。

主程序代码:

REPORT ztetris NO STANDARD PAGE HEADING.

INCLUDE ztetris_d.
INCLUDE ztetris_f.
INCLUDE ztetris_i.
INCLUDE ztetris_o.

START-OF-SELECTION.
  PERFORM init_figures.
  PERFORM init_stack.
  PERFORM put_next_fig.
  SET PF-STATUS 'STATUS_0'.
  CALL SCREEN 100.

AT USER-COMMAND.
  CASE sy-ucomm.
    WHEN 'UP'
      OR 'EXIT'.
      LEAVE PROGRAM.
  ENDCASE.

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

include ZTETRIS_D 代码:

*----------------------------------------------------------------------*
*   INCLUDE ZTETRIS_D                                                  *
*----------------------------------------------------------------------*

TYPES: BEGIN OF outtype,
         line TYPE char20,
       END OF outtype.

DATA outtab TYPE outtype OCCURS 1 WITH HEADER LINE.

TYPES: BEGIN OF figure,
         name(10)  TYPE c,
         width     TYPE i,
         height    TYPE i,
         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: w_1st(2)       TYPE i,
      size_v         TYPE i,
      size_h         TYPE i,
      w1             TYPE i,
      w2             TYPE i,
      start          TYPE i,
      shft           TYPE i,
      shft1          TYPE i,
      rnd            TYPE i,
      ini            TYPE i,
      count_line     TYPE i,
      cl             TYPE i,
      n1             TYPE i,
      n2             TYPE i,
      ix             TYPE i,
      s10            TYPE i,
      sw             TYPE i,
      linct          TYPE i,
      sini           TYPE i,
      wini           TYPE i,
      s              TYPE i,
      w              TYPE i,
      lc             TYPE i,
      otstup         TYPE i,
      row            TYPE i,
      col            TYPE i,
      st_width       TYPE i VALUE 12,
      st_height      TYPE i VALUE 20,
      count          TYPE i,
      scores         TYPE i.

DATA: stack         TYPE c OCCURS 0,
      w_col(2)       TYPE c,
      w_typ(1)       TYPE c,
      w_nxt(1)       TYPE c,
      err1           TYPE c,
      result(20)     TYPE c,
      answer(1)      TYPE c,
      lv_mssg1(80)   TYPE c,
      lv_mssg2(80)   TYPE c,
      sz(1)          TYPE c,
      st(1)          TYPE c,
      sf(1)          TYPE c,
      data0(1)       TYPE c,
      data1(1)       TYPE c,
      data2(1)       TYPE c,
      data3(1)       TYPE c,
      data4(1)       TYPE c,
      data5(1)       TYPE c,
      data6(1)       TYPE c,
      data7(1)       TYPE c,
      data8(1)       TYPE c,
      data9(1)       TYPE c,
      outst(20)      TYPE c,
      err(1)         TYPE c,
      fl_new(1)      TYPE c,
      outstring(100) TYPE c,
      so(2)          TYPE c.

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,
      nxt_fig        TYPE figure,
      cur_fig        TYPE figure.

DATA: nxt1(8) TYPE c,
      nxt2(8) TYPE c,
      nxt3(8) TYPE c,
      nxt4(8) TYPE c,
      nxt5(8) TYPE c,
      nxt6(8) TYPE c.

DATA: stack_fig     LIKE stack,
      stack_fig_old LIKE stack,
      stack_zad     LIKE stack,
      stack_out     LIKE stack,
      temp_fig1      LIKE cur_fig,
      temp_fig       LIKE cur_fig.

ZTETRIS_F 代码:

*---------------------------------------------------------------------*
*   INCLUDE ZTETRIS_F
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
* FORM out
*---------------------------------------------------------------------*
FORM out.
  CLEAR: lc, stack_out, so, otstup.
  REFRESH stack_out.

  otstup = st_width * 4.
  stack_out[] = stack[].

  CASE cur_fig-name+0(3).
    WHEN 'SQU'.
      w_typ ='1'.
    WHEN 'LIN'.
      w_typ ='2'.
    WHEN 'RZZ'.
      w_typ ='3'.
    WHEN 'LZZ'.
      w_typ ='4'.
    WHEN 'TRI'.
      w_typ ='5'.
    WHEN 'LGG'.
      w_typ ='6'.
    WHEN 'RGG'.
      w_typ ='7'.
  ENDCASE.

  MODIFY stack_out FROM w_typ INDEX cur_fig-body1.
  MODIFY stack_out FROM w_typ INDEX cur_fig-body2.
  MODIFY stack_out FROM w_typ INDEX cur_fig-body3.
  MODIFY stack_out FROM w_typ INDEX cur_fig-body4.

  WRITE: AT 30 '得分: ', scores.
  SKIP 1.
  WRITE /30 '下一个方块'.
  SKIP 1.
  NEW-LINE.
  WRITE AT 30 nxt1.
  PERFORM draw_next_fig USING nxt1.
  NEW-LINE.
  WRITE AT 30 nxt2.
  PERFORM draw_next_fig USING nxt2.
  NEW-LINE.
  WRITE AT 30 nxt3.
  PERFORM draw_next_fig USING nxt3.

  SKIP TO LINE 3.
  CLEAR outstring.
  LOOP AT stack_out INTO st.
    IF sy-tabix LE otstup.
      CONTINUE.
    ENDIF.

    lc = sy-tabix MOD st_width.

    CASE st.
      WHEN ','. so = '::'.
      WHEN 'O'. so = '##'.
      WHEN '1'. so = '11'.
      WHEN '2'. so = '22'.
      WHEN '3'. so = '33'.
      WHEN '4'. so = '44'.
      WHEN '5'. so = '55'.
      WHEN '6'. so = '66'.
      WHEN '7'. so = '77'.
    ENDCASE.

    CONCATENATE outstring so INTO outstring.

    IF lc = 0.
      NEW-LINE.
      TRANSLATE outstring USING ': '.
      FORMAT COLOR 3 INTENSIFIED OFF.
      WRITE (24) outstring.
      DO 24 TIMES.
        FORMAT COLOR 3 INTENSIFIED ON.
        w_1st = syst-index + 1.
        CASE outstring+syst-index(1).
          WHEN '1'.
            WRITE AT w_1st '_' COLOR = '01'.
          WHEN '2'.
            WRITE AT w_1st '_' COLOR = '02'.
          WHEN '3'.
            WRITE AT w_1st '_' COLOR = '03'.
          WHEN '4'.
            WRITE AT w_1st '_' COLOR = '04'.
          WHEN '5'.
            WRITE AT w_1st '_' COLOR = '05'.
          WHEN '6'.
            WRITE AT w_1st '_' COLOR = '06'.
          WHEN '7'.
            WRITE AT w_1st '_' COLOR = '07'.
        ENDCASE.
      ENDDO.

      CLEAR outstring.
    ENDIF.

  ENDLOOP.

ENDFORM.
*---------------------------------------------------------------------*
*       FORM draw_next_fig
*---------------------------------------------------------------------*
FORM draw_next_fig USING nextfig.
  DATA: w_ind LIKE syst-index.

  DO 8 TIMES.
    w_1st = syst-index + 29.
    w_ind = syst-index - 1.
    CASE nextfig+w_ind(1).
      WHEN '1'.
        WRITE AT w_1st '_' COLOR = '01'.
      WHEN '2'.
        WRITE AT w_1st '_' COLOR = '02'.
      WHEN '3'.
        WRITE AT w_1st '_' COLOR = '03'.
      WHEN '4'.
        WRITE AT w_1st '_' COLOR = '04'.
      WHEN '5'.
        WRITE AT w_1st '_' COLOR = '05'.
      WHEN '6'.
        WRITE AT w_1st '_' COLOR = '06'.
      WHEN '7'.
        WRITE AT w_1st '_' COLOR = '07'.
    ENDCASE.
  ENDDO.
ENDFORM.
*---------------------------------------------------------------------*
* Form F_CALL_RFC_WAIT
*---------------------------------------------------------------------*
FORM f_call_rfc_wait.

  DATA seconds TYPE i.
  seconds = '1'.

  CLEAR lv_mssg1.

  CALL FUNCTION 'KKPA_RFC_PING_AND_WAIT' STARTING NEW TASK '001'
    PERFORMING f_task_end ON END OF TASK
    EXPORTING
      seconds               = seconds "Refresh time
    EXCEPTIONS
      RESOURCE_FAILURE      = 1
      communication_failure = 2 MESSAGE lv_mssg1
      system_failure        = 3 MESSAGE lv_mssg1
      OTHERS                = 4.

  SET USER-COMMAND 'PF25'.
ENDFORM. " F_CALL_RFC_WAIT
*---------------------------------------------------------------------*
* Form F_TASK_END
*---------------------------------------------------------------------*
FORM f_task_end USING u_taskname.

  CLEAR lv_mssg2.

  RECEIVE RESULTS FROM FUNCTION 'KKPA_RFC_PING_AND_WAIT'
   EXCEPTIONS
      RESOURCE_FAILURE      = 1
      communication_failure = 2 MESSAGE lv_mssg2
      system_failure        = 3 MESSAGE lv_mssg2
      OTHERS                = 4.
  CHECK sy-subrc EQ 0.

  SET USER-COMMAND 'PF26'. " down

ENDFORM. " F_TASK_END
*---------------------------------------------------------------------*
*       FORM init_figures                                             *
*---------------------------------------------------------------------*
FORM init_figures.

  CLEAR: wini, sini.

  wini = st_width.
  sini = wini DIV 2.

  PERFORM init_square.
  PERFORM init_line.
  PERFORM right_zigzag.
  PERFORM left_zigzag.
  PERFORM init_t_piece.
  PERFORM init_right_leg.
  PERFORM init_left_leg.

ENDFORM.
*---------------------------------------------------------------------*
*       FORM init_square                                              *
*---------------------------------------------------------------------*
FORM init_square.
  square-name = 'SQUARE'.                                   "Square
  square-body1 = sini.
  square-body2 = sini + 1.
  square-body3 = sini + wini.
  square-body4 = sini + wini + 1.
  square-width = 2.
  square-height = 2.
ENDFORM.
*---------------------------------------------------------------------*
*       FORM init_line                                                *
*---------------------------------------------------------------------*
FORM init_line.
  line1-name = 'LINE1'.                                     "Line1
  line1-body1 = sini - 2.
  line1-body2 = sini - 1.
  line1-body3 = sini .
  line1-body4 = sini + 1.
  line1-width = 4.
  line1-height = 1.

  line2-name = 'LINE2'.                                     "line2
  line2-body1 = sini .
  line2-body2 = sini + wini.
  line2-body3 = sini + wini + wini.
  line2-body4 = sini + wini + wini + wini.
  line2-width = 1.
  line2-height = 4.
ENDFORM.
*---------------------------------------------------------------------*
*       FORM left_zigzag                                              *
*---------------------------------------------------------------------*
FORM left_zigzag.
  lzz1-name = 'LZZ1'.                                    "Left Zig Zag1
  lzz1-body1 = sini .
  lzz1-body2 = sini + wini.
  lzz1-body3 = sini + 1 + wini.
  lzz1-body4 = sini + 1 + wini + wini.
  lzz1-width = 2.
  lzz1-height = 3.

  lzz2-name = 'LZZ2'.                                    "Left Zig Zag2
  lzz2-body1 = sini .
  lzz2-body2 = sini + 1.
  lzz2-body3 = sini + wini - 1.
  lzz2-body4 = sini + wini.
  lzz2-width = 3.
  lzz2-height = 2.
ENDFORM.
*---------------------------------------------------------------------*
*       FORM right_zigzag                                             *
*---------------------------------------------------------------------*
FORM right_zigzag.
  rzz1-name = 'RZZ1'.                                    "Right Zig Zag1
  rzz1-body1 = sini + 1.
  rzz1-body2 = sini + wini .
  rzz1-body3 = sini + wini + 1.
  rzz1-body4 = sini + wini + wini.
  rzz1-width = 2.
  rzz1-height = 3.

  rzz2-name = 'RZZ2'.                                    "Right Zig Zag2
  rzz2-body1 = sini - 1.
  rzz2-body2 = sini .
  rzz2-body3 = sini + wini.
  rzz2-body4 = sini + 1 + wini.
  rzz2-width = 3.
  rzz2-height = 2.
ENDFORM.
*---------------------------------------------------------------------*
*       FORM init_t_piece                                             *
*---------------------------------------------------------------------*
FORM init_t_piece.
  tri1-name = 'TRI1'.                                       "T-Piece1
  tri1-body1 = sini .
  tri1-body2 = sini + wini - 1.
  tri1-body3 = sini + wini.
  tri1-body4 = sini + 1 + wini.
  tri1-width = 3.
  tri1-height = 2.

  tri2-name = 'TRI2'.                                       "T-Piece2
  tri2-body1 = sini - 1.
  tri2-body2 = sini + wini - 1.
  tri2-body3 = sini + wini.
  tri2-body4 = sini - 1 + wini + wini.
  tri2-width = 2.
  tri2-height = 3.

  tri3-name = 'TRI3'.                                       "T-Piece3
  tri3-body1 = sini - 1.
  tri3-body2 = sini .
  tri3-body3 = sini + 1.
  tri3-body4 = sini + wini.
  tri3-width = 3.
  tri3-height = 2.

  tri4-name = 'TRI4'.                                       "T-Piece4
  tri4-body1 = sini .
  tri4-body2 = sini - 1 + wini.
  tri4-body3 = sini + wini.
  tri4-body4 = sini + wini + wini.
  tri4-width = 2.
  tri4-height = 3.
ENDFORM.
*---------------------------------------------------------------------*
*       FORM init_right_leg                                           *
*---------------------------------------------------------------------*
FORM init_right_leg.
  rgg1-name = 'RGG1'.                                       "Right Leg1
  rgg1-body1 = sini + 1.
  rgg1-body2 = sini + wini + 1.
  rgg1-body3 = sini + wini + wini .
  rgg1-body4 = sini + wini + wini + 1.
  rgg1-width = 2.
  rgg1-height = 3.

  rgg2-name = 'RGG2'.                                       "Right Leg2
  rgg2-body1 = sini - 1.
  rgg2-body2 = sini + wini - 1.
  rgg2-body3 = sini + wini.
  rgg2-body4 = sini + wini + 1.
  rgg2-width = 2.
  rgg2-height = 3.

  rgg3-name = 'RGG3'.                                       "Right Leg3
  rgg3-body1 = sini .
  rgg3-body2 = sini + 1.
  rgg3-body3 = sini + wini .
  rgg3-body4 = sini + wini + wini.
  rgg3-width = 2.
  rgg3-height = 3.

  rgg4-name = 'RGG4'.                                       "Right Leg4
  rgg4-body1 = sini - 1.
  rgg4-body2 = sini .
  rgg4-body3 = sini + 1.
  rgg4-body4 = sini + wini + 1.
  rgg4-width = 2.
  rgg4-height = 3.
ENDFORM.
*---------------------------------------------------------------------*
*       FORM init_left_leg                                            *
*---------------------------------------------------------------------*
FORM init_left_leg.
  lgg1-name = 'LGG1'.                                       "Left Leg1
  lgg1-body1 = sini .
  lgg1-body2 = sini + wini.
  lgg1-body3 = sini + wini + wini.
  lgg1-body4 = sini + wini + wini + 1.
  lgg1-width = 2.
  lgg1-height = 3.

  lgg2-name = 'LGG2'.                                       "Left Leg2
  lgg2-body1 = sini - 1.
  lgg2-body2 = sini .
  lgg2-body3 = sini + 1.
  lgg2-body4 = sini + wini - 1.
  lgg2-width = 2.
  lgg2-height = 3.

  lgg3-name = 'LGG3'.                                       "Left Leg3
  lgg3-body1 = sini .
  lgg3-body2 = sini + 1.
  lgg3-body3 = sini + wini + 1.
  lgg3-body4 = sini + wini + wini + 1.
  lgg3-width = 2.
  lgg3-height = 3.

  lgg4-name = 'LGG4'.                                       "Left Leg4
  lgg4-body1 = sini + 1.
  lgg4-body2 = sini - 1 + wini.
  lgg4-body3 = sini + wini.
  lgg4-body4 = sini + wini + 1.
  lgg4-width = 2.
  lgg4-height = 3.
ENDFORM.
*---------------------------------------------------------------------*
*       FORM init_stack                                              *
*---------------------------------------------------------------------*
FORM init_stack.

  CLEAR: size_v, size_h.
  CLEAR: scores, result.

  size_v = st_height + 4 .
  size_h = st_width - 2.
  CLEAR stack.
  DO size_v TIMES.
    APPEND 'O' TO stack.
    DO size_h TIMES.
      APPEND ',' TO stack.
    ENDDO.
    APPEND 'O' TO stack.
  ENDDO.
  APPEND ',' TO stack.
  DO size_h TIMES.
    APPEND 'O' TO stack.
  ENDDO.
  APPEND ',' TO stack.

ENDFORM.
*---------------------------------------------------------------------*
*       FORM put_next_fig                                             *
*---------------------------------------------------------------------*
FORM put_next_fig.

  CLEAR: rnd.
  CLEAR: err, result, answer.

  IF ini IS INITIAL.
    PERFORM random_integer USING ini cur_fig.
    PERFORM random_integer USING rnd nxt_fig.
  ELSE.
    cur_fig = nxt_fig.
    PERFORM random_integer USING rnd nxt_fig.
  ENDIF.

  PERFORM build_next_fig USING rnd.

  PERFORM fig_move USING 'INIT' CHANGING err.
  IF NOT err IS INITIAL.
    WRITE scores TO result.
    CONDENSE result.
    CONCATENATE 'You score:' result INTO result SEPARATED BY space.

    CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE'
         EXPORTING
              defaultoption  = 'Y'
              diagnosetext1  = result
              textline1      = 'Play again?'
              titel          = 'GAME OVER'
              cancel_display = ''
         IMPORTING
              answer         = answer.
    IF answer EQ 'N'.
      LEAVE PROGRAM.
    ELSE.
      PERFORM init_stack.
      PERFORM put_next_fig.
    ENDIF.
  ENDIF.
ENDFORM.
*---------------------------------------------------------------------*
*       FORM random_integer                                           *
*---------------------------------------------------------------------*
FORM random_integer USING i_num i_fig.
  CALL FUNCTION 'QF05_RANDOM_INTEGER'
       EXPORTING
            ran_int_max = 7
            ran_int_min = 1
       IMPORTING
            ran_int     = i_num.
  CASE i_num.
    WHEN '1'.
      i_fig = square.
    WHEN '2'.
      i_fig = line1.
    WHEN '3'.
      i_fig = rzz1.
    WHEN '4'.
      i_fig = lzz1.
    WHEN '5'.
      i_fig = tri1.
    WHEN '6'.
      i_fig = lgg1.
    WHEN '7'.
      i_fig = rgg1.
  ENDCASE.
ENDFORM.
*---------------------------------------------------------------------*
*      Form  build_next_fig
*---------------------------------------------------------------------*
FORM build_next_fig USING p_fig.
  CLEAR: nxt1, nxt2, nxt3.

  CASE p_fig.
    WHEN '1'.
      nxt1+0(4) = '1111'.
      nxt2+0(4) = '1111'.
    WHEN '2'.
      nxt1+0(8) = '22222222'.
    WHEN '3'.
      nxt1+2(2) = '33'.
      nxt2+0(4) = '3333'.
      nxt3+0(2) = '33'.
    WHEN '4'.
      nxt1+0(2) = '44'.
      nxt2+0(4) = '4444'.
      nxt3+2(2) = '44'.
    WHEN '5'.
      nxt1+2(2) = '55'.
      nxt2+0(6) = '555555'.
    WHEN '6'.
      nxt1+0(2) = '66'.
      nxt2+0(2) = '66'.
      nxt3+0(4) = '6666'.
    WHEN '7'.
      nxt1+2(2) = '77'.
      nxt2+2(2) = '77'.
      nxt3+0(4) = '7777'.
  ENDCASE.

ENDFORM.                    " build_next_fig
*---------------------------------------------------------------------*
*       FORM fig_move                                                 *
*---------------------------------------------------------------------*
FORM fig_move USING dir TYPE char5 CHANGING error.

  CLEAR: temp_fig, shft1.

  error    = ''.
  temp_fig = cur_fig.

  CASE dir.
    WHEN 'DOWN'.
      shft1 = st_width.
    WHEN 'LEFT'.
      shft1 = -1.
    WHEN 'RIGHT'.
      shft1 = 1.
    WHEN 'INIT'.
      shft1 = st_width * 4.
  ENDCASE.

  ADD shft1 TO cur_fig-body1.
  ADD shft1 TO cur_fig-body2.
  ADD shft1 TO cur_fig-body3.
  ADD shft1 TO cur_fig-body4.

  PERFORM check_pos CHANGING error.

  IF NOT error IS INITIAL.
    cur_fig = temp_fig.
  ENDIF.
ENDFORM.
*---------------------------------------------------------------------*
*       FORM check_pos
*---------------------------------------------------------------------*
FORM check_pos CHANGING error TYPE char1.

  DO 1 TIMES.
    READ TABLE stack INTO st INDEX cur_fig-body1.
    IF st NE ','.
      error = 'X'. EXIT.
    ENDIF.

    READ TABLE stack INTO st INDEX cur_fig-body2.
    IF st NE ','.
      error = 'X'. EXIT.
    ENDIF.

    READ TABLE stack INTO st INDEX cur_fig-body3.
    IF st NE ','.
      error = 'X'. EXIT.
    ENDIF.

    READ TABLE stack INTO st INDEX cur_fig-body4.
    IF st NE ','.
      error = 'X'. EXIT.
    ENDIF.
  ENDDO.
ENDFORM.
*---------------------------------------------------------------------*
*       FORM fig_rotate
*---------------------------------------------------------------------*
FORM fig_rotate.

  CLEAR: start, temp_fig1, err1, shft, w1, w2.

  w1        = st_width.
  w2        = st_width DIV 2.
  temp_fig1 = cur_fig.
  start     = cur_fig-body1.

  CASE temp_fig1-name.
    WHEN 'LINE1'.
      cur_fig = line2.
      shft    = - ( w1 * 2 + w2 - 2 ) .
    WHEN 'LINE2'.
      cur_fig = line1.
      shft    = w1 * 2 - w2 .
    WHEN 'LZZ1'.
      cur_fig = lzz2.
      shft    = w1 - w2 .
    WHEN 'LZZ2'.
      cur_fig = lzz1.
      shft    = w2 - w1 - w1 .
    WHEN 'RZZ1'.
      cur_fig = rzz2.
      shft    = w1 - w2 - 1 .
    WHEN 'RZZ2'.
      cur_fig = rzz1.
      shft    = w2 - w1 - w1 + 1.
    WHEN 'TRI1'.
      cur_fig = tri2.
      shft    = - w2 + 1 .
    WHEN 'TRI2'.
      cur_fig = tri3.
      shft    = w1 - w2 .
    WHEN 'TRI3'.
      cur_fig = tri4.
      shft    = - w1 - w2 + 1 .
    WHEN 'TRI4'.
      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 2 .
  ENDCASE.

  cur_fig-body1 = start + cur_fig-body1 + shft. "- temp_fig1-body1.
  cur_fig-body2 = start + cur_fig-body2 + shft. "- temp_fig1-body2.
  cur_fig-body3 = start + cur_fig-body3 + shft. "- temp_fig1-body3.
  cur_fig-body4 = start + cur_fig-body4 + shft. "- temp_fig1-body4.

  PERFORM check_pos CHANGING err1.
  IF err1 = 'X'.
    cur_fig = temp_fig1.
  ENDIF.
ENDFORM.
*---------------------------------------------------------------------*
*       FORM fig_append
*---------------------------------------------------------------------*
FORM fig_append.

  MODIFY stack FROM w_typ INDEX cur_fig-body1.
  MODIFY stack FROM w_typ INDEX cur_fig-body2.
  MODIFY stack FROM w_typ INDEX cur_fig-body3.
  MODIFY stack FROM w_typ INDEX cur_fig-body4.

ENDFORM.
*---------------------------------------------------------------------*
*       FORM check_full_line
*---------------------------------------------------------------------*
FORM check_full_line.

  CLEAR:  cl, n1, n2, outst, ix, s10, sw, linct.
  sw = st_width - 2.
  CLEAR outst.
  LOOP AT stack INTO st.
    linct = sy-tabix MOD st_width .
    IF linct = 1.
      ix = sy-tabix.
      s10 = ix + st_width - 1.
    ENDIF.
    CONCATENATE outst st INTO outst.
    IF linct = 0.
      SEARCH outst FOR ','.
      IF sy-subrc NE 0.
        DELETE stack FROM ix TO s10.
        ADD 1 TO cl.
      ENDIF.
      CLEAR outst.
    ENDIF.
  ENDLOOP.

  CLEAR: n1, n2.

  DO cl TIMES.
    ADD 10 TO n1.
    ADD n1 TO n2.
    INSERT 'O' INTO stack INDEX 1.
    DO sw TIMES.
      INSERT ',' INTO stack INDEX 1.
    ENDDO.
    INSERT 'O' INTO stack INDEX 1.
  ENDDO.
  ADD n2 TO scores.
ENDFORM.

include ZTETRIS_I 代码:

*---------------------------------------------------------------------*
*   INCLUDE ZTETRIS_I
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
*       MODULE exx INPUT
*---------------------------------------------------------------------*
MODULE exx INPUT.
  LEAVE PROGRAM.
ENDMODULE.

include ZTETRIS_O 代码:

*---------------------------------------------------------------------*
*   INCLUDE ZTETRIS_O
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
*       MODULE status_0100 OUTPUT
*---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  PERFORM out.
  LEAVE TO LIST-PROCESSING AND RETURN TO SCREEN 100.
  LEAVE SCREEN.
ENDMODULE.

新建一个 id 为 100 的 dynpro screen:
用 SAP ABAP 编写的俄罗斯游戏

新建一个 PF STATUS:

用 SAP ABAP 编写的俄罗斯游戏

function key 明细如下:
用 SAP ABAP 编写的俄罗斯游戏

用 SAP ABAP 编写的俄罗斯游戏

更多Jerry的原创文章,尽在:"汪子熙":
用 SAP ABAP 编写的俄罗斯游戏

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
34.TCP取样器
阅读文本大概需要3分钟。1、TCP取样器的作用   TCP取样器作用就是通过TCP/IP协议来连接服务器,然后发送数据和接收数据。2、TCP取样器详解!(https://oscimg.oschina.net/oscnet/32a9b19ba1db00f321d22a0f33bcfb68a0d.png)TCPClien
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这