SAP ABAP ALV开发坦克大战小游戏

       想起小时候买的5块钱折叠小游戏机,里面有贪吃蛇,俄罗斯方块,还有一个我们最喜欢的坦克大战,驾驶我方坦克保卫我方司令部,消灭敌方坦克,至于为什么敌方坦克是日本国旗,那是因为游戏背景发生在抗日战争时期└(^o^)┘。我自己尝试用ALV报表去做坦克大战,因为只能工作间隙的时间的去开发,所以开发时间比较长,而且我的初衷不是为了开发游戏,而是通过开发游戏加深理解OO编程思想,在游戏代码,能尽量用OO的都用OO,开发的中间自己还去查询相关技术文档,经过这次开发,我理解到OO确实好用,但是强行使用的话,也会使开发者感觉碍手碍脚。SAP已经把报表开发流程做的非常完善,经典的流程开发模式就已经足够好了,在工作中要适当选择合适自己的开发思路,同时也要为后续的运维同事提供便利性,不能强行在报表中使用OO增加难度。在文章的最后我会贴上代码供大家参考,直接复制粘贴到SE38就可以激活运行了。代码对于有学习过OO思想的人还是很好理解的,如果没有学习过可能看得就比较吃力了,欢迎大家关注留言讨论,如果很多人留言有不理解的地方,我会在下一遍文章讲解代码逻辑。如果在游戏中发现BUG欢迎提出来,我再修改,毕竟我只是做了简单测试,代码也不是很多,只有1889行。

    如下图是整体的游戏效果,可以看到,游戏元素比较简单,左边是我方坦克,后面是需要保护的红旗(司令部?),有边是敌方坦克,敌方坦克中间是日本国旗。

为了更详细理解,特意做如下说明:

我方坦克,箭头方向是炮管指向,后面的绿色模块表示坦克等级是一,后期可以通过消灭敌人将等级提高。每消灭如下是坦克类型,从左到右分别是我方一级坦克,敌方一级坦克,敌方二级坦克,敌方三级坦克。坦克上的箭头方向就是炮管的方向。区分坦克等级就靠人或日本国旗后面的色块,坦克杀死对方轻型坦克会升一级,杀死对方中坦克就升两级,杀死对方重型坦克就升三级。被对方坦克击中就会降一级,注意升级是需要杀死一辆,如果你击中了一辆敌方重型坦克,敌方重坦会变成中坦,但是你还不能升级,因为你没杀死对方。所以在这个游戏机制下,优先去击毁对方轻坦克,把自己等级升上三级重坦克,再考虑去击毁中坦克或重坦克,三级重坦克不仅有三条命,而且火炮也更强大。

 

如下是两种炮弹,从左到右分别是轻炮弹,重炮弹。轻坦克每次只能发射一枚轻炮弹,中坦克每次发射一枚重炮弹,重坦克每次发射两枚重炮弹。 

 如下是分别是轻炮弹和重炮弹的爆炸范围,重炮弹的杀伤判定范围会更大一点

 如下我方红旗(司令部)位置,红旗被摧毁或我方坦克被摧毁,就游戏失败了。消灭所有敌人就成功。

如下是特殊道具,有4种,注意炸弹道具可以炸毁敌方飞行的炮弹,如果自己在炮弹的爆炸范围,会被炸伤。炸弹道具炸毁敌方坦克不算在自己的战绩,因为不是自己击毁的所以自己不能因此升级

当坦克吃到道具的时候,ALV抬头会显示当前道具剩余次数,次数是指屏幕每刷新一次,

游戏墙体说明

游戏前台界面,我要打10个,这句台词是不是很熟悉?叶问师傅去挑战日本人道场说的话。可以手动修改数量。下面的定时刷新功能,

如果不勾选的话,就是回合制游戏,我动一次,敌方就动一次,我不动则敌也不动。这样就可以让玩家更好规划进攻或逃跑路线,适合上班摸鱼^_^,老板来了就切换画面不担心自己坦克被炸了。

如果勾选的话,屏幕每两秒刷新一次,不管你动不动,敌方都会主动过来攻击你。

 如下是我方坦克被击毁,游戏结束。把所有敌方坦克击毁就会获得胜利。

接下来是做一下代码的简单说明,大家可以自己去稍微修改一下游戏

屏幕坐标是从左上角的0,0到右下角的40,50。和我们SAP的DIALOG屏幕调用一样的顺序。

下图是可以自己设置游戏场景的墙体部分的位置,大家也可以自己去开发新的对战场景,如下图确定每個点的坐标,A点在2行3列则坐标是(2,3),同理可以确定B点坐标(2,8),C点坐标(6,8)

以上知道怎么确定坐标,现在我们就可以画墙了,

1,只在A一个点画一个墙,用下面的语句 ,其中BRICK_ZT表示砖墙,BRICK_GB钢墙,BRICK_HB湖泊河流,BRICK_SL树林。

2,在A到B这条线上画一睹墙,用如下语句

3,在A到C这一面区域画一片墙,用如下语句

找到规律了没?有了上面画点、线、面的知识,我们就可以自己画出想要的战场迷宫了。 在代码1091到1105这边修改添加自己想要的代码吧。

也可以修改我方坦克参数,改成出场就是重型坦克,但是那样就失去了杀敌升级的乐趣了,下面一句LVR_WFTANK->SPEED = '2'.表示坦克移动速度是2,请不要超过炮弹的飞行速度

如下是设置炮弹飞行速度,I_TYPE=1是轻炮弹速度是3,I_TYPE=2是重炮弹速度是5。炮弹的速度一定要比坦克速度快哟,否则追不上坦克就尴尬了。 

如下是道具每次出现的概率,4种道具的概率都是2%,我感觉还是太高了,大家可以自己修改成1%。 

如下代码,定时和无敌效果的时间长短也可以调节,自己可以改成合适的效果次数

如果大家打不过敌人,也可以在代码1338到1410行注释掉,这样敌方就不能动了,自己可以打木桩\(^o^)/

如果觉得敌人太笨太简单了,大家可以把611到618这段代码注释掉,提高敌人的灵活性

如下代码,设置了游戏列COL轴最大50,行ROW轴最大40,屏幕上出场敌人是5,大家也可以自己修改,COL和ROW改了后可能会报错,大家可以修改一下,我没试过。屏幕最大敌人是可以改的,可以改成3或1降低游戏难度 

暂时只能想到这些,如果有不懂的,欢迎大家在博客下面留言讨论

下面开始贴代码,

首先要建立按键设置

TITLE不说了,大家都知道,下面是STAND_FX的设置,上下左右和开火,再加一个&F03退出按钮,方向快捷建是F5到F8,开火快捷建是F9,不知道大家能不能设置键盘方向建做快捷键或WSAD这4个按键,有方案的希望提供给我#^_^#

文本设置

如下代码

REPORT ZTEST214_14.
TYPE-POOLS: SLIS,ICON.


TYPES:
  BEGIN OF TY_FXSD,
    FX_ICON TYPE ICON_L2,
    SD      TYPE I,
  END OF TY_FXSD,
  BEGIN OF TY_COOR,
    ROW TYPE I,
    COL TYPE I,
  END OF TY_COOR,
  BEGIN OF TY_SEKUAI,
    ROW  TYPE I,
    COL  TYPE I,
    ICON TYPE ICON_L2,
  END OF TY_SEKUAI,
  TYT_SEKUAI TYPE TABLE OF TY_SEKUAI,
  BEGIN OF TY_ALVZB,
    ROW    TYPE I,
    COL    TYPE I,
    ICON   TYPE ICON_L2,
    NAME   TYPE CHAR10,
    ZHENGY TYPE CHAR10, "
  END OF TY_ALVZB,
  BEGIN OF TY_ICON,
    ICON1  TYPE CHAR10,
    ICON2  TYPE CHAR10,
    ICON3  TYPE CHAR10,
    ICON4  TYPE CHAR10,
    ICON5  TYPE CHAR10,
    ICON6  TYPE CHAR10,
    ICON7  TYPE CHAR10,
    ICON8  TYPE CHAR10,
    ICON9  TYPE CHAR10,
    ICON10 TYPE CHAR10,
    ICON11 TYPE CHAR10,
    ICON12 TYPE CHAR10,
    ICON13 TYPE CHAR10,
    ICON14 TYPE CHAR10,
    ICON15 TYPE CHAR10,
    ICON16 TYPE CHAR10,
    ICON17 TYPE CHAR10,
    ICON18 TYPE CHAR10,
    ICON19 TYPE CHAR10,
    ICON20 TYPE CHAR10,
    ICON21 TYPE CHAR10,
    ICON22 TYPE CHAR10,
    ICON23 TYPE CHAR10,
    ICON24 TYPE CHAR10,
    ICON25 TYPE CHAR10,
    ICON26 TYPE CHAR10,
    ICON27 TYPE CHAR10,
    ICON28 TYPE CHAR10,
    ICON29 TYPE CHAR10,
    ICON30 TYPE CHAR10,
    ICON31 TYPE CHAR10,
    ICON32 TYPE CHAR10,
    ICON33 TYPE CHAR10,
    ICON34 TYPE CHAR10,
    ICON35 TYPE CHAR10,
    ICON36 TYPE CHAR10,
    ICON37 TYPE CHAR10,
    ICON38 TYPE CHAR10,
    ICON39 TYPE CHAR10,
    ICON40 TYPE CHAR10,
    ICON41 TYPE CHAR10,
    ICON42 TYPE CHAR10,
    ICON43 TYPE CHAR10,
    ICON44 TYPE CHAR10,
    ICON45 TYPE CHAR10,
    ICON46 TYPE CHAR10,
    ICON47 TYPE CHAR10,
    ICON48 TYPE CHAR10,
    ICON49 TYPE CHAR10,
    ICON50 TYPE CHAR10,
  END OF TY_ICON,
  TYT_ICON TYPE TABLE OF TY_ICON,
  BEGIN OF TY_YOUX,
    NAME    TYPE CHAR10,
    SHIXIAO TYPE CHAR1,
    YOUX    TYPE I,
  END OF TY_YOUX,
  TYT_YOUX TYPE TABLE OF TY_YOUX.

DATA: GO_TIMER    TYPE REF TO CL_GUI_TIMER.
DATA: GR_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA: GT_ICON TYPE TYT_ICON.
DATA GV_TABCOL TYPE I.
CONSTANTS:
  GV_TABROW TYPE I VALUE '40',
  GV_DFALIV TYPE I VALUE '5', "屏幕上存在的敌方数量
  PAOG_U    TYPE ICON_L2 VALUE ICON_TREND_UP,
  PAOG_D    TYPE ICON_L2 VALUE ICON_TREND_DOWN,
  PAOG_L    TYPE ICON_L2 VALUE ICON_ARROW_LEFT,
  PAOG_R    TYPE ICON_L2 VALUE ICON_ARROW_RIGHT.


DATA:
  GS_STABLE       TYPE LVC_S_STBL,
  GS_LAYOUT       TYPE LVC_S_LAYO,
*  Gt_SLIS_T_EXTAB TYPE UI_FUNCTIONS,
  GT_FIELDCAT     TYPE LVC_T_FCAT,
  GS_DISVARIANT   TYPE DISVARIANT,
  GS_VARIANT      TYPE DISVARIANT,
  GT_SLIS_T_EXTAB TYPE SLIS_T_EXTAB,
  GT_EVENTS       TYPE SLIS_T_EVENT,
  GS_FCAT         TYPE LVC_S_FCAT,
  GT_FCAT         TYPE LVC_T_FCAT,
  GS_SORT         TYPE LVC_S_SORT,
  GT_SORT         TYPE LVC_T_SORT,
  GV_SCREEN       TYPE N LENGTH 4.

SELECTION-SCREEN BEGIN OF BLOCK BK1 WITH FRAME TITLE TEXT-001.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (6) TEXT-002 FOR FIELD P_DRSL.
PARAMETERS P_DRSL TYPE I DEFAULT '10' OBLIGATORY.
SELECTION-SCREEN COMMENT (10) TEXT-003 FOR FIELD P_DRSL.
SELECTION-SCREEN END OF LINE.
PARAMETERS P_REF AS CHECKBOX TYPE CHAR1 DEFAULT ''.
SELECTION-SCREEN END OF BLOCK BK1.

