*---------------------------------------------------------------------* 
* 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 1 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 * 2 w2 - 2 ) . "-28
WHEN 'LINE2' .
cur_fig = line1 .
shft = w * 2 - 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 - 1 .
WHEN 'RZZ2' .
cur_fig = rzz1 .
shft = w2 - w - w 1 .
WHEN 'TRI1' .
cur_fig = tri2 .
shft = - w2 1 .
WHEN 'TRI2' .
cur_fig = tri3 .
shft = w - w2 .
WHEN 'TRI3' .
cur_fig = tri4 .
shft = - w - 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_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 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 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