ABAP开发 扫雷小游戏
ABAP语言主要是服务于SAP的业务开发,虽然和JAVA类似,但是局限性比较大,开发游戏这类逻辑复杂的项目的话,相对比较繁琐
闲时尝试着拿ABAP开发一款Windows的扫雷小游戏,打发无聊...直接复制代码就能使用
REPORT ZGAME_SAOLEI.
DATA GV_OKCODE TYPE SY-UCOMM .
DATA: SELECT TYPE C LENGTH 20 ,"选择难度
TIME TYPE C LENGTH 10,
SHENGYU TYPE I .
DATA GV_INDEX TYPE N LENGTH 2 .
DATA: GV_ROW TYPE I ,"行数
GV_COL TYPE I ,"列数
GV_LEI TYPE C LENGTH 3,"雷的个数
GV_LEI_DO TYPE C LENGTH 3."雷的个数
DATA: GV_RANDNUMMAX TYPE I,
GV_RANDNUM TYPE I.
DATA: BEGIN OF GT_POS OCCURS 0,
ROW TYPE C LENGTH 2,
COL TYPE C LENGTH 2,
END OF GT_POS .
*DATA GT_MAIN TYPE TABLE OF ZTEST_TABLE.
*DATA GS_MAIN TYPE ZTEST_TABLE.
DATA GO_TIMER TYPE REF TO CL_GUI_TIMER . "时间控制
DATA GT_FIELDCAT TYPE LVC_T_FCAT. "fieldcat
DATA GT_FIELDCAT_MAIN TYPE SLIS_T_FIELDCAT_ALV. "fieldcat
DATA GS_FIELDCAT_MAIN TYPE SLIS_FIELDCAT_ALV. "fieldcat
DATA GT_FIELDCAT_MAIN2 TYPE LVC_T_FCAT. "fieldcat
DATA GS_FIELDCAT TYPE LVC_S_FCAT. "fieldcat 工作区
DATA GV_FIELDCAT TYPE C LENGTH 20 .
DATA GV_COLN TYPE C LENGTH 20 .
FIELD-SYMBOLS: <FT_TB> TYPE STANDARD TABLE , " 动态内表
<FS_TB> TYPE ANY , " 工作区
<DYN_TBFIELD> TYPE ANY , "动态内表字段
<DYN_MAIN> TYPE ANY . "主表字段
FIELD-SYMBOLS: <FS_CELL> TYPE LVC_S_STYL .
DATA GT_CELL TYPE LVC_T_STYL .
DATA GS_CELL TYPE LVC_S_STYL .
DATA GV_POS TYPE I .
DEFINE __BUILDFIELDCAT. "宏 构建fieldcat
CLEAR GS_FIELDCAT .
GV_POS = GV_POS + 1.
GS_FIELDCAT-FIELDNAME = &1.
GS_FIELDCAT-SCRTEXT_L = &2.
GS_FIELDCAT-OUTPUTLEN = 4.
APPEND GS_FIELDCAT TO GT_FIELDCAT .
END-OF-DEFINITION.
"ALV DEFINE
DATA: GS_LAYOUT TYPE LVC_S_LAYO,
GO_DOCKING TYPE REF TO CL_GUI_DOCKING_CONTAINER,
GO_PARENT TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
GO_ALV_GRID TYPE REF TO CL_GUI_ALV_GRID .
DATA:BEGIN OF GT_MAIN OCCURS 0 ,
FLD_01 TYPE C LENGTH 4,
FLD_02 TYPE C LENGTH 4,
FLD_03 TYPE C LENGTH 4,
FLD_04 TYPE C LENGTH 4,
FLD_05 TYPE C LENGTH 4,
FLD_06 TYPE C LENGTH 4,
FLD_07 TYPE C LENGTH 4,
FLD_08 TYPE C LENGTH 4,
FLD_09 TYPE C LENGTH 4,
FLD_10 TYPE C LENGTH 4,
FLD_11 TYPE C LENGTH 4,
FLD_12 TYPE C LENGTH 4,
FLD_13 TYPE C LENGTH 4,
FLD_14 TYPE C LENGTH 4,
FLD_15 TYPE C LENGTH 4,
FLD_16 TYPE C LENGTH 4,
FLD_17 TYPE C LENGTH 4,
FLD_18 TYPE C LENGTH 4,
FLD_19 TYPE C LENGTH 4,
FLD_20 TYPE C LENGTH 4,
CELLBTN TYPE LVC_T_STYL,
END OF GT_MAIN .
DATA GT_DATABASE LIKE GT_MAIN OCCURS 0.
DATA GS_DATABASE LIKE LINE OF GT_DATABASE .
CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED .
DATA EVENT_HANDLER TYPE REF TO LCL_EVENT_RECEIVER .
CLASS LCL_EVENT_RECEIVER DEFINITION.
PUBLIC SECTION .
METHODS: HANDLE_BUTTON_CLICK FOR EVENT BUTTON_CLICK
OF CL_GUI_ALV_GRID
IMPORTING ES_COL_ID
ES_ROW_NO,
HANDLE_TIMER FOR EVENT FINISHED OF CL_GUI_TIMER.
ENDCLASS .
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.
*BUTTON_CLICK.
METHOD HANDLE_BUTTON_CLICK.
PERFORM FM_BUTTON_CLICK USING ES_COL_ID
ES_ROW_NO.
ENDMETHOD.
METHOD HANDLE_TIMER.
CALL METHOD CL_GUI_CFW=>SET_NEW_OK_CODE
EXPORTING
NEW_CODE = 'RFSH'.
CALL METHOD GO_TIMER->RUN "
EXCEPTIONS
OTHERS = 9.
ENDMETHOD. "handle_timer
ENDCLASS .
CONSTANTS:
GC_SURE TYPE C LENGTH 5 VALUE 'START',
GC_LOW TYPE C LENGTH 3 VALUE 'LOW',
GC_MEDIUM TYPE C LENGTH 6 VALUE 'MEDIUM',
GC_HIGH TYPE C LENGTH 4 VALUE 'HIGH',
GC_MAST TYPE C LENGTH 4 VALUE 'MAST',
GC_OK TYPE C LENGTH 2 VALUE 'OK',
GC_EXIT TYPE C LENGTH 4 VALUE 'EXIT',
GC_BACK TYPE C LENGTH 4 VALUE 'BACK',
GC_CANCEL TYPE C LENGTH 6 VALUE 'CANCEL'.
*INCLUDE ZGAME_SAOLEITOP.
*INCLUDE ZGAME_SAOLEISCR.
*INCLUDE ZGAME_SAOLEICLS.
*INCLUDE ZGAME_SAOLEII01.
*INCLUDE ZGAME_SAOLEIO01.
*INCLUDE ZGAME_SAOLEIF01.
*INCLUDE ZGAME_SAOLEIF02.
START-OF-SELECTION .
CALL SCREEN 0100 .
PERFORM INIT_TIMER_PROGRESS.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'STATUS_100'.
SET TITLEBAR '难度选择'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
CASE GV_OKCODE.
WHEN GC_SURE.
PERFORM BUILS_DYTABLE .
CALL SCREEN 200 STARTING AT 30 2
ENDING AT 145 30.
WHEN GC_CANCEL OR GC_BACK.
LEAVE TO SCREEN 0 .
WHEN GC_LOW.
SELECT = '10*10 雷数 10'.
WHEN GC_MEDIUM.
SELECT = '16*16 雷数 40'.
WHEN GC_HIGH.
SELECT = '16*13 雷数 99'.
WHEN GC_MAST.
SELECT = '20*20 雷数 150'.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module STATUS_0200 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE STATUS_0200 OUTPUT.
SET PF-STATUS 'STATUS_0200'.
SET TITLEBAR '游戏界面'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0200 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0200 INPUT.
CASE GV_OKCODE.
WHEN GC_OK.
WHEN GC_EXIT.
LEAVE PROGRAM .
WHEN 'NEXT'.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form BUILS_DYTABLE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM BUILS_DYTABLE .
DATA LV_LEN TYPE I .
GV_ROW = SELECT+0(2).
GV_COL = SELECT+3(2).
LV_LEN = STRLEN( SELECT ).
SHENGYU = GV_ROW * GV_COL .
IF LV_LEN EQ 11.
GV_LEI = SELECT+9(2).
ELSE.
GV_LEI = SELECT+9(3).
ENDIF.
IF GO_PARENT IS BOUND.
CALL METHOD GO_ALV_GRID->free
EXCEPTIONS
cntl_system_error = 1
cntl_error = 2.
CALL METHOD GO_PARENT->free
EXCEPTIONS
cntl_system_error = 1
cntl_error = 2.
IF sy-subrc <> 0.
MESSAGE a000(db).
ENDIF.
CLEAR EVENT_HANDLER .
ENDIF.
PERFORM GET_DATA . "获得主数据
PERFORM BUILD_FIELDCAT . "构建动态fieldcat
PERFORM BUILD_DYNAMIC_TABLE."构建动态内表
PERFORM ADD_DATA. "向动态内表添加数据
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM GET_DATA .
CLEAR: GT_POS, GV_RANDNUMMAX .
GV_RANDNUMMAX = GV_ROW.
DATA LT_POS LIKE GT_POS OCCURS 0 .
"根据雷的个数随机确定雷的位置 横坐标
GV_LEI_DO = GV_LEI .
PERFORM SET_POS_LEI .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM BUILD_FIELDCAT .
DATA LV_INDEX TYPE N LENGTH 2 .
CLEAR GT_FIELDCAT[] .
DO GV_ROW TIMES.
LV_INDEX = SY-INDEX .
CONCATENATE 'FLD_' LV_INDEX INTO GV_FIELDCAT .
__BUILDFIELDCAT GV_FIELDCAT LV_INDEX .
ENDDO.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form BUILD_DYNAMIC_TABLE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM BUILD_DYNAMIC_TABLE .
DATA LT_DYTABLE TYPE REF TO DATA.
DATA LS_DYTABLE TYPE REF TO DATA.
CLEAR: LT_DYTABLE ,LS_DYTABLE .
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
* I_STYLE_TABLE =
IT_FIELDCATALOG = GT_FIELDCAT
* I_LENGTH_IN_BYTE =
IMPORTING
EP_TABLE = LT_DYTABLE
* E_STYLE_FNAME =
EXCEPTIONS
GENERATE_SUBPOOL_DIR_FULL = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
IF <FT_TB> IS ASSIGNED.
UNASSIGN <FT_TB>.
UNASSIGN <FS_TB>.
ENDIF.
ASSIGN LT_DYTABLE->* TO <FT_TB> .
CREATE DATA LS_DYTABLE LIKE LINE OF <FT_TB>.
ASSIGN LS_DYTABLE->* TO <FS_TB> .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form ADD_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM ADD_DATA .
DATA LV_TABIX TYPE N LENGTH 2.
DATA LV_INDEX TYPE N LENGTH 2.
DATA LV_FIELDCAT TYPE C LENGTH 10.
DATA LS_POS LIKE LINE OF GT_POS .
DO GV_COL TIMES.
APPEND INITIAL LINE TO <FT_TB> .
ENDDO.
LOOP AT GT_POS INTO DATA(GS_POS).
MOVE-CORRESPONDING GS_POS TO LS_POS .
IF LS_POS-COL < 10.
LV_TABIX = '0' && LS_POS-COL .
ELSE.
LV_TABIX = LS_POS-COL .
ENDIF.
CONCATENATE 'FLD_' LV_TABIX INTO LV_FIELDCAT .
ASSIGN COMPONENT LV_FIELDCAT OF STRUCTURE <FS_TB> TO <DYN_TBFIELD>.
IF SY-SUBRC EQ 0.
<DYN_TBFIELD> = '9' .
ENDIF.
AT END OF ROW .
MODIFY <FT_TB> FROM <FS_TB> INDEX LS_POS-ROW.
CLEAR <FS_TB> .
ENDAT .
ENDLOOP.
DATA LV_FRO TYPE N LENGTH 2.
DATA LV_AFT TYPE N LENGTH 2.
DATA LV_ROW TYPE I .
DO GV_ROW TIMES.
LV_ROW = SY-INDEX .
DO GV_COL TIMES.
READ TABLE <FT_TB> ASSIGNING FIELD-SYMBOL(<FS_TAB>) INDEX LV_ROW .
LV_TABIX = SY-INDEX .
CONCATENATE 'FLD_' LV_TABIX INTO LV_FIELDCAT .
IF <DYN_TBFIELD> IS ASSIGNED.
UNASSIGN <DYN_TBFIELD> .
ENDIF.
ASSIGN COMPONENT LV_FIELDCAT
OF STRUCTURE <FS_TAB> TO <DYN_TBFIELD>.
IF SY-SUBRC EQ 0 AND <DYN_TBFIELD> EQ 9 .
CLEAR LV_FRO .
LV_FRO = LV_TABIX - 1 .
CONCATENATE 'FLD_' LV_FRO INTO LV_FIELDCAT .
IF <DYN_TBFIELD> IS ASSIGNED.
UNASSIGN <DYN_TBFIELD> .
ENDIF.
ASSIGN COMPONENT LV_FIELDCAT
OF STRUCTURE <FS_TAB> TO <DYN_TBFIELD>.
IF SY-SUBRC EQ 0 AND <DYN_TBFIELD> NE 9 .
<DYN_TBFIELD> = <DYN_TBFIELD> + 1 .
ENDIF.
SY-SUBRC = 0 .
CLEAR LV_AFT .
LV_AFT = LV_TABIX + 1 .
CONCATENATE 'FLD_' LV_AFT INTO LV_FIELDCAT .
IF <DYN_TBFIELD> IS ASSIGNED.
UNASSIGN <DYN_TBFIELD> .
ENDIF.
ASSIGN COMPONENT LV_FIELDCAT
OF STRUCTURE <FS_TAB> TO <DYN_TBFIELD>.
IF SY-SUBRC EQ 0 AND <DYN_TBFIELD> NE 9 .
<DYN_TBFIELD> = <DYN_TBFIELD> + 1 .
ENDIF.
SY-SUBRC = 0 .
" 读取以雷为中心的上面三行数据的值
LV_INDEX = LV_ROW - 1 .
READ TABLE <FT_TB> ASSIGNING <FS_TAB> INDEX LV_INDEX.
IF SY-SUBRC EQ 0.
CONCATENATE 'FLD_' LV_TABIX INTO LV_FIELDCAT .
IF <DYN_TBFIELD> IS ASSIGNED.
UNASSIGN <DYN_TBFIELD> .
ENDIF.
ASSIGN COMPONENT LV_FIELDCAT
OF STRUCTURE <FS_TAB> TO <DYN_TBFIELD>.
IF SY-SUBRC EQ 0 AND <DYN_TBFIELD> NE 9 .
<DYN_TBFIELD> = <DYN_TBFIELD> + 1 .
ENDIF.
SY-SUBRC = 0 .
CLEAR LV_FRO .
LV_FRO = LV_TABIX - 1 .
CONCATENATE 'FLD_' LV_FRO INTO LV_FIELDCAT .
IF <DYN_TBFIELD> IS ASSIGNED.
UNASSIGN <DYN_TBFIELD> .
ENDIF.
ASSIGN COMPONENT LV_FIELDCAT
OF STRUCTURE <FS_TAB> TO <DYN_TBFIELD>.
IF SY-SUBRC EQ 0 AND <DYN_TBFIELD> NE 9 .
<DYN_TBFIELD> = <DYN_TBFIELD> + 1 .
ENDIF.
SY-SUBRC = 0 .
CLEAR LV_AFT .
LV_AFT = LV_TABIX + 1 .
CONCATENATE 'FLD_' LV_AFT INTO LV_FIELDCAT .
IF <DYN_TBFIELD> IS ASSIGNED.
UNASSIGN <DYN_TBFIELD> .
ENDIF.
ASSIGN COMPONENT LV_FIELDCAT
OF STRUCTURE <FS_TAB> TO <DYN_TBFIELD>.
IF SY-SUBRC EQ 0 AND <DYN_TBFIELD> NE 9 .
<DYN_TBFIELD> = <DYN_TBFIELD> + 1 .
ENDIF.
ENDIF.
SY-SUBRC = 0 .
"读取以雷为中心下面三行的数据
LV_INDEX = LV_ROW + 1.
READ TABLE <FT_TB> ASSIGNING <FS_TAB> INDEX LV_INDEX.
IF SY-SUBRC = 0 .
CONCATENATE 'FLD_' LV_TABIX INTO LV_FIELDCAT .
IF <DYN_TBFIELD> IS ASSIGNED.
UNASSIGN <DYN_TBFIELD> .
ENDIF.
ASSIGN COMPONENT LV_FIELDCAT
OF STRUCTURE <FS_TAB> TO <DYN_TBFIELD>.
IF SY-SUBRC EQ 0 AND <DYN_TBFIELD> NE 9 .
<DYN_TBFIELD> = <DYN_TBFIELD> + 1 .
ENDIF.
SY-SUBRC = 0 .
CLEAR LV_FRO .
LV_FRO = LV_TABIX - 1 .
CONCATENATE 'FLD_' LV_FRO INTO LV_FIELDCAT .
IF <DYN_TBFIELD> IS ASSIGNED.
UNASSIGN <DYN_TBFIELD> .
ENDIF.
ASSIGN COMPONENT LV_FIELDCAT
OF STRUCTURE <FS_TAB> TO <DYN_TBFIELD>.
IF SY-SUBRC EQ 0 AND <DYN_TBFIELD> NE 9 .
<DYN_TBFIELD> = <DYN_TBFIELD> + 1 .
ENDIF.
SY-SUBRC = 0 .
CLEAR LV_AFT .
LV_AFT = LV_TABIX + 1 .
CONCATENATE 'FLD_' LV_AFT INTO LV_FIELDCAT .
IF <DYN_TBFIELD> IS ASSIGNED.
UNASSIGN <DYN_TBFIELD> .
ENDIF.
ASSIGN COMPONENT LV_FIELDCAT
OF STRUCTURE <FS_TAB> TO <DYN_TBFIELD>.
IF SY-SUBRC EQ 0 AND <DYN_TBFIELD> NE 9 .
<DYN_TBFIELD> = <DYN_TBFIELD> + 1 .
ENDIF.
ENDIF.
SY-SUBRC = 0 .
ENDIF.
ENDDO.
ENDDO.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FM_BUTTON_CLICK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> ES_COL_ID
*& --> ES_ROW_NO
*&---------------------------------------------------------------------*
FORM FM_BUTTON_CLICK USING PS_COL_ID TYPE LVC_S_COL
PS_ROW_NO TYPE LVC_S_ROID.
DATA: LV_END_TIME TYPE I ,
LV_COST_TIME TYPE I,
LV_TIME TYPE C LENGTH 5,
LV_START_TIME TYPE I VALUE 0 .
"计时器 记录游戏时间
GET RUN TIME FIELD LV_END_TIME.
LV_COST_TIME = ( LV_END_TIME - LV_START_TIME ) / 1000000 .
LV_TIME = LV_COST_TIME .
CONCATENATE LV_TIME 'S' INTO TIME .
DATA LV_FIELDNAME TYPE C LENGTH 6 .
DATA LV_NUM TYPE N LENGTH 2 .
DATA LV_UP TYPE N LENGTH 2 .
DATA LV_DOW TYPE N LENGTH 2 .
*返回行号
LV_DOW = LV_UP = PS_ROW_NO-ROW_ID .
CLEAR GS_DATABASE.
READ TABLE GT_DATABASE INTO GS_DATABASE INDEX PS_ROW_NO-ROW_ID .
ASSIGN COMPONENT PS_COL_ID-FIELDNAME
OF STRUCTURE GS_DATABASE TO <DYN_TBFIELD> .
IF <DYN_TBFIELD> EQ 9.
PERFORM GAME_OVER .
RETURN .
ENDIF.
"递归找最上面的一行
PERFORM GET_UPROW USING PS_ROW_NO-ROW_ID
PS_COL_ID-FIELDNAME
CHANGING LV_UP.
"递归找最下面的一行
PERFORM GET_DOWROW USING PS_ROW_NO-ROW_ID
PS_COL_ID-FIELDNAME
CHANGING LV_DOW.
"从最上面一行到最下面一行向左向右去找
CLEAR GS_DATABASE .
WHILE LV_UP <= LV_DOW.
READ TABLE GT_DATABASE INTO GS_DATABASE INDEX LV_UP .
ASSIGN COMPONENT PS_COL_ID-FIELDNAME
OF STRUCTURE GS_DATABASE TO <DYN_TBFIELD> .
IF <DYN_TBFIELD> NE 9 .
"向左递归,找第一个不为空的区域
LV_NUM = PS_COL_ID-FIELDNAME+4(2) .
PERFORM GET_LEFT USING LV_UP
CHANGING LV_NUM .
"向右递归,找第一个不为空的区域
LV_NUM = PS_COL_ID-FIELDNAME+4(2) .
PERFORM GET_RIGHT USING LV_UP
CHANGING LV_NUM .
SHENGYU = SHENGYU + 1 .
ENDIF.
LV_UP = LV_UP + 1 .
ENDWHILE.
CALL METHOD CL_GUI_CFW=>SET_NEW_OK_CODE
EXPORTING
NEW_CODE = 'NEXT'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module INITALV_0200 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE INITALV_0200 OUTPUT.
IF GO_PARENT IS NOT BOUND.
CREATE OBJECT GO_PARENT
EXPORTING
* PARENT =
CONTAINER_NAME = 'CON01'
* STYLE =
* LIFETIME = lifetime_default
* REPID =
* DYNNR =
* NO_AUTODEF_PROGID_DYNNR =
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5
OTHERS = 6
.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
CREATE OBJECT GO_ALV_GRID
EXPORTING
* I_SHELLSTYLE = 0
* I_LIFETIME =
I_PARENT = GO_PARENT
* I_APPL_EVENTS = SPACE
* I_PARENTDBG =
* I_APPLOGPARENT =
* I_GRAPHICSPARENT =
* I_NAME =
* I_FCAT_COMPLETE = SPACE
* O_PREVIOUS_SRAL_HANDLER =
EXCEPTIONS
ERROR_CNTL_CREATE = 1
ERROR_CNTL_INIT = 2
ERROR_CNTL_LINK = 3
ERROR_DP_CREATE = 4
OTHERS = 5
.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
PERFORM SETEDIT_CELL .
MOVE-CORRESPONDING <FT_TB>[] TO GT_DATABASE[] .
DO GV_ROW TIMES.
APPEND INITIAL LINE TO GT_MAIN .
ENDDO.
LOOP AT GT_MAIN .
MOVE-CORRESPONDING GT_CELL[] TO GT_MAIN-CELLBTN[] .
MODIFY GT_MAIN .
ENDLOOP.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
I_PROGRAM_NAME = SY-REPID
I_INTERNAL_TABNAME = 'GT_MAIN'
* I_STRUCTURE_NAME =
I_CLIENT_NEVER_DISPLAY = 'X'
I_INCLNAME = SY-REPID
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE =
CHANGING
CT_FIELDCAT = GT_FIELDCAT_MAIN[]
EXCEPTIONS
INCONSISTENT_INTERFACE = 1
PROGRAM_ERROR = 2
OTHERS = 3
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
LOOP AT GT_FIELDCAT_MAIN INTO GS_FIELDCAT_MAIN.
CLEAR GS_FIELDCAT .
* MOVE-CORRESPONDING GS_MFIELDCAT TO GS_FIELDCAT_RESUME .
GS_FIELDCAT-COL_POS = GS_FIELDCAT_MAIN-COL_POS .
GS_FIELDCAT-FIELDNAME = GS_FIELDCAT_MAIN-FIELDNAME .
GS_FIELDCAT-SCRTEXT_L = GS_FIELDCAT_MAIN-SELTEXT_L.
GS_FIELDCAT-SCRTEXT_M = GS_FIELDCAT_MAIN-SELTEXT_M.
GS_FIELDCAT-SCRTEXT_S = GS_FIELDCAT_MAIN-SELTEXT_S.
CASE GS_FIELDCAT-FIELDNAME.
WHEN 'FLD_01' OR 'FLD_02'OR 'FLD_03' OR 'FLD_04' OR 'FLD_05'
OR 'FLD_06' OR 'FLD_07' OR 'FLD_08' OR 'FLD_09' OR 'FLD_10'
OR 'FLD_12' OR 'FLD_13' OR 'FLD_14' OR 'FLD_15' OR 'FLD_16'
OR 'FLD_17' OR 'FLD_18' OR 'FLD_19' OR 'FLD_20' OR 'FLD_11'.
IF GS_FIELDCAT-FIELDNAME+4(2) > GV_COL.
GS_FIELDCAT-NO_OUT = 'X'.
ENDIF.
CASE GS_FIELDCAT-FIELDNAME+4(2).
WHEN '01'.
PERFORM SET_SCRTEXT USING '01'.
WHEN '02'.
PERFORM SET_SCRTEXT USING '02'.
WHEN '03'.
PERFORM SET_SCRTEXT USING '03'.
WHEN '04'.
PERFORM SET_SCRTEXT USING '04'.
WHEN '05'.
PERFORM SET_SCRTEXT USING '05'.
WHEN '06'.
PERFORM SET_SCRTEXT USING '06'.
WHEN '07'.
PERFORM SET_SCRTEXT USING '07'.
WHEN '08'.
PERFORM SET_SCRTEXT USING '08'.
WHEN '09'.
PERFORM SET_SCRTEXT USING '09'.
WHEN '10'.
PERFORM SET_SCRTEXT USING '10'.
WHEN '11'.
PERFORM SET_SCRTEXT USING '11'.
WHEN '12'.
PERFORM SET_SCRTEXT USING '12'.
WHEN '13'.
PERFORM SET_SCRTEXT USING '13'.
WHEN '14'.
PERFORM SET_SCRTEXT USING '14'.
WHEN '15'.
PERFORM SET_SCRTEXT USING '15'.
WHEN '16'.
PERFORM SET_SCRTEXT USING '16'.
WHEN '17'.
PERFORM SET_SCRTEXT USING '17'.
WHEN '18'.
PERFORM SET_SCRTEXT USING '18'.
WHEN '19'.
PERFORM SET_SCRTEXT USING '19'.
WHEN '20'.
PERFORM SET_SCRTEXT USING '20'.
WHEN OTHERS.
ENDCASE.
GS_FIELDCAT-OUTPUTLEN = 3.
WHEN OTHERS.
ENDCASE.
APPEND GS_FIELDCAT TO GT_FIELDCAT_MAIN2 .
ENDLOOP.
GS_LAYOUT-STYLEFNAME = 'CELLBTN'.
CREATE OBJECT EVENT_HANDLER .
SET HANDLER EVENT_HANDLER->HANDLE_BUTTON_CLICK FOR GO_ALV_GRID .
CALL METHOD GO_ALV_GRID->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
* I_BUFFER_ACTIVE =
* I_BYPASSING_BUFFER =
* I_CONSISTENCY_CHECK =
* I_STRUCTURE_NAME =
* IS_VARIANT =
* I_SAVE =
* I_DEFAULT = 'X'
IS_LAYOUT = GS_LAYOUT
* IS_PRINT =
* IT_SPECIAL_GROUPS =
* IT_TOOLBAR_EXCLUDING =
* IT_HYPERLINK =
* IT_ALV_GRAPHICS =
* IT_EXCEPT_QINFO =
* IR_SALV_ADAPTER =
CHANGING
IT_OUTTAB = GT_MAIN[]
IT_FIELDCATALOG = GT_FIELDCAT_MAIN2
* IT_SORT =
* IT_FILTER =
EXCEPTIONS
INVALID_PARAMETER_COMBINATION = 1
PROGRAM_ERROR = 2
TOO_MANY_LINES = 3
OTHERS = 4
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ELSE.
PERFORM REFRESH_ALV USING GO_ALV_GRID.
ENDIF.
ENDMODULE.
FORM SETEDIT_CELL .
DATA LS_CELL TYPE LVC_S_STYL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_01'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_02'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_03'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_04'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_05'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_06'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_07'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_08'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_09'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_10'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_11'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_12'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_13'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_14'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_15'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_16'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_17'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_18'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_19'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
LS_CELL-MAXLEN = 10 .
LS_CELL-FIELDNAME = 'FLD_20'.
LS_CELL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
INSERT LS_CELL INTO TABLE GT_CELL .
CLEAR LS_CELL .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SET_SCRTEXT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_
*&---------------------------------------------------------------------*
FORM SET_SCRTEXT USING P_TXT TYPE CHAR2.
GS_FIELDCAT-SCRTEXT_L = GS_FIELDCAT-SCRTEXT_M
= GS_FIELDCAT-SCRTEXT_S = P_TXT.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_UPROW
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> PS_ROW_NO_ROW_ID
*&---------------------------------------------------------------------*
FORM GET_UPROW USING VALUE(P_ROW_ID)
VALUE(P_FIELDNAME)
CHANGING P_UPROW.
IF P_UPROW < 1.
P_UPROW = 1 .
RETURN .
ENDIF.
READ TABLE GT_DATABASE INTO GS_DATABASE INDEX P_ROW_ID .
IF <DYN_TBFIELD> IS ASSIGNED.
UNASSIGN <DYN_TBFIELD> .
ENDIF.
ASSIGN COMPONENT P_FIELDNAME
OF STRUCTURE GS_DATABASE TO <DYN_TBFIELD> .
IF <DYN_TBFIELD> IS ASSIGNED.
IF <DYN_TBFIELD> IS NOT INITIAL.
RETURN .
ENDIF.
ENDIF.
IF <DYN_TBFIELD> IS INITIAL.
P_ROW_ID = P_ROW_ID - 1 .
P_UPROW = P_UPROW - 1 .
PERFORM GET_UPROW2 USING P_ROW_ID P_FIELDNAME
CHANGING P_UPROW.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_UPROW2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> GET_UPROW
*& --> P_FIELDNAME
*&---------------------------------------------------------------------*
FORM GET_UPROW2 USING VALUE(P_ROW_ID)
VALUE(P_FIELDNAME)
CHANGING P_UPROW .
IF P_UPROW < 1.
P_UPROW = 1 .
RETURN .
ENDIF.
READ TABLE GT_DATABASE INTO GS_DATABASE INDEX P_ROW_ID .
IF <DYN_TBFIELD> IS ASSIGNED.
UNASSIGN <DYN_TBFIELD> .
ENDIF.
ASSIGN COMPONENT P_FIELDNAME
OF STRUCTURE GS_DATABASE TO <DYN_TBFIELD> .
IF <DYN_TBFIELD> IS ASSIGNED.
IF <DYN_TBFIELD> IS NOT INITIAL.
RETURN .
ENDIF.
ENDIF.
IF <DYN_TBFIELD> IS INITIAL.
P_ROW_ID = P_ROW_ID - 1 .
P_UPROW = P_UPROW - 1 .
PERFORM GET_UPROW USING P_ROW_ID P_FIELDNAME
CHANGING P_UPROW.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_DOWROW
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> PS_ROW_NO_ROW_ID
*& --> PS_COL_ID_FIELDNAME
*& <-- LV_DOW
*&---------------------------------------------------------------------*
FORM GET_DOWROW USING VALUE(P_ROW_ID)
VALUE(P_FIELDNAME)
CHANGING P_DOWROW.
IF P_DOWROW > GV_ROW.
P_DOWROW = GV_ROW.
RETURN .
ENDIF.
READ TABLE GT_DATABASE INTO GS_DATABASE INDEX P_ROW_ID .
IF <DYN_TBFIELD> IS ASSIGNED.
UNASSIGN <DYN_TBFIELD> .
ENDIF.
ASSIGN COMPONENT P_FIELDNAME
OF STRUCTURE GS_DATABASE TO <DYN_TBFIELD> .
IF <DYN_TBFIELD> IS ASSIGNED.
IF <DYN_TBFIELD> IS NOT INITIAL.
RETURN .
ENDIF.
ENDIF.
IF <DYN_TBFIELD> IS INITIAL.
P_ROW_ID = P_ROW_ID + 1 .
P_DOWROW = P_DOWROW + 1 .
PERFORM GET_DOWROW2 USING P_ROW_ID P_FIELDNAME
CHANGING P_DOWROW.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_DOWROW2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_ROW_ID
*& --> P_FIELDNAME
*& <-- P_DOWROW
*&---------------------------------------------------------------------*
FORM GET_DOWROW2 USING VALUE(P_ROW_ID)
VALUE(P_FIELDNAME)
CHANGING P_DOWROW.
IF P_DOWROW > GV_ROW.
P_DOWROW = GV_ROW.
RETURN .
ENDIF.
READ TABLE GT_DATABASE INTO GS_DATABASE INDEX P_ROW_ID .
IF <DYN_TBFIELD> IS ASSIGNED.
UNASSIGN <DYN_TBFIELD> .
ENDIF.
ASSIGN COMPONENT P_FIELDNAME
OF STRUCTURE GS_DATABASE TO <DYN_TBFIELD> .
IF <DYN_TBFIELD> IS ASSIGNED.
IF <DYN_TBFIELD> IS NOT INITIAL.
RETURN .
ENDIF.
ENDIF.
IF <DYN_TBFIELD> IS INITIAL.
P_ROW_ID = P_ROW_ID + 1 .
P_DOWROW = P_DOWROW + 1 .
PERFORM GET_DOWROW2 USING P_ROW_ID P_FIELDNAME
CHANGING P_DOWROW.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_LEFT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- PS_COL_ID_FIELDNAME+4(2)
*&---------------------------------------------------------------------*
FORM GET_LEFT USING VALUE(P_INDX)
CHANGING P_NUM LIKE GV_INDEX.
DATA LV_FIELD TYPE C LENGTH 6 .
CONCATENATE 'FLD_' P_NUM INTO LV_FIELD .
IF P_NUM < 1.
P_NUM = 1 .
RETURN .
ENDIF.
IF <DYN_TBFIELD> IS ASSIGNED.
UNASSIGN <DYN_TBFIELD> .
ENDIF.
IF <DYN_MAIN> IS ASSIGNED.
UNASSIGN <DYN_MAIN> .
ENDIF.
READ TABLE GT_MAIN INDEX P_INDX .
ASSIGN COMPONENT LV_FIELD OF STRUCTURE GS_DATABASE TO <DYN_TBFIELD>.
ASSIGN COMPONENT LV_FIELD OF STRUCTURE GT_MAIN TO <DYN_MAIN> .
IF <DYN_TBFIELD> IS INITIAL.
P_NUM = P_NUM - 1 .
SHENGYU = SHENGYU - 1 .
DELETE TABLE GT_MAIN-CELLBTN[] WITH TABLE KEY FIELDNAME = LV_FIELD.
IF SY-SUBRC EQ 0 .
MODIFY GT_MAIN INDEX P_INDX.
ENDIF.
ELSEIF <DYN_TBFIELD> EQ 9 .
RETURN .
ELSE.
<DYN_MAIN> = <DYN_TBFIELD> .
SHENGYU = SHENGYU - 1 .
DELETE TABLE GT_MAIN-CELLBTN[] WITH TABLE KEY FIELDNAME = LV_FIELD.
MODIFY GT_MAIN INDEX P_INDX.
RETURN .
ENDIF.
PERFORM GET_LEFT USING P_INDX
CHANGING P_NUM .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_RIGHT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- LV_NUM
*&---------------------------------------------------------------------*
FORM GET_RIGHT USING P_INDX
CHANGING P_NUM LIKE GV_INDEX.
DATA LV_FIELD TYPE C LENGTH 6 .
CONCATENATE 'FLD_' P_NUM INTO LV_FIELD .
IF P_NUM > GV_COL.
P_NUM = GV_COL .
RETURN .
ENDIF.
IF <DYN_TBFIELD> IS ASSIGNED.
UNASSIGN <DYN_TBFIELD> .
ENDIF.
IF <DYN_MAIN> IS ASSIGNED.
UNASSIGN <DYN_MAIN> .
ENDIF.
READ TABLE GT_MAIN INDEX P_INDX .
ASSIGN COMPONENT LV_FIELD OF STRUCTURE GS_DATABASE TO <DYN_TBFIELD>.
ASSIGN COMPONENT LV_FIELD OF STRUCTURE GT_MAIN TO <DYN_MAIN> .
IF <DYN_TBFIELD> IS INITIAL.
P_NUM = P_NUM + 1 .
SHENGYU = SHENGYU - 1 .
DELETE TABLE GT_MAIN-CELLBTN WITH TABLE KEY FIELDNAME = LV_FIELD.
MODIFY GT_MAIN INDEX P_INDX.
ELSEIF <DYN_TBFIELD> EQ 9 .
RETURN .
ELSE.
<DYN_MAIN> = <DYN_TBFIELD> .
SHENGYU = SHENGYU - 1 .
DELETE TABLE GT_MAIN-CELLBTN[] WITH TABLE KEY FIELDNAME = LV_FIELD.
MODIFY GT_MAIN INDEX P_INDX.
RETURN .
ENDIF.
PERFORM GET_RIGHT USING P_INDX
CHANGING P_NUM.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form REFRESH_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> GO_ALV_GRID
*&---------------------------------------------------------------------*
FORM REFRESH_ALV USING PO_ALVGRID TYPE REF TO CL_GUI_ALV_GRID.
DATA LS_STBL TYPE LVC_S_STBL.
"稳定刷新
LS_STBL-ROW = 'X'." 基于行的稳定刷新
LS_STBL-COL = 'X'." 基于列稳定刷新
CALL METHOD PO_ALVGRID->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LS_STBL.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GAME_OVER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM GAME_OVER .
DATA LV_INDEX TYPE N LENGTH 2 .
DATA LV_ROW TYPE N LENGTH 2 .
DATA LV_FIELDNAME TYPE C LENGTH 6 .
LOOP AT GT_DATABASE INTO GS_DATABASE.
LV_ROW = SY-TABIX .
READ TABLE GT_MAIN INDEX LV_ROW .
DO GV_COL TIMES.
LV_INDEX = SY-INDEX .
CONCATENATE 'FLD_' LV_INDEX INTO LV_FIELDNAME .
IF <DYN_TBFIELD> IS ASSIGNED.
UNASSIGN <DYN_TBFIELD> .
ENDIF.
ASSIGN COMPONENT LV_FIELDNAME
OF STRUCTURE GS_DATABASE TO <DYN_TBFIELD> .
IF <DYN_TBFIELD> EQ 9.
ASSIGN COMPONENT LV_FIELDNAME
OF STRUCTURE GT_MAIN TO <DYN_MAIN>.
IF SY-SUBRC EQ 0.
<DYN_MAIN> = ICON_LED_RED .
ENDIF.
ENDIF.
ENDDO.
MODIFY GT_MAIN INDEX LV_ROW .
ENDLOOP.
PERFORM REFRESH_ALV USING GO_ALV_GRID.
MESSAGE '游戏结束' TYPE 'I' .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form INIT_TIMER_PROGRESS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM INIT_TIMER_PROGRESS .
CHECK GO_TIMER IS INITIAL.
CREATE OBJECT GO_TIMER
EXCEPTIONS
OTHERS = 9.
CREATE OBJECT EVENT_HANDLER.
SET HANDLER EVENT_HANDLER->HANDLE_TIMER FOR GO_TIMER.
GO_TIMER->INTERVAL = 1.
CALL METHOD GO_TIMER->RUN "¼
EXCEPTIONS
OTHERS = 9.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module EXIT INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE EXIT INPUT.
CASE GV_OKCODE.
WHEN GC_EXIT.
LEAVE PROGRAM .
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form SET_POS_LEI
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM SET_POS_LEI .
DATA LV_LINES TYPE I .
"根据雷的个数随机确定雷的位置 横坐标
DO GV_LEI TIMES.
CALL FUNCTION 'QF05_RANDOM_INTEGER'
EXPORTING
RAN_INT_MAX = GV_RANDNUMMAX
RAN_INT_MIN = 1
IMPORTING
RAN_INT = GV_RANDNUM
EXCEPTIONS
INVALID_INPUT = 1
OTHERS = 2
.
IF SY-SUBRC EQ 0.
GT_POS-ROW = GV_RANDNUM .
ENDIF.
"根据雷的个数随机确定雷的位置 纵坐标
CLEAR: GV_RANDNUMMAX ,GV_RANDNUM.
GV_RANDNUMMAX = GV_COL.
CALL FUNCTION 'QF05_RANDOM_INTEGER'
EXPORTING
RAN_INT_MAX = GV_RANDNUMMAX
RAN_INT_MIN = 1
IMPORTING
RAN_INT = GV_RANDNUM
EXCEPTIONS
INVALID_INPUT = 1
OTHERS = 2
.
IF SY-SUBRC EQ 0.
GT_POS-COL = GV_RANDNUM .
ENDIF.
APPEND GT_POS .
ENDDO.
SORT GT_POS BY ROW ASCENDING COL DESCENDING .
DELETE ADJACENT DUPLICATES FROM GT_POS COMPARING ROW COL.
DESCRIBE TABLE GT_POS LINES LV_LINES .
IF SY-INDEX EQ GV_LEI AND LV_LINES < GV_LEI_DO.
GV_LEI = GV_LEI_DO - LV_LINES .
PERFORM SET_POS_LEI .
ENDIF.
ENDFORM.
post SAP-Garson
原文链接:https://blog.csdn.net/qq_40977705/article/details/109637461文章来自于网络,如果侵犯了您的权益,请联系站长删除!