Chinaunix首页 | 论坛 | 博客
  • 博客访问: 85475
  • 博文数量: 26
  • 博客积分: 1415
  • 博客等级: 上尉
  • 技术积分: 302
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-10 10:04
文章分类
文章存档

2011年(2)

2010年(24)

我的朋友

分类:

2010-11-12 11:36:34

 

*&---------------------------------------------------------------------*
*& report zit001 *
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*

* to install tetris:
* 1) create program and place all this text in it.
* 2) create standart screen 100 and insert this part
*------------------------------------------------------------*
* process before output.
* module status_0100.
*
* process after input.
* module exx at exit-command.
* module user_command_0100.
*------------------------------------------------------------*
* 3) create gui-status status_0 and insert
* 3.1) free functional keys
*------------------------------------------------------------*
* f5 pf21 drop (f5)
* f6 pf22 left (f6)
* f7 pf23 rotate(f7)
* f8 pf24 right (f8)
* shift-f1 pf25 return
* shift-f6 pf26 down
*------------------------------------------------------------*
* 3.2) buttons
*------------------------------------------------------------*
* pf21 pf22 pf23 pf24
* drop (f5) left (f6) rotate(f7) right (f8)
*------------------------------------------------------------*
* 3.3) and as usual standart functions ;-)
* back up exit
*------------------------------------------------------------*
* 4) activate it and enjoy! ;-)


* 5) if you want to try delays less then one second,
* create functional module like this, and comment/uncomment
* calls and recieves in the forms "f_call_rfc_wait" and "f_task_end".
*------------------------------------------------------------*
* function z_nbcsh_delay .
* *"------------------------------------------------------------
* *" importing
* *" value(delay) type f default 1
* *"------------------------------------------------------------
* wait up to delay seconds.
* endfunction.
*------------------------------------------------------------*

report zit001.

DATA count TYPE i.
DATA scores TYPE i.
TYPES: BEGIN OF outtype ,
line TYPE char20,
END OF outtype.
DATA outtab TYPE outtype OCCURS WITH HEADER LINE.
*---------------------------------------------------------------------*
DATA: stakan TYPE 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 VALUE 12, st_height TYPE 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."DROP方块一下到底SHIFT+F6
  CLEAR: err, count.
  DO.
    PERFORM fig_move USING 'DOWN' CHANGING err."参数值ERR带回碰撞检测值
    IF err EQ 'X'.
      EXIT.
    ENDIF.
*    ADD 1 TO COUNT."原程序DROP有加分,没?梦胰サ袅?
  ENDDO.
*  ADD COUNT TO SCORES."计分
  PERFORM out."屏幕输出
  PERFORM f_call_rfc_wait."定时刷新


AT PF22."F6 LEFT左
  PERFORM fig_move USING 'LEFT' CHANGING err."调用方块移动子程序
  PERFORM out."屏幕显示
  PERFORM f_call_rfc_wait."方块自动下落刷新,这里设时间为1秒

AT PF23."F7 ROTATE转
  PERFORM fig_rotate."图形旋转
  PERFORM out.
  PERFORM f_call_rfc_wait.

AT PF24."F8 RIGHT右
  PERFORM fig_move USING 'RIGHT' CHANGING err.
  PERFORM out.
  PERFORM f_call_rfc_wait.

  AT PF25." RETURN                                                 "SHIFT+F1
* SET USER-COMMAND "PF21".
    CALL METHOD cl_gui_cfw=>set_new_ok_code
      EXPORTING
        new_code = 'PF21'.
    LEAVE LIST-PROCESSING.

    AT PF26."F5 DOWN缓下
      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 'SCORE:'."显示得分
  WRITE scores LEFT-JUSTIFIED."20位的数字选择左对齐,不然前面都是空
  LOOP AT stakan_out INTO st.
*    IF SY-TABIX LE OTSTUP."原程序语句,与FIG_MOVE内INIT项对应使用,感觉多余,注释掉
*      CONTINUE.
*    ENDIF.
    lc = sy-tabix MOD st_width ."循环值对宽取余
    CASE st.
      WHEN ','. so = '∷'."内表中字符代换为要输出字符,这代表空
      WHEN 'O'. so = '□'."框
      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 2(24) outstring."屏幕显示的24列