*DATA P_DRSL TYPE I VALUE '10'.

CLASS LC_GAME DEFINITION DEFERRED.
CLASS LC_SHAPE DEFINITION DEFERRED.
CLASS LC_BRICK DEFINITION DEFERRED.
CLASS LC_TANK DEFINITION DEFERRED.
CLASS LC_SHELL DEFINITION DEFERRED.

CLASS LC_SHAPE DEFINITION ABSTRACT.
  PUBLIC SECTION.
    CLASS-METHODS:
      GET_RANDOM IMPORTING I_MIN            TYPE I
                           I_MAX            TYPE I
                 RETURNING VALUE(RE_RANDOM) TYPE I.
    METHODS:
      CONSTRUCTOR IMPORTING I_SEKUAI TYPE TY_SEKUAI
                            I_NAME   TYPE CHAR10,
      HIT IMPORTING I_DF           TYPE REF TO LC_SHAPE "判断是否撞击
          RETURNING VALUE(RE_RROR) TYPE CHAR1,
      HIT2 IMPORTING IM_ZB           TYPE TY_COOR
           RETURNING VALUE(RE_ERROR) TYPE CHAR1,
      GET_PANDING EXPORTING VALUE(RT_SEKUAI) TYPE TYT_SEKUAI, "获取对象判定区
      GET_NAME RETURNING VALUE(RE_NAME) TYPE CHAR10, "对象名称
      GET_ID RETURNING VALUE(RE_ID) TYPE INT4, "对象ID
      SET_SHIXIAO IMPORTING VALUE(IM_SHIXIAO) TYPE CHAR1, "
      GET_SHIXIAO RETURNING VALUE(RE_RROR) TYPE CHAR1, "
      GET_ZHENGY RETURNING VALUE(RE_ZHENGY) TYPE CHAR10, "
      SET_ZHENGY IMPORTING VALUE(IM_ZHENGY) TYPE CHAR10,
      SET_LSCZ.
  PROTECTED SECTION.
    DATA ZHENGY TYPE CHAR10. "阵营
    DATA IT_SEKUAI TYPE TABLE OF TY_SEKUAI.
    DATA ZHUSE TYPE TY_SEKUAI.
*    火焰优先
    METHODS:
      SEPIYI IMPORTING I_RPY  TYPE I
                       I_CPY  TYPE I
                       I_ICON TYPE ICON_L2.
  PRIVATE SECTION.
    CLASS-DATA:
      GV_OBID  TYPE INT4 VALUE '0'. "对象ID序号
    DATA ID TYPE INT4. "本对象ID
    DATA SHIXIAO TYPE CHAR1 VALUE ''. "对象失效了
    DATA NAME TYPE CHAR10.
    DATA:
      WDSJ TYPE SY-UZEIT, "无敌时间
      LSCZ TYPE CHAR1.    "临时存在的
*    METHODs:


ENDCLASS.
CLASS LC_SHAPE IMPLEMENTATION.

  METHOD HIT2.
    RE_ERROR = ''.
    LOOP AT IT_SEKUAI INTO DATA(WA_SEKUAI) WHERE ROW = IM_ZB-ROW AND COL = IM_ZB-COL.
      RE_ERROR = 'X'.
      RETURN.
    ENDLOOP.
  ENDMETHOD.

  METHOD SET_ZHENGY.
    ZHENGY = IM_ZHENGY.
  ENDMETHOD.

  METHOD SET_LSCZ.
    LSCZ = 'X'.
  ENDMETHOD.

  METHOD GET_RANDOM.

    CALL FUNCTION 'QF05_RANDOM_INTEGER'
      EXPORTING
        RAN_INT_MAX = 50
        RAN_INT_MIN = 1
*    IMPORTING
*       RAN_INT     = MY_SEED.
      .
    DATA LV_RANINT TYPE QF00-RAN_INT.
    CALL FUNCTION 'QF05_RANDOM_INTEGER'
      EXPORTING
        RAN_INT_MAX = I_MAX
        RAN_INT_MIN = I_MIN
      IMPORTING
        RAN_INT     = LV_RANINT.
    RE_RANDOM = LV_RANINT.

  ENDMETHOD.

  METHOD HIT.
    RE_RROR = ''.
    IF ID = I_DF->GET_ID( ). "和自己碰撞,不做判定
      RETURN.
    ENDIF.

    DATA LT_DFPAND TYPE TYT_SEKUAI.
    CALL METHOD I_DF->GET_PANDING
      IMPORTING
        RT_SEKUAI = LT_DFPAND.
    LOOP AT IT_SEKUAI ASSIGNING FIELD-SYMBOL(<WA_SEKUAI>).
      READ TABLE LT_DFPAND INTO DATA(WA_DFPAND) WITH KEY ROW = <WA_SEKUAI>-ROW
                                                         COL = <WA_SEKUAI>-COL.
      IF SY-SUBRC = 0.
        RE_RROR = 'X'.
      ENDIF.
    ENDLOOP.

  ENDMETHOD.
  METHOD GET_ZHENGY.
    RE_ZHENGY = ZHENGY.
  ENDMETHOD.
  METHOD GET_SHIXIAO.
    RE_RROR = SHIXIAO.
  ENDMETHOD.
  METHOD SET_SHIXIAO.
    SHIXIAO = IM_SHIXIAO.
  ENDMETHOD.
  METHOD GET_ID.
    RE_ID = ID.
  ENDMETHOD.
  METHOD GET_NAME.
    RE_NAME = NAME.
  ENDMETHOD.
  METHOD GET_PANDING.
    RT_SEKUAI = IT_SEKUAI.
  ENDMETHOD.
  METHOD CONSTRUCTOR.
    GV_OBID = GV_OBID + 1.
    ID = GV_OBID.
    NAME = I_NAME.
    ZHUSE = I_SEKUAI.
    APPEND I_SEKUAI TO IT_SEKUAI.
  ENDMETHOD.
  METHOD SEPIYI.
    DATA WA_SEKUAI LIKE LINE OF IT_SEKUAI.
    WA_SEKUAI-ROW = ZHUSE-ROW + I_RPY.
    WA_SEKUAI-COL = ZHUSE-COL + I_CPY.
    WA_SEKUAI-ICON = I_ICON.
    APPEND WA_SEKUAI TO IT_SEKUAI.
  ENDMETHOD.

ENDCLASS.

CLASS LC_BRICK DEFINITION INHERITING FROM LC_SHAPE.
  PUBLIC SECTION.
    CLASS-DATA :
      BRICK_ZT TYPE ICON_L2 VALUE ICON_DANGEROUS_GOODS READ-ONLY, "砖头
      BRICK_HB TYPE ICON_L2 VALUE ICON_GIS_DOT_DENSITY READ-ONLY, "河流湖泊
      BRICK_HQ TYPE ICON_L2 VALUE ICON_DEFECT READ-ONLY,          "红旗
      BRICK_GB TYPE ICON_L2 VALUE ICON_LEGAL_REG READ-ONLY,       "钢板
      BRICK_SL TYPE ICON_L2 VALUE ICON_HIERARCHY_ACT READ-ONLY,   "树林
      BRICK_MB TYPE ICON_L2 VALUE ICON_TIME READ-ONLY,   "秒表(定时作用)
      BRICK_LW TYPE ICON_L2 VALUE ICON_EXTRA READ-ONLY,   "礼物(升级作用)
      BRICK_ZD TYPE ICON_L2 VALUE ICON_VOICE_OUTPUT READ-ONLY,   "炸弹(清空屏幕所有敌人)
      BRICK_GM TYPE ICON_L2 VALUE ICON_WD_CONTEXT READ-ONLY.   "钢帽(增加一段时间防御)


    METHODS:
      CONSTRUCTOR IMPORTING I_SEKUAI TYPE TY_SEKUAI.
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.
CLASS LC_BRICK IMPLEMENTATION.

  METHOD CONSTRUCTOR.
    DATA LV_NAME TYPE CHAR10.
    IF I_SEKUAI-ICON = BRICK_ZT.
      LV_NAME = 'BRICK_ZT'.
    ELSEIF I_SEKUAI-ICON = BRICK_GB.
      LV_NAME = 'BRICK_GB'.
    ELSEIF I_SEKUAI-ICON = BRICK_HB.
      LV_NAME = 'BRICK_HB'.
    ELSEIF I_SEKUAI-ICON = BRICK_SL.
      LV_NAME = 'BRICK_SL'.
    ELSEIF I_SEKUAI-ICON = BRICK_HQ.
      LV_NAME = 'BRICK_HQ'.
    ELSEIF I_SEKUAI-ICON = BRICK_MB.
      LV_NAME = 'BRICK_MB'.
    ELSEIF I_SEKUAI-ICON = BRICK_LW.
      LV_NAME = 'BRICK_LW'.
    ELSEIF I_SEKUAI-ICON = BRICK_ZD.
      LV_NAME = 'BRICK_ZD'.
    ELSEIF I_SEKUAI-ICON = BRICK_GM.
      LV_NAME = 'BRICK_GM'.
    ENDIF.
    SUPER->CONSTRUCTOR( I_SEKUAI = I_SEKUAI I_NAME = LV_NAME ).
  ENDMETHOD.
ENDCLASS.

CLASS LC_SHELL DEFINITION INHERITING FROM LC_SHAPE.
  PUBLIC SECTION.
*    CLASS-DATA :
*      TANK_LZ TYPE ICON_L2 VALUE ICON_RED_XCIRCLE READ-ONLY,
    DATA:
      SPEED TYPE I VALUE '3'. "炮弹速度
    METHODS:
      CONSTRUCTOR IMPORTING I_SEKUAI TYPE TY_SEKUAI,
      MOVE IMPORTING I_SD            TYPE I
           RETURNING VALUE(RE_ERROR) TYPE CHAR1,
      GET_SUPERID RETURNING VALUE(RE_ID) TYPE I, "获取上级ID
      SET_SUPERID IMPORTING VALUE(IM_ID) TYPE I, "设置上级ID
      SET_TYPE IMPORTING I_TYPE TYPE I,
      GET_TYPE RETURNING VALUE(RE_TYPE) TYPE I,
      BOMB EXPORTING VALUE(RT_SEKUAI) TYPE TYT_SEKUAI,
      HIT_LINE RETURNING VALUE(RE_RROR) TYPE CHAR1,
      HIT_KILL IMPORTING VALUE(I_DFTYPE_Y) TYPE I.
    EVENTS:
      UPGRADE EXPORTING VALUE(I_DFTYPE_Y) TYPE INT4.
  PRIVATE SECTION.
    CLASS-DATA :
      WEIY  TYPE ICON_L2 VALUE ICON_LED_RED, "炮弹尾焰
      DANTI TYPE ICON_L2 VALUE ICON_RED_XCIRCLE. "炮彈彈體
    DATA FX_ICON TYPE ICON_L2.
    DATA SUPERID TYPE I. "上级ID
    DATA TYPE TYPE I VALUE '1'. "1輕炮,2重炮
ENDCLASS.
CLASS LC_SHELL IMPLEMENTATION.
  METHOD HIT_KILL.
    RAISE EVENT UPGRADE EXPORTING I_DFTYPE_Y = I_DFTYPE_Y.
  ENDMETHOD.
  METHOD CONSTRUCTOR.
    SUPER->CONSTRUCTOR( I_SEKUAI = I_SEKUAI I_NAME = 'SHELL' ).
    FX_ICON = I_SEKUAI-ICON. "炮弹方向
  ENDMETHOD.
  METHOD HIT_LINE.
*    IF TYPE = 2. "重炮在邊界爆炸
    LOOP AT IT_SEKUAI INTO DATA(WA_SEKUAI).
      IF ( WA_SEKUAI-ROW = 1 AND WA_SEKUAI-ICON = FX_ICON AND FX_ICON = PAOG_U ) OR
         ( WA_SEKUAI-ROW = GV_TABROW AND WA_SEKUAI-ICON = FX_ICON AND FX_ICON = PAOG_D ) OR
         ( WA_SEKUAI-COL = 1 AND WA_SEKUAI-ICON = FX_ICON AND FX_ICON = PAOG_L ) OR
         ( WA_SEKUAI-COL = GV_TABCOL AND WA_SEKUAI-ICON = FX_ICON AND FX_ICON = PAOG_R ).
        RE_RROR = 'X'.
      ENDIF.
    ENDLOOP.
