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. "宏 构建fieldcatCLEAR 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_CLICKOF CL_GUI_ALV_GRIDIMPORTING ES_COL_IDES_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_IDES_ROW_NO.ENDMETHOD.METHOD HANDLE_TIMER.CALL METHOD CL_GUI_CFW=>SET_NEW_OK_CODEEXPORTINGNEW_CODE = 'RFSH'.CALL METHOD GO_TIMER->RUN "EXCEPTIONSOTHERS = 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 2ENDING 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->freeEXCEPTIONScntl_system_error = 1cntl_error        = 2.CALL METHOD GO_PARENT->freeEXCEPTIONScntl_system_error = 1cntl_error        = 2.IF sy-subrc <> 0.MESSAGE a000(db).ENDIF.CLEAR EVENT_HANDLER .ENDIF.PERFORM GET_DATA .     "获得主数据PERFORM BUILD_FIELDCAT . "构建动态fieldcatPERFORM 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_TABLEEXPORTING
*     I_STYLE_TABLE             =IT_FIELDCATALOG           = GT_FIELDCAT
*     I_LENGTH_IN_BYTE          =IMPORTINGEP_TABLE                  = LT_DYTABLE
*     E_STYLE_FNAME             =EXCEPTIONSGENERATE_SUBPOOL_DIR_FULL = 1OTHERS                    = 2.IF SY-SUBRC <> 0.
*    Implement suitable error handling hereENDIF.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_FIELDCATOF 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_FIELDCATOF 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_FIELDCATOF 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_FIELDCATOF 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_FIELDCATOF 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_FIELDCATOF 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_FIELDCATOF 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_FIELDCATOF 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_FIELDCATOF 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_COLPS_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-FIELDNAMEOF STRUCTURE GS_DATABASE TO <DYN_TBFIELD> .IF <DYN_TBFIELD> EQ 9.PERFORM GAME_OVER .RETURN .ENDIF."递归找最上面的一行PERFORM GET_UPROW USING PS_ROW_NO-ROW_IDPS_COL_ID-FIELDNAMECHANGING LV_UP."递归找最下面的一行PERFORM GET_DOWROW USING PS_ROW_NO-ROW_IDPS_COL_ID-FIELDNAMECHANGING 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-FIELDNAMEOF STRUCTURE GS_DATABASE TO <DYN_TBFIELD> .IF <DYN_TBFIELD> NE 9 ."向左递归,找第一个不为空的区域LV_NUM = PS_COL_ID-FIELDNAME+4(2)  .PERFORM  GET_LEFT USING LV_UPCHANGING LV_NUM ."向右递归,找第一个不为空的区域LV_NUM = PS_COL_ID-FIELDNAME+4(2) .PERFORM GET_RIGHT USING    LV_UPCHANGING LV_NUM .SHENGYU = SHENGYU + 1 .ENDIF.LV_UP  = LV_UP + 1 .ENDWHILE.CALL METHOD CL_GUI_CFW=>SET_NEW_OK_CODEEXPORTINGNEW_CODE = 'NEXT'.ENDFORM.
*&---------------------------------------------------------------------*
*& Module INITALV_0200 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE INITALV_0200 OUTPUT.IF GO_PARENT IS NOT BOUND.CREATE OBJECT GO_PARENTEXPORTING
*        PARENT                      =CONTAINER_NAME              = 'CON01'
*        STYLE                       =
*        LIFETIME                    = lifetime_default
*        REPID                       =
*        DYNNR                       =
*        NO_AUTODEF_PROGID_DYNNR     =EXCEPTIONSCNTL_ERROR                  = 1CNTL_SYSTEM_ERROR           = 2CREATE_ERROR                = 3LIFETIME_ERROR              = 4LIFETIME_DYNPRO_DYNPRO_LINK = 5OTHERS                      = 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_GRIDEXPORTING
*        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 =EXCEPTIONSERROR_CNTL_CREATE = 1ERROR_CNTL_INIT   = 2ERROR_CNTL_LINK   = 3ERROR_DP_CREATE   = 4OTHERS            = 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'EXPORTINGI_PROGRAM_NAME               = SY-REPIDI_INTERNAL_TABNAME           = 'GT_MAIN'
*    I_STRUCTURE_NAME             =I_CLIENT_NEVER_DISPLAY       = 'X'I_INCLNAME                   = SY-REPID
*    I_BYPASSING_BUFFER           =
*    I_BUFFER_ACTIVE              =CHANGINGCT_FIELDCAT                  = GT_FIELDCAT_MAIN[]EXCEPTIONSINCONSISTENT_INTERFACE       = 1PROGRAM_ERROR                = 2OTHERS                       = 3.IF SY-SUBRC <> 0.
* Implement suitable error handling hereENDIF.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_DISPLAYEXPORTING
*        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               =CHANGINGIT_OUTTAB                     = GT_MAIN[]IT_FIELDCATALOG               = GT_FIELDCAT_MAIN2
*        IT_SORT                       =
*        IT_FILTER                     =EXCEPTIONSINVALID_PARAMETER_COMBINATION = 1PROGRAM_ERROR                 = 2TOO_MANY_LINES                = 3OTHERS                        = 4.IF SY-SUBRC <> 0.
*     Implement suitable error handling hereENDIF.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_FIELDNAMEOF 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_FIELDNAMECHANGING 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_FIELDNAMEOF 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_FIELDNAMECHANGING 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_FIELDNAMEOF 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_FIELDNAMECHANGING 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_FIELDNAMEOF 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_FIELDNAMECHANGING 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_INDXCHANGING P_NUM .ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_RIGHT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- LV_NUM
*&---------------------------------------------------------------------*
FORM GET_RIGHT USING    P_INDXCHANGING 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_INDXCHANGING 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_DISPLAYEXPORTINGIS_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_FIELDNAMEOF STRUCTURE GS_DATABASE TO <DYN_TBFIELD> .IF <DYN_TBFIELD> EQ 9.ASSIGN COMPONENT LV_FIELDNAMEOF 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_TIMEREXCEPTIONSOTHERS = 9.CREATE OBJECT EVENT_HANDLER.SET HANDLER EVENT_HANDLER->HANDLE_TIMER FOR GO_TIMER.GO_TIMER->INTERVAL = 1.CALL METHOD GO_TIMER->RUN "¼EXCEPTIONSOTHERS = 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'EXPORTINGRAN_INT_MAX         = GV_RANDNUMMAXRAN_INT_MIN         = 1IMPORTINGRAN_INT             = GV_RANDNUMEXCEPTIONSINVALID_INPUT       = 1OTHERS              = 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'EXPORTINGRAN_INT_MAX         = GV_RANDNUMMAXRAN_INT_MIN         = 1IMPORTINGRAN_INT             = GV_RANDNUMEXCEPTIONSINVALID_INPUT       = 1OTHERS              = 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.