* WRITE OUTSTRING+1(ST_WIDTH) INVERSE ON .
* WRITE: OUTSTRING(1).
* WRITE: OUTSTRING .
      CLEAR outstring."清空
    ENDIF.
  ENDLOOP.

ENDFORM.                    "OUT
*---------------------------------------------------------------------*
* 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.

  CALL FUNCTION 'RFC_PING_AND_WAIT' STARTING NEW TASK '001' "调用计时RFC函数
    PERFORMING f_task_end ON END OF TASK "结束任务后执行子程序F_TASK_END
    EXPORTING
      seconds               = " REFRESH TIME 1秒
      busy_waiting          = space
    EXCEPTIONS
      RESOURCE_FAILURE      = 1
      communication_failure = 2  MESSAGE lv_mssg
      system_failure        = 3  MESSAGE lv_mssg
      OTHERS                4.
  SET USER-COMMAND 'PF25'."RETURN
ENDFORM. " F_CALL_RFC_WAIT
*---------------------------------------------------------------------*
* FORM F_TASK_END
*---------------------------------------------------------------------*
FORM f_task_end USING u_taskname.

  DATA lv_mssg(80).                                         "#EC NEEDED

* RECEIVING TASK RESULTS
* YOU NEED TO CREATE FUNCTIONAL MODULE "Z_NBCSH_DELAY"
* TO TRY DELAY LESS THEN 1 SECOND
  RECEIVE RESULTS FROM FUNCTION 'RFC_PING_AND_WAIT' "接受RFC返回值
* RECEIVE RESULTS FROM FUNCTION "Z_NBCSH_DELAY"
  EXCEPTIONS
  RESOURCE_FAILURE = 1
  communication_failure = MESSAGE lv_mssg
  system_failure = MESSAGE lv_mssg
  OTHERS 4.

  CHECK sy-subrc EQ 0."接受成功,则
  SET USER-COMMAND 'PF26'"方块自动下落,到底后行检查,出现下个方块,这步【关键】

ENDFORM. " F_TASK_END
*************** END OF PROGRAM ZNBCSH_TETRIS *********************
*&---------------------------------------------------------------------*
*& MODULE STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
* SET PF-STATUS "STATUS_0".
*CALL METHOD CL_GUI_CFW=>SET_NEW_OK_CODE
* EXPORTING NEW_CODE = "PF21".
* WRITE "PRESS TO BEGIN".
  PERFORM out."屏幕输出
  LEAVE TO LIST-PROCESSING AND RETURN TO SCREEN 100.
  LEAVE SCREEN."离开屏幕

* 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 TYPE i.
  DATA 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 + + w.
  lzz1-body4 = s + + 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 + + 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 + + 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 - + 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 - + 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 - + 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.                    "INIT_FIGURES
*---------------------------------------------------------------------*
* FORM INIT_STAKAN_ZAD *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM init_stakan."初始化框
  DATA size_v TYPE i.
  DATA size_h TYPE i.

  size_v = st_height + ."24
  size_h = st_width - 2."10
  CLEAR stakan.
  DO size_v TIMES.
    APPEND 'O' TO stakan."O表示边框
    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.                    "INIT_STAKAN

*---------------------------------------------------------------------*
* 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."INIT指初始位置,开始看成了旋转郁闷,看了我好久
  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.                    "PUT_NEXT_FIG
*---------------------------------------------------------------------*
* 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."原程序语句,多余
      shft = 0.
  ENDCASE.

  ADD shft TO cur_fig-body1."值相加实现移动
  ADD shft TO cur_fig-body2.
  ADD shft TO cur_fig-body3.
  ADD shft TO cur_fig-body4.

  PERFORM check_pos CHANGING error."位置碰撞检查

  IF NOT error IS INITIAL.
    cur_fig = temp_fig.
* PERFORM RESTORE_POS.
  ENDIF.
ENDFORM.                    "FIG_MOVE

*---------------------------------------------------------------------*
* FORM CHECK_POS *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> ERROR *
*---------------------------------------------------------------------*
FORM check_pos CHANGING error TYPE char1."碰撞检查子程序
  DATA: v_pos TYPE i, h_pos TYPE i.

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

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

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

    READ TABLE stakan INTO st INDEX cur_fig-body4.
    IF st NE ','.
      error = 'X'. EXIT.
    ENDIF.
  ENDDO.
ENDFORM.                    "CHECK_POS