*    ENDIF.
  ENDMETHOD.
  METHOD SET_TYPE.
    TYPE = I_TYPE.
    IF I_TYPE = 1.
      SPEED = 3.
    ELSEIF I_TYPE = 2.
      SPEED = 5.
    ENDIF.
  ENDMETHOD.
  METHOD GET_TYPE.
    RE_TYPE = TYPE.
  ENDMETHOD.
  METHOD MOVE.
    CLEAR IT_SEKUAI.
    DATA WA_SEKUAI1 LIKE LINE OF IT_SEKUAI.
    DATA WA_SEKUAI2 LIKE LINE OF IT_SEKUAI.
    WA_SEKUAI1 = ZHUSE.
    WA_SEKUAI2 = ZHUSE.
    IF FX_ICON = PAOG_U.
      ZHUSE-ROW = ZHUSE-ROW - I_SD.
      WA_SEKUAI1-ROW = ZHUSE-ROW + 1.
      WA_SEKUAI2-ROW = ZHUSE-ROW + 2.
    ELSEIF FX_ICON = PAOG_D.
      ZHUSE-ROW = ZHUSE-ROW + I_SD.
      WA_SEKUAI1-ROW = ZHUSE-ROW - 1.
      WA_SEKUAI2-ROW = ZHUSE-ROW - 2.
    ELSEIF FX_ICON = PAOG_L.
      ZHUSE-COL = ZHUSE-COL - I_SD.
      WA_SEKUAI1-COL = ZHUSE-COL + 1.
      WA_SEKUAI2-COL = ZHUSE-COL + 2.
    ELSEIF FX_ICON = PAOG_R.
      ZHUSE-COL = ZHUSE-COL + I_SD.
      WA_SEKUAI1-COL = ZHUSE-COL - 1.
      WA_SEKUAI2-COL = ZHUSE-COL - 2.
    ENDIF.
    APPEND ZHUSE TO IT_SEKUAI.
    IF TYPE = 1.
      WA_SEKUAI1-ICON = WEIY.
      APPEND WA_SEKUAI1 TO IT_SEKUAI.
    ELSEIF TYPE = 2.
      WA_SEKUAI1-ICON = DANTI.
      APPEND WA_SEKUAI1 TO IT_SEKUAI.
      WA_SEKUAI2-ICON = WEIY.
      APPEND WA_SEKUAI2 TO IT_SEKUAI.
    ENDIF.
  ENDMETHOD.
  METHOD BOMB.

    ZHUSE-ICON = ICON_GENERATE.
    CLEAR: IT_SEKUAI.
    APPEND ZHUSE TO IT_SEKUAI.
    SEPIYI( I_RPY  = 0 I_CPY  = -1 I_ICON = WEIY ).
    SEPIYI( I_RPY  = 0 I_CPY  = 1 I_ICON = WEIY ).
    SEPIYI( I_RPY  = -1 I_CPY  = 0 I_ICON = WEIY ).
    SEPIYI( I_RPY  = 1 I_CPY  = 0 I_ICON = WEIY ).
    IF TYPE = 2.
      SEPIYI( I_RPY  = 1 I_CPY  = 1 I_ICON = WEIY ).
      SEPIYI( I_RPY  = -1 I_CPY  = 1 I_ICON = WEIY ).
      SEPIYI( I_RPY  = 1 I_CPY  = -1 I_ICON = WEIY ).
      SEPIYI( I_RPY  = -1 I_CPY  = -1 I_ICON = WEIY ).
    ENDIF.
    RT_SEKUAI = IT_SEKUAI[].

  ENDMETHOD.
  METHOD GET_SUPERID.
    RE_ID = SUPERID.
  ENDMETHOD.
  METHOD SET_SUPERID.
    SUPERID = IM_ID.
  ENDMETHOD.

ENDCLASS.


CLASS LC_TANK DEFINITION INHERITING FROM LC_SHAPE.

  PUBLIC SECTION.
    CLASS-DATA :
      TANK_LZ TYPE ICON_L2 VALUE ICON_ACTIVITY READ-ONLY,
      TANK_WF TYPE ICON_L2 VALUE ICON_AGENT READ-ONLY,
      TANK_DF TYPE ICON_L2 VALUE ICON_JAPAN READ-ONLY,
      TANK_1  TYPE ICON_L2 VALUE ICON_LED_GREEN READ-ONLY,
      TANK_2  TYPE ICON_L2 VALUE ICON_ALERT READ-ONLY,
      TANK_3  TYPE ICON_L2 VALUE ICON_MESSAGE_ERROR READ-ONLY,
      TANK_TX TYPE ICON_L2 VALUE ICON_INITIAL READ-ONLY,
      TANK_WD TYPE ICON_L2 VALUE ICON_WD_CONTEXT READ-ONLY,
      TANK_EN TYPE ICON_L2 VALUE ICON_LOCATION READ-ONLY,
      TANK_WY TYPE ICON_L2 VALUE ICON_LED_RED. "炮弹尾焰.

    METHODS:
      CONSTRUCTOR
        IMPORTING VALUE(I_SEKUAI) TYPE TY_SEKUAI
                  I_TYPE          TYPE I
                  I_FX            TYPE ICON_L2,

      GET_PANDING REDEFINITION,
      SET_TYPE IMPORTING I_TYPE TYPE I,
      GET_TYPE_Y RETURNING VALUE(RE_TYPE_Y) TYPE I,
      BOMB,
      AUTO RETURNING VALUE(RE_FXSD) TYPE TY_FXSD,
      ZUIJI IMPORTING IM_TANK      TYPE REF TO LC_TANK
            RETURNING VALUE(RE_FX) TYPE ICON_L2,
      MOVE IMPORTING I_FXSD          TYPE TY_FXSD
           RETURNING VALUE(RE_ERROR) TYPE CHAR1,
      SET_SHIXIAO REDEFINITION,
      KILL FOR EVENT UPGRADE OF LC_SHELL IMPORTING I_DFTYPE_Y,
      FIRE EXPORTING VALUE(RE_SHELL1) TYPE REF TO LC_SHELL
                     VALUE(RE_SHELL2) TYPE REF TO LC_SHELL.
    DATA:
       SPEED TYPE I VALUE '1'. "速度

  PRIVATE SECTION.
    DATA FX_ICON TYPE ICON_L2.
    DATA TYPE_Y TYPE I. "初始坦克类型
    DATA TYPE TYPE I VALUE '1'. "1是輕坦,2中坦,3重坦
    DATA STATE TYPE I. "1上,2下,3左,4右,5上,6下,7左,8右,9開炮
    DATA ZUIJI_JS TYPE I.
*    DATA ICON TYPE ICON_L2.

ENDCLASS.

CLASS LC_TANK IMPLEMENTATION.

  METHOD CONSTRUCTOR.
    SUPER->CONSTRUCTOR( I_SEKUAI = I_SEKUAI I_NAME = 'TANK' ).
    IF I_SEKUAI-ICON = TANK_WF.
      ZHENGY = 'WF'.
    ELSEIF I_SEKUAI-ICON = TANK_DF.
      ZHENGY = 'DF'.
    ENDIF.
    FX_ICON = I_FX.
    IF I_TYPE = 0.
      TYPE = ME->GET_ID( ) MOD 3 + 1.
    ELSE.
      TYPE = I_TYPE.
    ENDIF.
    TYPE_Y = TYPE.
    ME->MOVE( I_FXSD = VALUE TY_FXSD( FX_ICON = I_FX SD = 0 ) ).
  ENDMETHOD.

  METHOD BOMB.

    ZHUSE-ICON = TANK_DF.
    CLEAR: IT_SEKUAI.
    APPEND ZHUSE TO IT_SEKUAI.
    SEPIYI( I_RPY  = 0 I_CPY  = -1 I_ICON = ICON_LED_RED ).
    SEPIYI( I_RPY  = 0 I_CPY  = 1 I_ICON = ICON_LED_RED ).
    SEPIYI( I_RPY  = -1 I_CPY  = 0 I_ICON = ICON_LED_RED ).
    SEPIYI( I_RPY  = 1 I_CPY  = 0 I_ICON = ICON_LED_RED ).
    SEPIYI( I_RPY  = 1 I_CPY  = 1 I_ICON = ICON_LED_RED ).
    SEPIYI( I_RPY  = -1 I_CPY  = 1 I_ICON = ICON_LED_RED ).
    SEPIYI( I_RPY  = 1 I_CPY  = -1 I_ICON = ICON_LED_RED ).
    SEPIYI( I_RPY  = -1 I_CPY  = -1 I_ICON = ICON_LED_RED ).

  ENDMETHOD.

  METHOD GET_TYPE_Y.
    RE_TYPE_Y = TYPE_Y.
  ENDMETHOD.

  METHOD KILL.
    TYPE = TYPE + I_DFTYPE_Y.
    IF TYPE >= 3.
      TYPE = 3.
    ENDIF.
  ENDMETHOD.

  METHOD SET_SHIXIAO.
    IF TYPE = 1 OR IM_SHIXIAO = 'B'.
      SUPER->SET_SHIXIAO( 'X' ).
    ELSE.
      TYPE = TYPE - 1.
      MOVE( VALUE TY_FXSD( FX_ICON = '' SD = 0 ) ).
    ENDIF.
*    IF ZHENGY = 'WF'.
*      ZHUSE-ICON = TANK_TX.
*      READ TABLE IT_SEKUAI ASSIGNING FIELD-SYMBOL(<WA_SEKUAI>) WITH KEY ICON = TANK_WF.
*      IF SY-SUBRC = 0.
*        <WA_SEKUAI>-ICON = TANK_TX.
*      ENDIF.
*    ENDIF.
  ENDMETHOD.

  METHOD ZUIJI.

    IF IM_TANK->GET_SHIXIAO( ) = 'X'.
      RETURN.
    ENDIF.

    DATA LT_DFPD TYPE TYT_SEKUAI.
    CALL METHOD IM_TANK->GET_PANDING
      IMPORTING
        RT_SEKUAI = LT_DFPD.
    READ TABLE IT_SEKUAI INTO DATA(WA_SEKUAI) WITH KEY ICON = FX_ICON.
    IF TYPE = 1 OR TYPE = 2.
      LOOP AT LT_DFPD INTO DATA(WA_DFPD).
        IF WA_DFPD-ROW = WA_SEKUAI-ROW.
          IF WA_DFPD-COL < WA_SEKUAI-COL.
            RE_FX = PAOG_L.
          ELSE.
            RE_FX = PAOG_R.
          ENDIF.
        ELSEIF WA_DFPD-COL = WA_SEKUAI-COL.
          IF WA_DFPD-ROW < WA_SEKUAI-ROW.
            RE_FX = PAOG_U.
          ELSE.
            RE_FX = PAOG_D.
          ENDIF.
        ENDIF.
      ENDLOOP.
    ELSEIF TYPE = 3.
      DATA WA_SEKUAI1 LIKE WA_SEKUAI.
      DATA WA_SEKUAI2 LIKE WA_SEKUAI.
      WA_SEKUAI1 = WA_SEKUAI.
      WA_SEKUAI2 = WA_SEKUAI.
      IF FX_ICON = PAOG_U OR FX_ICON = PAOG_D.
        WA_SEKUAI1-COL = WA_SEKUAI-COL - 1.
        WA_SEKUAI2-COL = WA_SEKUAI-COL + 1.
      ELSEIF FX_ICON = PAOG_L OR FX_ICON = PAOG_R.
        WA_SEKUAI1-ROW = WA_SEKUAI-ROW - 1.
        WA_SEKUAI2-ROW = WA_SEKUAI-ROW + 1.
      ENDIF.
      LOOP AT LT_DFPD INTO WA_DFPD.
        IF WA_DFPD-ROW = WA_SEKUAI1-ROW.
          IF WA_DFPD-COL < WA_SEKUAI1-COL.
            RE_FX = PAOG_L.
          ELSE.
            RE_FX = PAOG_R.
          ENDIF.
        ELSEIF WA_DFPD-COL = WA_SEKUAI1-COL.
          IF WA_DFPD-ROW < WA_SEKUAI1-ROW.
            RE_FX = PAOG_U.
          ELSE.
            RE_FX = PAOG_D.
          ENDIF.
        ENDIF.
        IF WA_DFPD-ROW = WA_SEKUAI2-ROW.
          IF WA_DFPD-COL < WA_SEKUAI2-COL.
            RE_FX = PAOG_L.
          ELSE.
            RE_FX = PAOG_R.
          ENDIF.
        ELSEIF WA_DFPD-COL = WA_SEKUAI2-COL.
          IF WA_DFPD-ROW < WA_SEKUAI2-ROW.
            RE_FX = PAOG_U.
          ELSE.
            RE_FX = PAOG_D.
          ENDIF.
        ENDIF.
      ENDLOOP.
    ENDIF.
    IF RE_FX <> ''.
      IF ZUIJI_JS < 2.
        ZUIJI_JS = ZUIJI_JS + 1.
        CLEAR RE_FX.
      ELSE.
        ZUIJI_JS = 0.
      ENDIF.
    ENDIF.
  ENDMETHOD.

  METHOD AUTO.

    DATA LV_RANDOM TYPE QF00-RAN_INT.
    LV_RANDOM = LC_SHAPE=>GET_RANDOM( I_MIN = 0 I_MAX = 100 ).

    IF LV_RANDOM <= 5.
      RE_FXSD-FX_ICON = PAOG_D.
      RE_FXSD-SD = 1.
    ELSEIF LV_RANDOM <= 10.
      RE_FXSD-FX_ICON = PAOG_D.
      RE_FXSD-SD = 2.
    ELSEIF LV_RANDOM <= 15.
      RE_FXSD-FX_ICON = PAOG_U.
      RE_FXSD-SD = 1.
    ELSEIF LV_RANDOM <= 20.
      RE_FXSD-FX_ICON = PAOG_U.
      RE_FXSD-SD = 2.
    ELSEIF LV_RANDOM <= 23.
      RE_FXSD-FX_ICON = PAOG_R.
      RE_FXSD-SD = 1.
    ELSEIF LV_RANDOM <= 26.
      RE_FXSD-FX_ICON = PAOG_R.
      RE_FXSD-SD = 2.
    ELSEIF LV_RANDOM <= 50.
      RE_FXSD-FX_ICON = PAOG_L.
      RE_FXSD-SD = 1.
    ELSEIF LV_RANDOM <= 80.
      RE_FXSD-FX_ICON = PAOG_L.
      RE_FXSD-SD = 2.
    ELSEIF LV_RANDOM <= 100.
      CLEAR RE_FXSD.
    ENDIF.


  ENDMETHOD.

  METHOD SET_TYPE.
    TYPE = I_TYPE.
    IF TYPE = 2.