ABAP开发 扫雷小游戏相关推荐

  1. 如何利用C#开发“扫雷”小游戏

    本文详细说明了利用C#语言开发"扫雷"小游戏的开发过程.

  2. 如何开发一个扫雷小游戏?

    如何用C#开发一个扫雷小游戏? 十分自豪的说,计算机编程就是变魔术,每一个coder都是一个魔术师. 初学C#的时候,我相信很多人都和我一样,学会了基本语法,掌握了基本的数据结构,也见过了不少微软提供 ...

  3. 【java游戏开发】教你用java做出扫雷小游戏

    扫雷是一款大众类的益智小游戏.根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输. 本课程详细讲解一个扫雷游戏的开发过程.只要90分钟就可以完成一个你自己亲手开发出来的Java ...

  4. c语言小游戏 精简_C语言开发简易版扫雷小游戏

    C 语言开发简易版扫雷小游戏 本文给大家分享的是一个使用 C 语言开发的命令行下的简易版扫雷小游戏, 本身没有什么太 多的技术含量, 只不过是笔者的处女作, 所以还是推荐给大家, 希望对大家学习 C ...

  5. 一个扫雷小游戏带你初识VUE3和typescript

    一个扫雷小游戏带你初识VUE3和typescript 阅读本文你会了解到: vue3的部分新特性 typescript的基本使用 部分es6语法 基础部分 为什么要使用ref和reactive来声明变 ...

  6. Python【小游戏合集】之重温童年最爱的扫雷小游戏

    导语: 哈喽吖!有许多铁汁们私信小编说用Python自行制作小游戏 ‍ ‍ 之后简直就是上头了~让wo多出一点小游戏合集(看来铁汁们跟小编一样都酷爱游戏) 有求必应~小游戏立刻安排上啦~~(扫雷真的是 ...

  7. C语言大一课设 扫雷小游戏

    目录 [题    目]扫雷小游戏 [项目简介] [总体功能结构流程图] 登录和注册流程图: 打印棋盘流程图: 计算周围雷的个数流程图: test.c game.h game.c 运行结果 (1)注册运 ...

  8. 在SAP GUI中玩扫雷小游戏

    在GUI中玩扫雷小游戏 ABAP代码: *&---------------------------------------------------------------------* *&a ...

  9. 用C语言实现扫雷小游戏(附上思路+项目展示+源代码)

    文章目录 前言 一.扫雷小游戏整体思路讲解. 二.game.c各游戏功能函数的讲解 1.InitBoard 初始化数组函数讲解 2.DisplayBoard 打印格子函数讲解 3.Setmine 电脑 ...

最新文章

  1. 牛客网:为什么不能将实数作为 HashMap 的 key?
  2. linux selenium_爬虫界又出神器|一款比selenium更高效的利器
  3. GridView 与ImageAdapter (笔记)
  4. Navicat客户端PostgreSQL连接报错:Could not connect to server:Connection refused(0x00002740/10061)
  5. 【elementUI】el-tree搜索时加载子节点对应父节点、父节点对应子节点树
  6. vs2017中编译提示一些系统头文件没有找到
  7. 226. Invert Binary Tree 翻转二叉树
  8. iOS开发 - App程序启动原理
  9. 私有GIT服务器的免密提交
  10. 哔哩哔哩公司swot分析_是时候颠覆你的SWOT营销分析法了!TOWS分析法可能更适合你...
  11. eclipse关闭js校验
  12. .net core 允许跨域
  13. fortran语言能用matlab,fortran语言与matlab
  14. samba服务端配置和客户端使用【含windows共享文件到linux】
  15. 秋意浓(2018.9.28)
  16. Linux 下使用Trickle限制下载/上传带宽
  17. 纯css画梯形,纯CSS3实现的梯形立方体
  18. hdu4966 朱刘算法
  19. Ubuntu/Mac/Windows与手机传输文件
  20. 微信小程序轮播图渲染(示例)

热门文章

  1. Android在后台线程实现 定时更新时间
  2. 死于贫困交加的七位美国总统
  3. 关于IDEActrl + alt + 下箭头失效的问题
  4. 如何使用远红外热成像仪估分析犯罪现场留在地面上的热脚印
  5. SHELL 时间格式转换
  6. html使用正则验证
  7. 虚拟机未关机状态下关闭windows主机导致网络连接不上,虚拟机中无ens33文件的解决办法
  8. OpenCV 用 VideoWriter 创建视频(Python 版本)
  9. 数据库恢复---恢复策略
  10. postgresql mode 函数