隨著筆者兒子逐漸長大,我也陸續(xù)將自己大學期間玩過的一些經(jīng)典游戲介紹給他。很大一個原因就是我玩了兒子班上他和很多男同學都熱衷的《火影忍者》手游后,覺得不過爾爾,是時候讓他們開開眼界,接觸一些真正的神作了! 其中之一就是《星際爭霸》。 筆者2000年9月進入電子科大計算機系讀大一,被發(fā)配到了九里堤校區(qū)。寢室住宿條件比較艱苦,小小的一間房,除了三張上下鋪雙人床之外,每人只有一張類似高中教室里常見的課桌,連看書也作業(yè)都很勉強,更不用指望能放下電腦主機和那個年代又大又笨重的 CRT 顯示器了。 熬了一年之后,2001年9月,我們回到了位于建設(shè)路的沙河校區(qū),隨即寢室6臺電腦到位,玩的最多的就是《星際爭霸》3V3. 當時的寢室沒有空調(diào),6個人光著膀子,不去上晚自習,在寢室里聯(lián)機對戰(zhàn),被系輔導員當場逮住的場景,成為了我這一生最美好的回憶片段。 如今《星際爭霸》重制版帶著華麗的畫面(筆者心目中的)王者歸來,昔日一起聯(lián)機的室友早已散落在天涯,各自忙著自己的事情。湊齊寢室六個人 3V3,大概只能在夢中實現(xiàn)了。 好在還能和兒子繼續(xù)暢聊和品味這款神作,也算一大快事。筆者最近的業(yè)余時間,一邊給兒子介紹《星際爭霸》龐大宏偉的世界觀,一遍耐心地逐一瀏覽每個種族的兵種。作為學習筆記,于是就有了這篇文章。 作為一個《星際爭霸》和 SAP ABAP 的雙料粉絲,筆者本文嘗試對《星際爭霸》三大種族的初級兵種,和 ABAP 里一些基礎(chǔ)語言特性做一個關(guān)聯(lián)比較。 筆者的個人理解如下表: 人族 Marine 與 內(nèi)表 & Field-Symbol:靈活多面與高端微操作能力并存 人族的 Marine,國內(nèi)玩家俗稱「機槍兵」,50 水晶,1人口,初始攻擊 6,支持對空和對地兩種遠程攻擊方式,幾乎是 Terran 開局必造單位。 全地形適用:可同時攻擊空中與地面單位,應(yīng)對蟲族飛龍、神族 Zealot 等均有效。 傷害類型普適:普通攻擊對任何防御類型均造成100%傷害,無克制短板。 造價低廉,生產(chǎn)速度快,易形成人海戰(zhàn)術(shù),配合興奮劑后輸出效率翻倍。
內(nèi)表 + Field-Symbol 的 ABAP 地位 STANDARD TABLE 聲明成本極低,是幾乎所有 ABAP 報表與接口程序的數(shù)據(jù)緩沖核心。 通過 LOOP AT ... ASSIGNING <fs> 指針定位,既可就地修改,又省去工作區(qū)數(shù)據(jù)拷貝。 進一步選擇 SORTED 或 HASHED 表,相當于給 Marine 添置護甲升級,顯著優(yōu)化隨機讀取。
Marine 與內(nèi)表同樣承擔「通用輸出」職責;StimPack 對應(yīng)于開發(fā)階段的二級索引、并行 cursor、批量 SQL——短暫投入后立刻收回高額性能; 二者都需要開發(fā)者微操:Marine 不預(yù)展位容易被濺射團滅,內(nèi)表若濫用全表掃描也會拖垮性能。 示例代碼: REPORT z_marine_demo.
TYPES: BEGIN OF ty_marine, id TYPE i, hp TYPE i, dps TYPE i, END OF ty_marine.
DATA: lt_marine TYPE SORTED TABLE OF ty_marine WITH UNIQUE KEY id.
* 裝填 50 只 Marine DO 50 TIMES. lt_marine = VALUE #( BASE lt_marine ( id = sy-index hp = 45 dps = 6 ) ). ENDDO.
DATA: lv_stim TYPE abap_bool VALUE abap_true.
FIELD-SYMBOLS: <ls_marine> TYPE ty_marine.
LOOP AT lt_marine ASSIGNING <ls_marine>. IF lv_stim = abap_true. <ls_marine>-dps = <ls_marine>-dps * 150 / 100. "StimPack 效果 ENDIF. ENDLOOP.
cl_demo_output=>display( lt_marine ).
Zergling ? Macro:輕量爆量與難以調(diào)試 Zergling 的蜂群哲學:Zergling 被國內(nèi)玩家親切地稱為「狗」,「小狗」,蟲族必造單位。 單只成本僅 25 水晶,無氣體消耗,可快速爆兵形成「狗海」。 配合蟲族卵機制,單基地可瞬間孵化多只,爆發(fā)力遠超人族機槍兵、神族狂熱者。 基礎(chǔ)移速中等,但升級代謝加速(100 水晶 / 100 氣)后成為游戲最快地面單位之一(移速6)。 高速拆家、繞后偷襲礦區(qū)、牽制多線能力極強,迫使對手分兵防守。 升級腎上腺(200 水晶 / 200 氣)后攻擊頻率提升 50%,集群 DPS 碾壓同級單位。 配合蝎子黑蜂、女皇誘捕等技能,可無視遠程火力強行近身。
ABAP 宏的特性 Zergling 靠成群在極短時間撕開對手防線,宏則在編譯期瞬間復(fù)制成百上千行邏輯;兩者都可能因為過度使用帶來可維護性災(zāi)難:Zergling 若分散,戰(zhàn)斗力銳減;ABAP 宏若散落全局,排除故障的難度會陡增。 示例代碼: REPORT z_zergling_demo.、
DEFINE zerg_rush. WRITE: / &1. END-OF-DEFINITION.
DO 10 TIMES. zerg_rush 'Spawned a Zergling!'. ENDDO.
Zealot ? 接口驅(qū)動 OO / BAdI:厚實耐打與后期延展 高單兵傷害:基礎(chǔ)攻擊力 16(雙刀攻擊,單次攻擊造成兩次傷害),在游戲初期可快速清理敵方農(nóng)民或低級單位(如蟲族小狗、人族機槍兵)。 快速成型:造價僅 100 水晶,無氣體消耗,可快速暴兵,適合早期 Rush 或防守。 護盾機制:60 點護盾可自動恢復(fù),配合 100 點生命值,總耐久度高于同階單位(如機槍兵僅 40 生命)。 升級等離子護盾(Plasma Shields)后護盾值進一步提升。 減傷特性:作為小型單位,對爆炸類攻擊(如坦克炮彈、金甲蟲炮彈)僅承受 50% 傷害,對抗 AOE 時生存率更高。
Interface OO / BAdI 的穩(wěn)健可擴 ABAP 接口定義公共契約,子類可重定義方法以實現(xiàn)多態(tài)。 BAdI 允許在不修改標準代碼的前提下插入自有實現(xiàn),安全地接管流程。 初期編碼量顯著高于過程式寫法,卻換來易測試、易交付、易升級的長期紅利。
Zealot 造價高于 Marine/Zergling,但可借護盾與腿部強化的技能升級,在中后期持續(xù)發(fā)揮;同理,接口 OO 在項目初期需投入設(shè)計時間,卻能在需求變動時展示彈性。 腿部強化技能,類比于后期新增的實現(xiàn)類或額外 BAdI,多態(tài)調(diào)用一鍵切換邏輯,無須重寫舊代碼。 示例代碼: INTERFACE lif_zealot. METHODS engage IMPORTING iv_target TYPE string RETURNING VALUE(rv_result) TYPE string. ENDINTERFACE.
CLASS lcl_zealot DEFINITION. PUBLIC SECTION. INTERFACES lif_zealot. ENDCLASS.
CLASS lcl_zealot IMPLEMENTATION. METHOD lif_zealot~engage. rv_result = |Zealot charges at { iv_target }!|. ENDMETHOD. ENDCLASS.
START-OF-SELECTION. DATA(lo_z) = NEW lcl_zealot( ). DATA(lv_log) = lo_z->lif_zealot~engage( iv_target = 'Hydralisk' ). cl_demo_output=>display( lv_log ).
聯(lián)合作戰(zhàn):三兵三技一體化示例 在真實項目中,我們常將三者混用:內(nèi)表做數(shù)據(jù)矩陣,宏生成批量校驗,OO/BAdI 分流不同公司代碼邏輯。下列片段模擬了 Terran + Zerg + Protoss 聯(lián)軍的聯(lián)合攻堅: REPORT z_triple_force.
* 內(nèi)表裝兵 TYPES ty_unit TYPE string. DATA lt_army TYPE STANDARD TABLE OF ty_unit.
DEFINE spawn_marine. lt_army = VALUE #( BASE lt_army ( |Marine{ &1 }| ) ). END-OF-DEFINITION.
DO 5 TIMES. spawn_marine sy-index. ENDDO.
INTERFACE lif_charge. METHODS charge IMPORTING iv_target TYPE string. ENDINTERFACE.
CLASS lcl_zealot_adapter DEFINITION. PUBLIC SECTION. INTERFACES lif_charge. ENDCLASS.
CLASS lcl_zealot_adapter IMPLEMENTATION. METHOD lif_charge~charge. WRITE: / |Zealot charges { iv_target }|. ENDMETHOD. ENDCLASS.
* 戰(zhàn)斗流程 DATA(lo_front) = NEW lcl_zealot_adapter( ).
LOOP AT lt_army ASSIGNING FIELD-SYMBOL(<ls_unit>). CALL METHOD lo_front->charge EXPORTING iv_target = <ls_unit>. ENDLOOP.
執(zhí)行后你會看到 Zealot 逐一沖鋒清理由宏批量孵化的 Marines,打印順序取決于內(nèi)表循環(huán)——正是三種技術(shù)在一段腳本中的協(xié)同作戰(zhàn)。 Marine 教會我們:靈活的核心數(shù)據(jù)結(jié)構(gòu)需要勤于微調(diào)(微操作)。 Zergling 提醒我們:任何追求極速交付的宏觀手段都必須警惕維護債務(wù)。 Zealot 則證明:前期多寫一份接口,后期少跑十次返工。
掌握這三種 ABAP 利器,正如熟稔三族基礎(chǔ)兵種,能在 ABAP 開發(fā)的項目節(jié)奏、性能微操與架構(gòu)耐打度之間游刃有余。
|