*      TANK_EN = '中'.
    ENDIF.
  ENDMETHOD.

  METHOD GET_PANDING.
    RT_SEKUAI = IT_SEKUAI.
  ENDMETHOD.

  METHOD FIRE.
    DATA WA_FXSK LIKE LINE OF IT_SEKUAI.
    IF TYPE = 1.
      READ TABLE IT_SEKUAI INTO WA_FXSK WITH KEY ICON = FX_ICON.
      CREATE OBJECT RE_SHELL1
        EXPORTING
          I_SEKUAI = WA_FXSK.
      RE_SHELL1->SET_SUPERID( ME->GET_ID( ) ).
      RE_SHELL1->SET_ZHENGY( ME->GET_ZHENGY( ) ).
      RE_SHELL1->SET_TYPE( 1 ).
      SET HANDLER ME->KILL FOR RE_SHELL1.
    ELSEIF TYPE = 2.
      READ TABLE IT_SEKUAI INTO WA_FXSK WITH KEY ICON = FX_ICON.
      CREATE OBJECT RE_SHELL1
        EXPORTING
          I_SEKUAI = WA_FXSK.
      RE_SHELL1->SET_SUPERID( ME->GET_ID( ) ).
      RE_SHELL1->SET_ZHENGY( ME->GET_ZHENGY( ) ).
      RE_SHELL1->SET_TYPE( 2 ).
      SET HANDLER ME->KILL FOR RE_SHELL1.
    ELSEIF TYPE = 3.
      READ TABLE IT_SEKUAI INTO WA_FXSK WITH KEY ICON = FX_ICON.
      DATA WA_FXSK1 LIKE WA_FXSK.
      DATA WA_FXSK2 LIKE WA_FXSK.
      WA_FXSK1 = WA_FXSK.
      WA_FXSK2 = WA_FXSK.
      IF FX_ICON = PAOG_U.
        WA_FXSK1-COL = WA_FXSK-COL - 1.
        WA_FXSK2-COL = WA_FXSK-COL + 1.
      ELSEIF FX_ICON = PAOG_D.
        WA_FXSK1-COL = WA_FXSK-COL - 1.
        WA_FXSK2-COL = WA_FXSK-COL + 1.
      ELSEIF FX_ICON = PAOG_L.
        WA_FXSK1-ROW = WA_FXSK-ROW - 1.
        WA_FXSK2-ROW = WA_FXSK-ROW + 1.
      ELSEIF FX_ICON = PAOG_R.
        WA_FXSK1-ROW = WA_FXSK-ROW - 1.
        WA_FXSK2-ROW = WA_FXSK-ROW + 1.
      ENDIF.
      CREATE OBJECT RE_SHELL1
        EXPORTING
          I_SEKUAI = WA_FXSK1.
      RE_SHELL1->SET_SUPERID( ME->GET_ID( ) ).
      RE_SHELL1->SET_ZHENGY( ME->GET_ZHENGY( ) ).
      RE_SHELL1->SET_TYPE( 2 ).
      SET HANDLER ME->KILL FOR RE_SHELL1.
      CREATE OBJECT RE_SHELL2
        EXPORTING
          I_SEKUAI = WA_FXSK2.
      RE_SHELL2->SET_SUPERID( ME->GET_ID( ) ).
      RE_SHELL2->SET_ZHENGY( ME->GET_ZHENGY( ) ).
      RE_SHELL2->SET_TYPE( 2 ).
      SET HANDLER ME->KILL FOR RE_SHELL2.
    ENDIF.

  ENDMETHOD.

  METHOD MOVE.
    IF I_FXSD-FX_ICON <> ''.
      FX_ICON = I_FXSD-FX_ICON.
    ENDIF.
    DATA LV_EN TYPE ICON_L2.
    IF TYPE = 1.
      LV_EN = TANK_1.
    ELSEIF TYPE = 2.
      LV_EN = TANK_2.
    ELSEIF TYPE = 3.
      LV_EN = TANK_3.
    ENDIF.


    DATA LV_LZ LIKE TANK_LZ.
    LV_LZ = TANK_LZ.

    CLEAR: IT_SEKUAI.
    IF FX_ICON = PAOG_U.
      ZHUSE-ROW = ZHUSE-ROW - I_FXSD-SD.
      IF ZHUSE-ROW < 2.
        ZHUSE-ROW = 2.
        RE_ERROR = 'X'.
      ENDIF.
      APPEND ZHUSE TO IT_SEKUAI.
      SEPIYI( I_RPY  = -1 I_CPY  = 0 I_ICON = FX_ICON ).
      SEPIYI( I_RPY  = 1 I_CPY  = 0 I_ICON = LV_EN ).
      SEPIYI( I_RPY  = -1 I_CPY  = -1 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = -1 I_CPY  = 1 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = 0 I_CPY  = -1 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = 0 I_CPY  = 1 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = 1 I_CPY  = -1 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = 1 I_CPY  = 1 I_ICON = LV_LZ ).
    ELSEIF FX_ICON = PAOG_L.
      ZHUSE-COL = ZHUSE-COL - I_FXSD-SD.
      IF ZHUSE-COL < 2.
        ZHUSE-COL = 2.
        RE_ERROR = 'X'.
      ENDIF.
      APPEND ZHUSE TO IT_SEKUAI.
      SEPIYI( I_RPY  = 0 I_CPY  = -1 I_ICON = FX_ICON ).
      SEPIYI( I_RPY  = 0 I_CPY  = 1 I_ICON = LV_EN ).
      SEPIYI( I_RPY  = -1 I_CPY  = -1 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = 1 I_CPY  = -1 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = -1 I_CPY  = 0 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = -1 I_CPY  = 1 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = 1 I_CPY  = 0 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = 1 I_CPY  = 1 I_ICON = LV_LZ ).

    ELSEIF FX_ICON = PAOG_D.
      ZHUSE-ROW = ZHUSE-ROW + I_FXSD-SD.
      IF ZHUSE-ROW >= GV_TABROW.
        ZHUSE-ROW = GV_TABROW - 1.
        RE_ERROR = 'X'.
      ENDIF.
      APPEND ZHUSE TO IT_SEKUAI.
      SEPIYI( I_RPY  = 1 I_CPY  = 0 I_ICON = FX_ICON ).
      SEPIYI( I_RPY  = 1 I_CPY  = 0 I_ICON = FX_ICON ).
      SEPIYI( I_RPY  = -1 I_CPY  = 0 I_ICON = LV_EN ).
      SEPIYI( I_RPY  = -1 I_CPY  = -1 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = -1 I_CPY  = 1 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = 0 I_CPY  = -1 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = 0 I_CPY  = 1 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = 1 I_CPY  = -1 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = 1 I_CPY  = 1 I_ICON = LV_LZ ).
    ELSEIF FX_ICON = PAOG_R.
      ZHUSE-COL = ZHUSE-COL + I_FXSD-SD.
      IF ZHUSE-COL >= GV_TABCOL.
        ZHUSE-COL = GV_TABCOL - 1.
        RE_ERROR = 'X'.
      ENDIF.
      APPEND ZHUSE TO IT_SEKUAI.
      SEPIYI( I_RPY  = 0 I_CPY  = 1 I_ICON = FX_ICON ).
      SEPIYI( I_RPY  = 0 I_CPY  = -1 I_ICON = LV_EN ).
      SEPIYI( I_RPY  = -1 I_CPY  = 1 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = 1 I_CPY  = 1 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = -1 I_CPY  = -1 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = -1 I_CPY  = 0 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = 1 I_CPY  = -1 I_ICON = LV_LZ ).
      SEPIYI( I_RPY  = 1 I_CPY  = 0 I_ICON = LV_LZ ).

    ENDIF.

  ENDMETHOD.

ENDCLASS.

CLASS LC_GAME DEFINITION.
  PUBLIC SECTION.
    METHODS:
      CONSTRUCTOR IMPORTING IM_DRSL TYPE I,
      HANDLE_TIMER FOR EVENT FINISHED OF CL_GUI_TIMER,
      OPERATION IMPORTING IM_FX TYPE ICON_L2,
      GET_JIESHU RETURNING VALUE(RE_SULT) TYPE CHAR1,
      GET_HEADTEXT EXPORTING VALUE(LT_LIST) TYPE SLIS_T_LISTHEADER,
      SHOW_ALV CHANGING CH_ALG TYPE TYT_ICON.
  PRIVATE SECTION.
*    CLASS-DATA:
*      GVT_YOUX TYPE TYT_YOUX. "优先级表
    DATA:
      DF_SUM      TYPE I, "敌方坦克总数量
      DF_ALIVE    TYPE I, "地方坦克在屏幕存活数量
      DF_DIED     TYPE I, "消灭坦克总数量
      DF_DIED_1   TYPE I, "消灭轻坦克数量
      DF_DIED_2   TYPE I, "消灭中坦克数量
      DF_DIED_3   TYPE I, "消灭重坦克数量
      LV_BEGINT   TYPE SY-UZEIT, "游戏开始时间

      DF_DINGSHI  TYPE I, "敌方定时次数
      WF_GANG     TYPE I, "我方无敌次数
      DF_BOOM     TYPE CHAR1, "将屏幕上的所有敌人炸毁
      WF_SHENGJI  TYPE CHAR1, "我方升级
      LT_HQHQ     TYPE TABLE OF TY_COOR, "红旗保护墙的坐标

      LT_ALVZB    TYPE TABLE OF TY_ALVZB,
      LTR_BRICK   TYPE TABLE OF REF TO LC_BRICK,
      LTR_DFTANK  TYPE TABLE OF REF TO LC_TANK,
      LTR_SHELL   TYPE TABLE OF REF TO LC_SHELL,
      LVR_HQBRICK TYPE REF TO LC_BRICK,
      LVR_WFTANK  TYPE REF TO LC_TANK,
      LTR_SHAPE   TYPE TABLE OF REF TO LC_SHAPE.
    METHODS:
      PRI_CRE_BRICK IMPORTING IM_ROW1 TYPE I
                              IM_COL1 TYPE I
                              IM_ROW2 TYPE I
                              IM_COL2 TYPE I
                              IM_ICON TYPE ICON_L2,
      GET_OBJECT,
      CRE_NEWDF, "新增敌人
      CRE_DAOJU, "新增道具
      GET_ALVZB IMPORTING IM_SHAPE          TYPE REF TO LC_SHAPE
                RETURNING VALUE(RE_SHIXIAO) TYPE CHAR1.
