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.

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gong JX

多谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值