想起小时候买的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.