ENDCLASS.
CLASS LC_GAME IMPLEMENTATION.

  METHOD PRI_CRE_BRICK.
    DATA(LV_LINE_R) = IM_ROW2 - IM_ROW1 + 1.
    DATA(LV_LINE_C) = IM_COL2 - IM_COL1 + 1.
    IF LV_LINE_R < 0 OR  LV_LINE_C < 0.
      RETURN.
    ENDIF.

    DATA LV_CHAR1 TYPE I.
    DATA LV_CHAR2 TYPE I.

    DATA LS_SEKUAI TYPE TY_SEKUAI.
    CLEAR LS_SEKUAI.
    IF IM_ICON = LC_BRICK=>BRICK_GM.
      LS_SEKUAI-ICON = LC_BRICK=>BRICK_ZT.
    ELSE.
      LS_SEKUAI-ICON = IM_ICON.
    ENDIF.
    LS_SEKUAI-ROW = IM_ROW1 - 1.
    DO LV_LINE_R TIMES.
      LS_SEKUAI-ROW = LS_SEKUAI-ROW + 1.
      LS_SEKUAI-COL = IM_COL1 - 1.
      LV_CHAR2 = SY-INDEX MOD 2.
      DO LV_LINE_C TIMES.
        LS_SEKUAI-COL = LS_SEKUAI-COL + 1.
        LV_CHAR1 = LS_SEKUAI-COL MOD 2.
        DATA LOB_BRICK TYPE REF TO LC_BRICK.
        CLEAR LOB_BRICK.
        CREATE OBJECT LOB_BRICK
          EXPORTING
            I_SEKUAI = LS_SEKUAI.
        IF IM_ICON = LC_BRICK=>BRICK_GM.
          LOB_BRICK->SET_ZHENGY( 'HQ' ). "红旗保护墙
          DATA WA_HQHQ LIKE LINE OF LT_HQHQ.
          WA_HQHQ-ROW = LS_SEKUAI-ROW.
          WA_HQHQ-COL = LS_SEKUAI-COL.
          APPEND WA_HQHQ TO LT_HQHQ.
        ENDIF.
        IF IM_ICON = LC_BRICK=>BRICK_HQ. "我方紅旗
          LVR_HQBRICK = LOB_BRICK.
        ENDIF.
        IF IM_ICON = LC_BRICK=>BRICK_SL. "树林
          IF ( LV_CHAR2 = 0 AND LV_CHAR1 = 0 ) OR ( LV_CHAR2 = 1 AND LV_CHAR1 = 1 ).
            APPEND LOB_BRICK TO LTR_BRICK.
          ENDIF.
        ELSE.
          APPEND LOB_BRICK TO LTR_BRICK.
        ENDIF.
      ENDDO.
    ENDDO.

  ENDMETHOD.

*  METHOD ADDSEKUAI.
*    RE_SEKUAI = IM_SEKUAI.
*    RE_SEKUAI-ROW = RE_SEKUAI-ROW + IM_ROW.
*    RE_SEKUAI-COL = RE_SEKUAI-COL + IM_COL.
*  ENDMETHOD.

  METHOD GET_OBJECT.
    CLEAR: LTR_BRICK,LTR_DFTANK,LVR_WFTANK,LTR_SHELL,LVR_HQBRICK,DF_ALIVE.
    CLEAR: DF_BOOM,WF_SHENGJI. "清除BUFF状态
    LOOP AT LTR_SHAPE INTO DATA(WA_SHAPE).
      DATA(LV_NAME) = WA_SHAPE->GET_NAME( ).
      DATA(LV_ZHENGY) = WA_SHAPE->GET_ZHENGY( ).
      IF LV_NAME = 'SHELL'.
        DATA LVO_SHELL TYPE REF TO LC_SHELL.
        CLEAR LVO_SHELL.
        LVO_SHELL ?= WA_SHAPE.
        APPEND LVO_SHELL TO LTR_SHELL.
      ELSEIF LV_NAME = 'TANK'.
        IF LV_ZHENGY = 'DF'.
          DATA LVO_DFTANK TYPE REF TO LC_TANK.
          CLEAR LVO_DFTANK.
          LVO_DFTANK ?= WA_SHAPE.
          APPEND LVO_DFTANK TO LTR_DFTANK.
          DF_ALIVE = DF_ALIVE + 1.
        ELSEIF LV_ZHENGY = 'WF'.
          LVR_WFTANK ?= WA_SHAPE.
        ENDIF.
      ELSEIF LV_NAME(5) = 'BRICK'.
        DATA LVO_BRICK TYPE REF TO LC_BRICK.
        CLEAR LVO_BRICK.
        LVO_BRICK ?= WA_SHAPE.
        APPEND LVO_BRICK TO LTR_BRICK.
        IF LV_NAME = 'BRICK_HQ'.
          LVR_HQBRICK ?= WA_SHAPE.
        ENDIF.
      ENDIF.
    ENDLOOP.
  ENDMETHOD.

  METHOD CRE_DAOJU.

    DATA: LV_MB TYPE I,
          LV_LW TYPE I,
          LV_ZD TYPE I,
          LV_GM TYPE I.
    LOOP AT LTR_SHAPE INTO DATA(WA_SHAPE).
      DATA(LV_NAME) = WA_SHAPE->GET_NAME( ).
      IF LV_NAME = 'BRICK_MB'.
        LV_MB = LV_MB + 1.
      ELSEIF LV_NAME = 'BRICK_LW'.
        LV_LW = LV_LW + 1.
      ELSEIF LV_NAME = 'BRICK_ZD'.
        LV_ZD = LV_ZD + 1.
      ELSEIF LV_NAME = 'BRICK_GM'.
        LV_GM = LV_GM + 1.
      ENDIF.
    ENDLOOP.

    DATA LS_SEKUAI TYPE TY_SEKUAI.
    CLEAR LS_SEKUAI.

    DATA LV_RANDOM TYPE QF00-RAN_INT.
    LV_RANDOM = LC_SHAPE=>GET_RANDOM( I_MIN = 0 I_MAX = 100 ).
    IF LV_RANDOM <= 2 AND LV_MB = 0.
      LS_SEKUAI-ICON = LC_BRICK=>BRICK_MB. "秒表
    ELSEIF LV_RANDOM <= 4 AND LV_LW = 0.
      LS_SEKUAI-ICON = LC_BRICK=>BRICK_LW. "礼物
    ELSEIF LV_RANDOM <= 6 AND LV_ZD = 0.
      LS_SEKUAI-ICON = LC_BRICK=>BRICK_ZD. "炸弹
    ELSEIF LV_RANDOM <= 8 AND LV_GM = 0.
      LS_SEKUAI-ICON = LC_BRICK=>BRICK_GM. "钢帽
    ELSE.
      RETURN.
    ENDIF.


    IF LS_SEKUAI-ICON <> ''.
      LS_SEKUAI-COL = LC_SHAPE=>GET_RANDOM( I_MIN = 1 I_MAX = GV_TABCOL - 1 ).
      LS_SEKUAI-ROW = LC_SHAPE=>GET_RANDOM( I_MIN = 1 I_MAX = GV_TABROW - 1 ).
      DATA WA_DJ TYPE REF TO LC_BRICK.
      CREATE OBJECT WA_DJ
        EXPORTING
          I_SEKUAI = LS_SEKUAI.
      DATA LV_ERROR TYPE CHAR1.
      LV_ERROR = ''.
      LOOP AT LTR_SHAPE INTO WA_SHAPE.
        IF WA_DJ->HIT( WA_SHAPE ) = 'X'.
          LV_ERROR = 'X'.
          EXIT.
        ENDIF.
      ENDLOOP.
      IF LV_ERROR = ''.
        APPEND WA_DJ TO LTR_SHAPE.
      ELSE.
        FREE WA_DJ.
      ENDIF.
    ENDIF.

  ENDMETHOD.

  METHOD CRE_NEWDF.

    DATA LV_RANDOM TYPE QF00-RAN_INT.
    LV_RANDOM = LC_SHAPE=>GET_RANDOM( I_MIN = 0 I_MAX = 100 ).
    IF LV_RANDOM <= 80.
    ELSE.
      RETURN.
    ENDIF.

    DATA LS_SEKUAI TYPE TY_SEKUAI.
    LS_SEKUAI-COL = GV_TABCOL - 1.
    LS_SEKUAI-ROW = LC_SHAPE=>GET_RANDOM( I_MIN = 2 I_MAX = GV_TABROW - 1 ).
    LS_SEKUAI-ICON = LC_TANK=>TANK_DF. "敌方坦克
    DATA WA_DFTANK TYPE REF TO LC_TANK.
    CREATE OBJECT WA_DFTANK
      EXPORTING
        I_SEKUAI = LS_SEKUAI
        I_TYPE   = 0 "坦克類型,0代表随机类型
        I_FX     = PAOG_L.

    DATA LV_ERROR TYPE CHAR1.
    LV_ERROR = ''.
    LOOP AT LTR_SHAPE INTO DATA(WA_SHAPE).
      IF WA_DFTANK->HIT( WA_SHAPE ) = 'X'.
        LV_ERROR = 'X'.
        EXIT.
      ENDIF.
    ENDLOOP.

    IF LV_ERROR = ''.
      APPEND WA_DFTANK TO LTR_SHAPE.
    ELSE.
*      FREE OBJECT WA_DFTANK.
      FREE WA_DFTANK.
    ENDIF.

  ENDMETHOD.
  METHOD CONSTRUCTOR.

    DF_SUM = IM_DRSL. "敌方数量

    LV_BEGINT = SY-UZEIT. "游戏开始时间

*    CLEAR: GVT_YOUX.
*    GVT_YOUX = VALUE #( ( NAME = 'SHELL' SHIXIAO = '' YOUX = '1' )
*                        ( NAME = 'SHELL' SHIXIAO = 'X' YOUX = '3' )
*                        ( NAME = 'BRICK_GB' SHIXIAO = '' YOUX = '4' )
*                        ( NAME = 'BRICK_SL' SHIXIAO = '' YOUX = '4' )
*                        ( NAME = 'BRICK_HB' SHIXIAO = '' YOUX = '4' )
*    ).

*    我方堡垒
    DATA LOB_BRICK TYPE REF TO LC_BRICK.
    DATA LS_SEKUAI TYPE TY_SEKUAI.

    DATA LV_COOR TYPE TY_COOR. "我方红旗位置坐标
    LV_COOR-ROW = GV_TABROW / 2. "红旗位置在屏幕一半的行
    LV_COOR-COL = 1.
*   创建我方红旗
    PRI_CRE_BRICK( IM_ROW1 = LV_COOR-ROW IM_COL1 = LV_COOR-COL
                   IM_ROW2 = LV_COOR-ROW IM_COL2 = LV_COOR-COL
                   IM_ICON = LC_BRICK=>BRICK_HQ ).
*    创建红旗上方保护墙
    PRI_CRE_BRICK( IM_ROW1 = LV_COOR-ROW - 2 IM_COL1 = LV_COOR-COL
                   IM_ROW2 = LV_COOR-ROW - 1 IM_COL2 = LV_COOR-COL + 2
                   IM_ICON = LC_BRICK=>BRICK_GM ).
*    创建红旗下方保护墙
    PRI_CRE_BRICK( IM_ROW1 = LV_COOR-ROW + 1 IM_COL1 = LV_COOR-COL
                   IM_ROW2 = LV_COOR-ROW + 2 IM_COL2 = LV_COOR-COL + 2
                   IM_ICON = LC_BRICK=>BRICK_GM ).