*&---------------------------------------------------------------------*
*& FORM FIG_ROTATE
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
* --> P1 TEXT
* <-- P2 TEXT
*----------------------------------------------------------------------*
FORM fig_rotate."方块旋转子程序
  DATA error.
  DATA: start TYPE i, shft TYPE i.
  DATA temp_fig LIKE cur_fig.
  DATA: w TYPE i, w2 TYPE i.
  w = st_width."12
  w2 = st_width DIV 2."6
  temp_fig = cur_fig.

  start = cur_fig-body1.
  CASE temp_fig-name."这里要据方块类形,进行旋转前后位置的计算
    WHEN 'LINE1'.
      cur_fig = line2.
      shft = - ( w * + w2 - ) ."-28
    WHEN 'LINE2'.
      cur_fig = line1.
      shft = w * - w2 .
    WHEN 'LZZ1'.
      cur_fig = lzz2.
      shft = w - w2 .
    WHEN 'LZZ2'.
      cur_fig = lzz1.
      shft = w2 - w - w .
    WHEN 'RZZ1'.
      cur_fig = rzz2.
      shft = w - w2 - .
    WHEN 'RZZ2'.
      cur_fig = rzz1.
      shft = w2 - w - w + 1.
    WHEN 'TRI1'.
      cur_fig = tri2.
      shft = - w2 + .
    WHEN 'TRI2'.
      cur_fig = tri3.
      shft = w - w2 .
    WHEN 'TRI3'.
      cur_fig = tri4.
      shft = - w - w2 + .
    WHEN 'TRI4'.
      cur_fig = tri1.
      shft = - w2 .
    WHEN 'LGG1'.
      cur_fig = lgg2.
      shft = - w2 + .
    WHEN 'LGG2'.
      cur_fig = lgg3.
      shft = - w2 .
    WHEN 'LGG3'.
      cur_fig = lgg4.
      shft = - w2 .
    WHEN 'LGG4'.
      cur_fig = lgg1.
      shft = - w2 - .
    WHEN 'RGG1'.
      cur_fig = rgg2.
      shft = - w2 .
    WHEN 'RGG2'.
      cur_fig = rgg3.
      shft = - w2 .
    WHEN 'RGG3'.
      cur_fig = rgg4.
      shft = - w2 + .
    WHEN 'RGG4'.
      cur_fig = rgg1.
      shft = - w2 .
    WHEN 'SQUARE'.
      cur_fig = square.
      shft = - st_width DIV .
  ENDCASE.
  cur_fig-body1 = start + cur_fig-body1 + shft. "- TEMP_FIG-BODY1.
  cur_fig-body2 = start + cur_fig-body2 + shft. "- TEMP_FIG-BODY2.
  cur_fig-body3 = start + cur_fig-body3 + shft. "- TEMP_FIG-BODY3.
  cur_fig-body4 = start + cur_fig-body4 + shft. "- TEMP_FIG-BODY4.

  PERFORM check_pos CHANGING error.
  IF error = 'X'.
    cur_fig = temp_fig.
  ENDIF.
ENDFORM. " FIG_ROTATE
*&---------------------------------------------------------------------*
*& FORM FIG_APPEND
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
* --> P1 TEXT
* <-- P2 TEXT
*----------------------------------------------------------------------*
FORM fig_append.
  MODIFY stakan FROM 'X' INDEX cur_fig-body1."将方块添加到内表中
  MODIFY stakan FROM 'X' INDEX cur_fig-body2.
  MODIFY stakan FROM 'X' INDEX cur_fig-body3.
  MODIFY stakan FROM 'X' INDEX cur_fig-body4.
ENDFORM. " FIG_APPEND
*&---------------------------------------------------------------------*
*& FORM CHECK_FULL_LINE
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
* --> P1 TEXT
* <-- 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 TO s10.
        ADD 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 TWO, 10+20+30 FOR THREE...
    INSERT 'O' INTO stakan INDEX 1.
    DO sw TIMES.
      INSERT ',' INTO stakan INDEX 1.
    ENDDO.
    INSERT 'O' INTO stakan INDEX 1.
  ENDDO.
  ADD n2 TO scores."根据消去的行计算得分
ENDFORM. " CHECK_FULL_LINE
阅读(1979) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

zujianxing2016-06-15 16:01:44

厉害,感谢分享