*    创建红旗前方保护墙
    PRI_CRE_BRICK( IM_ROW1 = LV_COOR-ROW IM_COL1 = LV_COOR-COL + 1
                   IM_ROW2 = LV_COOR-ROW IM_COL2 = LV_COOR-COL + 2
                   IM_ICON = LC_BRICK=>BRICK_GM ).

*    创建砖墙区域(从坐标1,18到坐标13,24之间的方形区域)
    PRI_CRE_BRICK( IM_ROW1 = 1 IM_COL1 = 18 IM_ROW2 = 13 IM_COL2 = 24
                   IM_ICON = LC_BRICK=>BRICK_ZT ).

*    创建钢铁墙区域(从坐标14,18到坐标27,21之间的方形区域)
    PRI_CRE_BRICK( IM_ROW1 = 14 IM_COL1 = 18 IM_ROW2 = 27 IM_COL2 = 21
                   IM_ICON = LC_BRICK=>BRICK_GB ).

*    创建湖泊河流(从坐标16,30到坐标24,35之间的方形区域)
    PRI_CRE_BRICK( IM_ROW1 = 16 IM_COL1 = 30 IM_ROW2 = 24 IM_COL2 = 35
                   IM_ICON = LC_BRICK=>BRICK_HB ).

*    创建树林(从坐标18,17到坐标40,39之间的方形区域)
    PRI_CRE_BRICK( IM_ROW1 = 28 IM_COL1 = 17 IM_ROW2 = GV_TABROW IM_COL2 = 39
                   IM_ICON = LC_BRICK=>BRICK_SL ).

*  创建我方坦克,位置放在红旗正前方保护旗帜
    CLEAR LS_SEKUAI.
    LS_SEKUAI-ROW = GV_TABROW / 2.
    LS_SEKUAI-COL = 6.
    LS_SEKUAI-ICON = LC_TANK=>TANK_WF. "我方陣營
    CREATE OBJECT LVR_WFTANK
      EXPORTING
        I_SEKUAI = LS_SEKUAI
        I_TYPE   = 1 "1轻坦克,2中坦克,3重坦克
        I_FX     = PAOG_R.
    LVR_WFTANK->SPEED = '2'.

*  創建敵方坦克
    DF_ALIVE = 0.
    DATA LV_JG TYPE I.
    LV_JG = GV_TABROW / 6.
    LS_SEKUAI-ROW = 0.
    DATA LV_SLTMP TYPE I.
    IF DF_SUM > GV_DFALIV.
      LV_SLTMP = GV_DFALIV.
    ELSE.
      LV_SLTMP = DF_SUM.
    ENDIF.
    DATA LV_TMP TYPE I VALUE 0.
    DO LV_SLTMP TIMES.
      LV_SLTMP = LV_SLTMP + 1.
      IF LV_SLTMP >= '4'.
        LV_SLTMP = '1'.
      ENDIF.
      LS_SEKUAI-ROW = LS_SEKUAI-ROW + LV_JG.
      LS_SEKUAI-COL = GV_TABCOL - 1.
      LS_SEKUAI-ICON = LC_TANK=>TANK_DF. "敵方陣營
      DATA WA_DFTANK TYPE REF TO LC_TANK.
      CLEAR WA_DFTANK.
      CREATE OBJECT WA_DFTANK
        EXPORTING
          I_SEKUAI = LS_SEKUAI
          I_TYPE   = LV_SLTMP "坦克類型
          I_FX     = PAOG_L.
      DF_ALIVE = DF_ALIVE + 1.
      APPEND WA_DFTANK TO LTR_DFTANK.
    ENDDO.


    APPEND LINES OF LTR_BRICK TO LTR_SHAPE.
    APPEND LVR_WFTANK TO LTR_SHAPE.
    APPEND LINES OF LTR_DFTANK TO LTR_SHAPE.

  ENDMETHOD.

  METHOD GET_HEADTEXT.
    DATA:
      LS_HEADER TYPE SLIS_LISTHEADER,
      LV_NAMEF  TYPE CHAR30,
      LV_NAMEL  TYPE CHAR30,
      LV_WEEK   TYPE SCAL-WEEK.

    DATA LV_SECONDS TYPE INT4.
    LV_SECONDS = SY-UZEIT - LV_BEGINT.
    DATA LV_FEN TYPE INT4.
    LV_FEN = LV_SECONDS / 60.
    LV_SECONDS = LV_SECONDS MOD 60.

    LS_HEADER-TYP  = 'S'.
    LS_HEADER-KEY = '击毁坦克' && DF_DIED && '辆:'.
    LS_HEADER-INFO = LS_HEADER-INFO && '轻型坦克' && DF_DIED_1 && '辆,'.
    LS_HEADER-INFO = LS_HEADER-INFO && '中型坦克' && DF_DIED_2 && '辆,'.
    LS_HEADER-INFO = LS_HEADER-INFO && '重型坦克' && DF_DIED_3 && '辆。'.
    LS_HEADER-INFO = LS_HEADER-INFO && '花费时间:' && LV_FEN && '分' && LV_SECONDS && '秒。'.
    APPEND LS_HEADER TO LT_LIST .
    CLEAR  LS_HEADER .


    LS_HEADER-TYP  = 'S'.
    LS_HEADER-KEY  = '道具效果:' .
    LS_HEADER-INFO = ''.
    IF WF_SHENGJI = 'X'.
      LS_HEADER-INFO = LS_HEADER-INFO && '我方坦克等级提升。'.
    ENDIF.
    IF DF_BOOM = 'X'.
      LS_HEADER-INFO = LS_HEADER-INFO && '炸弹效果将所有敌方炸毁。'.
    ENDIF.
    IF DF_DINGSHI > 0.
      LS_HEADER-INFO = LS_HEADER-INFO && '定时效果剩余' && DF_DINGSHI && '次。'.
    ENDIF.
    IF WF_GANG > 0.
      LS_HEADER-INFO = LS_HEADER-INFO && '无敌效果剩余' && WF_GANG && '次。'.
    ENDIF.

    APPEND LS_HEADER TO LT_LIST .
    CLEAR  LS_HEADER .
  ENDMETHOD.

  METHOD GET_JIESHU.
    RE_SULT = LVR_WFTANK->GET_SHIXIAO( ).
    IF RE_SULT = ''.
      RE_SULT = LVR_HQBRICK->GET_SHIXIAO( ).
    ENDIF.
    IF RE_SULT = ''.
      IF DF_SUM = DF_DIED.
        RE_SULT = 'S'.
      ENDIF.
    ENDIF.
  ENDMETHOD.
  METHOD OPERATION.

*  获取对象
    ME->GET_OBJECT( ).

*  我方坦克
    IF WF_GANG > 0. "我方坦克无敌时间-1
      WF_GANG = WF_GANG - 1.
    ENDIF.
    IF IM_FX = ''.
    ELSEIF IM_FX <> 'FIRE'. "移动
      DATA LV_FXSD TYPE TY_FXSD.
      CLEAR LV_FXSD.
      LV_FXSD-FX_ICON = IM_FX.
      LV_FXSD-SD = 1.
      DATA LV_ERROR TYPE CHAR1.
      LV_ERROR = ''.
      DO LVR_WFTANK->SPEED TIMES.
        IF LVR_WFTANK->MOVE( LV_FXSD ) = 'X'.
          EXIT.
        ENDIF.
        LOOP AT LTR_SHAPE INTO DATA(WA_SHAPE).
          DATA(LV_NAME) = WA_SHAPE->GET_NAME( ).
          IF LV_NAME = 'TANK' OR
             LV_NAME = 'BRICK_ZT' OR
             LV_NAME = 'BRICK_HB' OR
             LV_NAME = 'BRICK_HQ' OR
             LV_NAME = 'BRICK_GB'.
            IF LVR_WFTANK->HIT( WA_SHAPE ) = 'X'.
              LV_FXSD-SD = -1.
              LVR_WFTANK->MOVE( LV_FXSD ).
              LV_ERROR = 'X'.
              EXIT.
            ENDIF.
          ELSEIF LV_NAME = 'BRICK_LW'.
            IF LVR_WFTANK->HIT( WA_SHAPE ) = 'X'.
              LVR_WFTANK->KILL( 1 ). "我方坦克升级
              WF_SHENGJI = 'X'.
              WA_SHAPE->SET_SHIXIAO( 'X' ).
            ENDIF.
          ELSEIF LV_NAME = 'BRICK_ZD'.
            IF LVR_WFTANK->HIT( WA_SHAPE ) = 'X'. "将所有敌人炸毁
              DF_BOOM = 'X'.
              WA_SHAPE->SET_SHIXIAO( 'X' ).
            ENDIF.
          ELSEIF LV_NAME = 'BRICK_MB'.
            IF LVR_WFTANK->HIT( WA_SHAPE ) = 'X'.
              DF_DINGSHI = 20. "定时效果20次
              WA_SHAPE->SET_SHIXIAO( 'X' ).
            ENDIF.
          ELSEIF LV_NAME = 'BRICK_GM'.
            IF LVR_WFTANK->HIT( WA_SHAPE ) = 'X'.
              WF_GANG = 20. "我方无敌效果20次
              WA_SHAPE->SET_SHIXIAO( 'X' ).
            ENDIF.
          ENDIF.
        ENDLOOP.
        IF LV_ERROR = 'X'.
          EXIT.
        ENDIF.
      ENDDO.
    ELSEIF IM_FX = 'FIRE'. "开火
      DATA LOB_WFSHELL1 TYPE REF TO LC_SHELL.
      DATA LOB_WFSHELL2 TYPE REF TO LC_SHELL.
      CLEAR: LOB_WFSHELL1,LOB_WFSHELL2.
      CALL METHOD LVR_WFTANK->FIRE
        IMPORTING
          RE_SHELL1 = LOB_WFSHELL1
          RE_SHELL2 = LOB_WFSHELL2.
      APPEND LOB_WFSHELL1 TO LTR_SHELL.
      APPEND LOB_WFSHELL1 TO LTR_SHAPE.
      IF LOB_WFSHELL2 IS NOT INITIAL.
        APPEND LOB_WFSHELL2 TO LTR_SHELL.
        APPEND LOB_WFSHELL2 TO LTR_SHAPE.
      ENDIF.
    ENDIF.
    LVR_WFTANK->MOVE( VALUE TY_FXSD( FX_ICON = '' SD = 0 ) ).


    IF DF_BOOM = 'X'. "吃了炸弹道具,则将所有敌人炸毁
      LOOP AT LTR_SHAPE INTO WA_SHAPE.
        LV_NAME = WA_SHAPE->GET_NAME( ).
        IF WA_SHAPE->GET_ZHENGY( ) = 'DF'.
          IF LV_NAME = 'SHELL' AND WA_SHAPE->GET_SHIXIAO( ) = ''.
            WA_SHAPE->SET_SHIXIAO( 'X' ).
          ELSEIF LV_NAME = 'TANK'.
            DATA LV_TMPTANK TYPE REF TO LC_TANK.
            LV_TMPTANK ?= WA_SHAPE.
            LV_TMPTANK->BOMB( ).
            LV_TMPTANK->SET_SHIXIAO( 'B' ).
          ENDIF.
        ENDIF.
      ENDLOOP.
    ENDIF.

    IF WF_GANG > 0. "有无敌道具,则修复被摧毁的红旗保护墙
      LOOP AT LT_HQHQ INTO DATA(WA_HQHQ).
        DATA LV_ZBBZ TYPE CHAR1. "1代表坐标为空,2代表
        LV_ZBBZ = ''.
        LOOP AT LTR_SHAPE INTO WA_SHAPE.
          IF WA_SHAPE->HIT2( WA_HQHQ ) = 'X'.
            LV_ZBBZ = 'X'. "当前坐标被其他物体占领,则不创建
            EXIT.
          ENDIF.
        ENDLOOP.
        IF LV_ZBBZ = ''.
          DATA LS_SEKUAI TYPE TY_SEKUAI.
          CLEAR LS_SEKUAI.
          LS_SEKUAI-ROW = WA_HQHQ-ROW.
          LS_SEKUAI-COL = WA_HQHQ-COL.
          LS_SEKUAI-ICON = LC_BRICK=>BRICK_ZT.
          DATA LOB_BRICK TYPE REF TO LC_BRICK.
          CLEAR LOB_BRICK.
          CREATE OBJECT LOB_BRICK
            EXPORTING
              I_SEKUAI = LS_SEKUAI.
          LOB_BRICK->SET_ZHENGY( 'HQ' ).
          APPEND LOB_BRICK TO LTR_BRICK.
          APPEND LOB_BRICK TO LTR_SHAPE.
        ENDIF.
      ENDLOOP.
    ENDIF.


**  敌方坦克
    IF DF_DINGSHI > 0. "如果有定时效果,则定时效果次数-1
      DF_DINGSHI = DF_DINGSHI - 1.
    ENDIF.
    IF DF_DINGSHI <= 0. "没有定时效果,则敌方坦克可以行动
      LOOP AT LTR_DFTANK INTO DATA(WA_DFTANK).
        IF WA_DFTANK->GET_SHIXIAO( ) = 'X'.
        ELSE.
**    敵方主動攻擊
          CLEAR LV_FXSD.
          LV_FXSD-FX_ICON = WA_DFTANK->ZUIJI( LVR_WFTANK ).
          IF LV_FXSD-FX_ICON <> ''.
            WA_DFTANK->MOVE( LV_FXSD ).
            CLEAR: LOB_WFSHELL1,LOB_WFSHELL2.
            CALL METHOD WA_DFTANK->FIRE
              IMPORTING
                RE_SHELL1 = LOB_WFSHELL1
                RE_SHELL2 = LOB_WFSHELL2.
            APPEND LOB_WFSHELL1 TO LTR_SHELL.
            APPEND LOB_WFSHELL1 TO LTR_SHAPE.
            IF LOB_WFSHELL2 IS NOT INITIAL.
              APPEND LOB_WFSHELL2 TO LTR_SHELL.
              APPEND LOB_WFSHELL2 TO LTR_SHAPE.
            ENDIF.
          ELSE.
            DATA LV_FLAG TYPE C.
            LV_FLAG = 'X'.
            WHILE LV_FLAG = 'X'.
              LV_FLAG = ''.
              CLEAR LV_FXSD.
              LV_FXSD = WA_DFTANK->AUTO( ).
              IF LV_FXSD IS NOT INITIAL.
                LV_FLAG = WA_DFTANK->MOVE( LV_FXSD ).
                IF LV_FLAG = 'X'.
                  CONTINUE.
                ELSE.
                  LOOP AT LTR_SHAPE INTO WA_SHAPE.
                    LV_NAME = WA_SHAPE->GET_NAME( ).
                    IF LV_NAME = 'TANK' OR
                       LV_NAME = 'BRICK_ZT' OR
                       LV_NAME = 'BRICK_HB' OR
                       LV_NAME = 'BRICK_HQ' OR
                       LV_NAME = 'BRICK_GB' OR
                       LV_NAME = 'BRICK_MB' OR
                       LV_NAME = 'BRICK_LW' OR
                       LV_NAME = 'BRICK_ZD' OR
                       LV_NAME = 'BRICK_GM'.
                      IF WA_DFTANK->HIT( WA_SHAPE ) = 'X'.
                        LV_FXSD-SD = LV_FXSD-SD * -1.
                        WA_DFTANK->MOVE( LV_FXSD ).
                        LV_FLAG = 'X'.
                        EXIT.
                      ENDIF.
                    ENDIF.
                  ENDLOOP.
                ENDIF.
              ELSE.
                CLEAR: LOB_WFSHELL1,LOB_WFSHELL2.
                CALL METHOD WA_DFTANK->FIRE
                  IMPORTING
                    RE_SHELL1 = LOB_WFSHELL1
                    RE_SHELL2 = LOB_WFSHELL2.
                APPEND LOB_WFSHELL1 TO LTR_SHELL.
                APPEND LOB_WFSHELL1 TO LTR_SHAPE.
                IF LOB_WFSHELL2 IS NOT INITIAL.
                  APPEND LOB_WFSHELL2 TO LTR_SHELL.
                  APPEND LOB_WFSHELL2 TO LTR_SHAPE.
                ENDIF.
              ENDIF.
            ENDWHILE.
          ENDIF.
          WA_DFTANK->MOVE( VALUE TY_FXSD( FX_ICON = '' SD = 0 ) ).
        ENDIF.
      ENDLOOP.
    ENDIF.

*  炮弹飞行
    DATA WA_ZJ LIKE LINE OF LTR_SHELL.
    LOOP AT LTR_SHELL INTO DATA(WA_SHELL).
      IF WA_SHELL->GET_SHIXIAO( ) = 'X'.
        CONTINUE.
      ENDIF.
      DO WA_SHELL->SPEED TIMES.
        WA_SHELL->MOVE( 1 ).
        IF WA_SHELL->HIT_LINE( ) = 'X'.
          WA_SHELL->MOVE( -1 ).
          WA_SHELL->SET_SHIXIAO( 'X' ).
          EXIT.
        ELSE.
          LOOP AT LTR_SHAPE INTO WA_SHAPE.
            LV_NAME = WA_SHAPE->GET_NAME( ).
            IF LV_NAME = 'TANK' OR LV_NAME = 'SHELL'.
              IF WA_SHAPE->GET_ZHENGY( ) <> WA_SHELL->GET_ZHENGY( ).
                IF WA_SHELL->HIT( WA_SHAPE ) = 'X'.
                  WA_SHELL->SET_SHIXIAO( 'X' ).
                  EXIT.
                ENDIF.
              ENDIF.
            ELSEIF LV_NAME = 'BRICK_ZT' OR LV_NAME = 'BRICK_HQ' OR LV_NAME = 'BRICK_GB'.
              IF WA_SHELL->HIT( WA_SHAPE ) = 'X'.
                WA_SHELL->SET_SHIXIAO( 'X' ).
                EXIT.
              ENDIF.
            ENDIF.
          ENDLOOP.
          IF WA_SHELL->GET_SHIXIAO( ) = 'X'.
            WA_SHELL->MOVE( -1 ).
            EXIT.
          ENDIF.
        ENDIF.
      ENDDO.
    ENDLOOP.
*  炮弹爆炸
    LOOP AT LTR_SHELL INTO WA_SHELL.
      IF WA_SHELL->GET_SHIXIAO( ) = 'X'.
        WA_SHELL->BOMB( ). "炮弹爆炸
        LOOP AT LTR_SHAPE INTO WA_SHAPE.
          IF WA_SHAPE->GET_SHIXIAO( ) = ''.
            LV_NAME = WA_SHAPE->GET_NAME( ).
            IF LV_NAME = 'TANK'.
              IF WA_SHAPE->GET_ZHENGY( ) = 'WF' AND WF_GANG > 0.
              ELSE.
                IF WA_SHAPE->GET_ZHENGY( ) <> WA_SHELL->GET_ZHENGY( ).
                  IF WA_SHELL->HIT( WA_SHAPE ) = 'X'.
                    WA_SHAPE->SET_SHIXIAO( 'X' ).
                    IF WA_SHAPE->GET_SHIXIAO( ) = 'X'.
                      DATA LV_TANK TYPE REF TO LC_TANK.
                      LV_TANK ?= WA_SHAPE.
                      WA_SHELL->HIT_KILL( LV_TANK->GET_TYPE_Y( ) ).
                    ENDIF.
                  ENDIF.
                ENDIF.
              ENDIF.
            ELSEIF LV_NAME = 'SHELL'.
              IF WA_SHAPE->GET_ZHENGY( ) <> WA_SHELL->GET_ZHENGY( ).
                IF WA_SHELL->HIT( WA_SHAPE ) = 'X'.
                  WA_SHAPE->SET_SHIXIAO( 'X' ).
                ENDIF.
              ENDIF.
            ELSEIF LV_NAME = 'BRICK_ZT'.
              IF WF_GANG > 0 AND WA_SHAPE->GET_ZHENGY( ) = 'HQ'.
              ELSE.
                IF WA_SHELL->HIT( WA_SHAPE ) = 'X'.
                  WA_SHAPE->SET_SHIXIAO( 'X' ).
                ENDIF.
              ENDIF.
            ELSEIF LV_NAME = 'BRICK_HQ'.
              IF WA_SHELL->HIT( WA_SHAPE ) = 'X'.
                WA_SHAPE->SET_SHIXIAO( 'X' ).
              ENDIF.
            ENDIF.
          ENDIF.
        ENDLOOP.
      ENDIF.
    ENDLOOP.


*    新增敌方坦克
    IF DF_ALIVE < GV_DFALIV AND DF_SUM > DF_DIED + DF_ALIVE.
      ME->CRE_NEWDF( ).
    ENDIF.

*    新增道具
    ME->CRE_DAOJU( ).


  ENDMETHOD.

  METHOD GET_ALVZB.

    DATA(LV_NAME) = IM_SHAPE->GET_NAME( ).
    DATA(LV_ZHENGY) = IM_SHAPE->GET_ZHENGY( ).

    DATA LT_SEKUAI TYPE TYT_SEKUAI.
    CLEAR LT_SEKUAI.
    CALL METHOD IM_SHAPE->GET_PANDING
      IMPORTING
        RT_SEKUAI = LT_SEKUAI.
    DATA LV_YX TYPE CHAR1 VALUE ''.
    LOOP AT LT_SEKUAI INTO DATA(WA_SEKUAI).
      READ TABLE LT_ALVZB ASSIGNING FIELD-SYMBOL(<LFS_ALVZB>)
                                    WITH KEY ROW = WA_SEKUAI-ROW
                                             COL = WA_SEKUAI-COL.
      IF SY-SUBRC = 0.
        IF LV_NAME = 'BRICK_SL' OR LV_NAME = 'BRICK_GB'.
          <LFS_ALVZB>-ICON = WA_SEKUAI-ICON.
          <LFS_ALVZB>-NAME = LV_NAME.
          <LFS_ALVZB>-ZHENGY = LV_ZHENGY.
        ELSEIF <LFS_ALVZB>-NAME = 'BRICK_SL' OR <LFS_ALVZB>-NAME = 'BRICK_GB'.
        ELSEIF LV_NAME = 'TANK' AND LV_ZHENGY = 'WF' AND WF_GANG > 0.
          IF WA_SEKUAI-ICON = LC_TANK=>TANK_LZ.
            <LFS_ALVZB>-ICON = LC_BRICK=>BRICK_GM.
          ELSE.
            <LFS_ALVZB>-ICON = WA_SEKUAI-ICON.
          ENDIF.
          <LFS_ALVZB>-NAME = LV_NAME.
          <LFS_ALVZB>-ZHENGY = LV_ZHENGY.
        ELSEIF <LFS_ALVZB>-NAME = 'TANK' AND <LFS_ALVZB>-ZHENGY = 'WF' AND WF_GANG > 0.
        ELSEIF LV_NAME = 'BRICK_ZT' AND LV_ZHENGY = 'HQ' AND WF_GANG > 0.
          <LFS_ALVZB>-ICON = LC_BRICK=>BRICK_GB.
          <LFS_ALVZB>-NAME = LV_NAME.
          <LFS_ALVZB>-ZHENGY = LV_ZHENGY.
        ELSEIF <LFS_ALVZB>-NAME = 'BRICK_ZT' AND <LFS_ALVZB>-ZHENGY = 'HQ' AND WF_GANG > 0.
        ELSEIF LV_NAME = 'SHELL'.
          IF IM_SHAPE->GET_SHIXIAO( ) = ''.
            <LFS_ALVZB>-ICON = WA_SEKUAI-ICON.
            <LFS_ALVZB>-NAME = LV_NAME.
            <LFS_ALVZB>-ZHENGY = LV_ZHENGY.
          ELSE.
            IF <LFS_ALVZB>-ZHENGY <> LV_ZHENGY.
              <LFS_ALVZB>-ICON = WA_SEKUAI-ICON.
              <LFS_ALVZB>-NAME = LV_NAME.
              <LFS_ALVZB>-ZHENGY = LV_ZHENGY.
            ENDIF.
          ENDIF.
        ELSEIF <LFS_ALVZB>-NAME = 'SHELL'.
        ENDIF.
      ELSE.
        DATA WA_ALVZB LIKE LINE OF LT_ALVZB.
        CLEAR WA_ALVZB.
        IF LV_NAME = 'TANK' AND LV_ZHENGY = 'WF' AND WF_GANG > 0 AND WA_SEKUAI-ICON = LC_TANK=>TANK_LZ.
          WA_ALVZB-ICON = LC_BRICK=>BRICK_GM.
        ELSEIF LV_NAME = 'BRICK_ZT' AND LV_ZHENGY = 'HQ' AND WF_GANG > 0.
          WA_ALVZB-ICON = LC_BRICK=>BRICK_GB.
        ELSE.
          WA_ALVZB-ICON = WA_SEKUAI-ICON.
        ENDIF.
        WA_ALVZB-ROW = WA_SEKUAI-ROW.
        WA_ALVZB-COL = WA_SEKUAI-COL.
        WA_ALVZB-NAME = LV_NAME.
        WA_ALVZB-ZHENGY = LV_ZHENGY.
        APPEND WA_ALVZB TO LT_ALVZB.
      ENDIF.
      IF WA_SEKUAI-ROW <= GV_TABROW AND WA_SEKUAI-ROW >= 1 AND
         WA_SEKUAI-COL <= GV_TABCOL AND WA_SEKUAI-COL >= 1.
        LV_YX = 'X'.
      ENDIF.
    ENDLOOP.
    IF LV_YX = ''.
      IM_SHAPE->SET_SHIXIAO( 'X' ).
      RE_SHIXIAO = 'X'.
    ELSE.
      RE_SHIXIAO = IM_SHAPE->GET_SHIXIAO( ).
    ENDIF.


  ENDMETHOD.
  METHOD SHOW_ALV.

    CLEAR LT_ALVZB.

    LOOP AT LTR_SHAPE INTO DATA(WA_SHAPE).
      DATA(LV_SHIXIAO) = GET_ALVZB( WA_SHAPE ). "删除失效的对象
      DATA(LV_ZHENGY) = WA_SHAPE->GET_ZHENGY( ).
      DATA(LV_NAME) = WA_SHAPE->GET_NAME( ).
      IF LV_NAME = 'TANK'.
        IF LV_ZHENGY = 'DF'.
          IF LV_SHIXIAO = 'X'.
            DF_DIED = DF_DIED + 1.
            DATA LV_TYPE TYPE I.
            DATA WA_DFTANK TYPE REF TO LC_TANK.
            WA_DFTANK ?= WA_SHAPE.
            LV_TYPE = WA_DFTANK->GET_TYPE_Y( ).
            IF LV_TYPE = 1.
              DF_DIED_1 = DF_DIED_1 + 1.
            ELSEIF LV_TYPE = 2.
              DF_DIED_2 = DF_DIED_2 + 1.
            ELSEIF LV_TYPE = 3.
              DF_DIED_3 = DF_DIED_3 + 1.
            ENDIF.
          ENDIF.
        ELSEIF LV_ZHENGY = 'WF'..
        ENDIF.
      ENDIF.
      IF LV_SHIXIAO = 'X'.
        IF LV_NAME = 'TANK' AND LV_ZHENGY = 'WF'.
        ELSEIF LV_NAME = 'BRICK_HQ'.
        ELSE.
          DELETE LTR_SHAPE.
        ENDIF.
      ENDIF.
    ENDLOOP.




    CLEAR: CH_ALG.
    DATA LV_ROW TYPE I.
    DATA LV_COL TYPE I.
    DATA LS_ALV LIKE LINE OF CH_ALG.
    FIELD-SYMBOLS <FS_FIELDD> TYPE ANY.
    DATA LS_ALVZB LIKE LINE OF LT_ALVZB.
    LV_ROW = 0.
    DO GV_TABROW TIMES.
      LV_ROW = LV_ROW + 1.
      LV_COL = 0.
      DO GV_TABCOL TIMES.
        LV_COL = LV_COL + 1.
        ASSIGN COMPONENT LV_COL OF
          STRUCTURE LS_ALV TO <FS_FIELDD>.
        READ TABLE LT_ALVZB INTO LS_ALVZB WITH KEY ROW = LV_ROW
                                                   COL = LV_COL.
        IF SY-SUBRC = 0.
          <FS_FIELDD> = LS_ALVZB-ICON.
        ELSE.
          <FS_FIELDD> = ''.
        ENDIF.
      ENDDO.
      APPEND LS_ALV TO CH_ALG.
    ENDDO.

    IF ME->GET_JIESHU( ) = '' AND P_REF = 'X'.
      GO_TIMER->RUN( ).
    ENDIF.

  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.

**&---刷新ALV
*    IF GR_GRID IS INITIAL.
*      CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
*        IMPORTING
*          E_GRID = GR_GRID.
*    ENDIF.
*    GR_GRID->REFRESH_TABLE_DISPLAY( IS_STABLE = VALUE LVC_S_STBL( ROW = 'X' COL = 'X' ) ).
  ENDMETHOD.
ENDCLASS.




DATA GR_GAME TYPE REF TO LC_GAME.

AT SELECTION-SCREEN.
  IF P_DRSL <= 0.
    MESSAGE '敌人数量不能为0' TYPE 'E'.
  ENDIF.

INITIALIZATION.
  PERFORM FRM_INITIAL.

START-OF-SELECTION.
  PERFORM FRM_SHOWALV.

*&---------------------------------------------------------------------*
*&      Form  FRM_INITIAL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_INITIAL.
  DATA LV_COL TYPE I.
  DATA LV_FLAG TYPE C.
  FIELD-SYMBOLS <FS_FIELDD> TYPE ANY.
  FIELD-SYMBOLS <FS_ICON> TYPE TY_ICON.
  DATA LS_ICON TYPE TY_ICON.
  ASSIGN LS_ICON TO <FS_ICON>.

  LV_FLAG = ''.
  GV_TABCOL = 0.
  WHILE LV_FLAG IS INITIAL.
    GV_TABCOL = GV_TABCOL + 1.
    ASSIGN COMPONENT GV_TABCOL OF
      STRUCTURE LS_ICON TO <FS_FIELDD>.
    IF SY-SUBRC = 0.
    ELSE.
      LV_FLAG = 'X'.
      GV_TABCOL = GV_TABCOL - 1.
    ENDIF.
  ENDWHILE.

  CREATE OBJECT GR_GAME
    EXPORTING
      IM_DRSL = P_DRSL.

  CREATE OBJECT GO_TIMER.
  SET HANDLER GR_GAME->HANDLE_TIMER FOR GO_TIMER.
  GO_TIMER->INTERVAL = '1'. "間隔2秒

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_SHOWALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SHOWALV.

  DATA L_INDEX TYPE I.
  L_INDEX = 0.

  DATA LS_FIELDCAT LIKE LINE OF GT_FIELDCAT.

  DEFINE SUB_ADD_FIELD.
    l_index = l_index + 1.
    clear ls_fieldcat.
    ls_fieldcat-col_pos = l_index.
    ls_fieldcat-fieldname = &1.
    ls_fieldcat-scrtext_l = &2.
    ls_fieldcat-outputlen = &3.
    ls_fieldcat-icon = &4.
    ls_fieldcat-hotspot = ''.
    append ls_fieldcat to gt_fieldcat.
  END-OF-DEFINITION.

  DATA LV_FIELDTEXT TYPE CHAR10.
  DATA LV_FIELDNAME TYPE CHAR10.

  DO GV_TABCOL TIMES.
    DATA LV_NO(2) TYPE N.
    LV_NO = SY-INDEX.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = LV_NO
      IMPORTING
        OUTPUT = LV_NO.

    LV_FIELDTEXT = LV_NO && ''.
    LV_FIELDNAME = 'ICON' && SY-INDEX.
    SUB_ADD_FIELD LV_FIELDNAME LV_FIELDTEXT '5' 'X'.
  ENDDO.


  GS_LAYOUT-CWIDTH_OPT = 'X'.
  GS_LAYOUT-ZEBRA = 'X'.
  GS_LAYOUT-SEL_MODE = 'A'.
  GS_LAYOUT-EDIT_MODE = '1'.

  CLEAR GS_DISVARIANT.
  GS_DISVARIANT-REPORT = SY-REPID.
  GS_DISVARIANT-HANDLE = '1'.


*  PERFORM FRM_EXCLUDE_TB_FUNC.

**&---增加ALV回车事件
*  DATA LS_EVENTS LIKE LINE OF GT_EVENTS.
*  LS_EVENTS-NAME = 'FRM_CALLER_EXIT'. "'CALLER_EXIT'.
*  LS_EVENTS-FORM = 'FRM_CALLER_EXIT'.
*  APPEND LS_EVENTS TO GT_EVENTS.

  CALL METHOD GR_GAME->SHOW_ALV
    CHANGING
      CH_ALG = GT_ICON.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      I_CALLBACK_PF_STATUS_SET = 'FRM_USER_STATUS'
      I_CALLBACK_USER_COMMAND  = 'FRM_USER_COMMAND'
      I_CALLBACK_TOP_OF_PAGE   = 'FRM_TOP_OF_PAGE'
      IS_LAYOUT_LVC            = GS_LAYOUT
      IT_FIELDCAT_LVC          = GT_FIELDCAT
      IT_EXCLUDING             = GT_SLIS_T_EXTAB
      IS_VARIANT               = GS_DISVARIANT
    TABLES
      T_OUTTAB                 = GT_ICON
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.
ENDFORM.


FORM FRM_TOP_OF_PAGE.

  DATA: LT_HEADER TYPE SLIS_T_LISTHEADER.

  CALL METHOD GR_GAME->GET_HEADTEXT
    IMPORTING
      LT_LIST = LT_HEADER.

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      IT_LIST_COMMENTARY = LT_HEADER
*     I_LOGO             = 'ZLOGO'
      I_ALV_FORM         = 'X'.

ENDFORM.

FORM FRM_USER_COMMAND USING PV_UCOMM LIKE SY-UCOMM  "user_command
                            PV_SELFIELD TYPE SLIS_SELFIELD.

  IF GR_GRID IS INITIAL.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      IMPORTING
        E_GRID = GR_GRID.
  ENDIF.
*  CALL METHOD GR_GRID->CHECK_CHANGED_DATA. "将更新后的数据传到alv所对应的内表
  DATA LV_FX TYPE ICON_L2.
  CASE PV_UCOMM.
    WHEN 'UP'.
      LV_FX = PAOG_U.
    WHEN 'DOWN'.
      LV_FX = PAOG_D.
    WHEN 'LEFT'.
      LV_FX = PAOG_L.
    WHEN 'RIGHT'.
      LV_FX = PAOG_R.
    WHEN 'FIRE'.
      LV_FX = PV_UCOMM.
    WHEN '&F03'.
      LEAVE TO SCREEN 0.
  ENDCASE.
  IF LV_FX <> ''.
    IF GR_GAME->GET_JIESHU( ) = 'X'.
      GO_TIMER->CANCEL( ).
      MESSAGE '你失败了,游戏结束!' TYPE 'S' DISPLAY LIKE 'E'.
      RETURN.
    ELSEIF GR_GAME->GET_JIESHU( ) = 'S'.
      GO_TIMER->CANCEL( ).
      MESSAGE '成功消灭了所有敌人,获得了胜利!' TYPE 'S'.
      RETURN.
    ELSE.
    ENDIF.
  ENDIF.

**  游戏处理逻辑
*  PERFORM FRM_OBJECTCL USING LV_FX.
  GR_GAME->OPERATION( LV_FX ).
*
**&---刷新ALV
  CALL METHOD GR_GAME->SHOW_ALV
    CHANGING
      CH_ALG = GT_ICON.


  PV_SELFIELD-REFRESH = 'X'. "刷新数据
  GR_GRID->REFRESH_TABLE_DISPLAY( IS_STABLE = VALUE LVC_S_STBL( ROW = 'X' COL = 'X' ) ).

ENDFORM.

FORM FRM_USER_STATUS USING PS_EXTAB TYPE SLIS_T_EXTAB.  "GUI
  SET PF-STATUS 'STAND_FX' EXCLUDING PS_EXTAB.
  SET TITLEBAR 'TITLE' WITH '坦克大战'.
*  PERFORM frm_lock_program.
ENDFORM.

       

  • 31
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值