日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

游戏设计模式思考:“穿越火线”中的“策略模式”

發(fā)布時間:2024/8/26 asp.net 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 游戏设计模式思考:“穿越火线”中的“策略模式” 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言:在前段時間陸陸續(xù)續(xù)在博客園更新了一系列關(guān)于重構(gòu)的文章。在重構(gòu)我們既有的代碼時,往往會用到設(shè)計模式。在之前重構(gòu)系列的文章中,我們在重構(gòu)時用到了“工廠模式”、“策略模式”、“狀態(tài)模式”等。當(dāng)然在重構(gòu)時,有的地方?jīng)]有點(diǎn)明使用的是那種設(shè)計模式。從今天開始,我們就圍繞著設(shè)計模式這個主題來討論一下我們常用的設(shè)計模式,當(dāng)然“GoF”的23種設(shè)計模式不會全部涉及到,會介紹一些常見的設(shè)計模式。在接下來我們要分享的設(shè)計模式這個系列文章中,還是以Swift語言為主來實(shí)現(xiàn)每種設(shè)計模式的Demo。并且仍然會在GitHub上進(jìn)行Demo的分享,希望與大家相互交流,相互學(xué)習(xí),有不足之處還望批評指正。

今天文章的主要思路是先圍繞著“穿越火線”中的角色與武器的關(guān)系,通過策略模式來設(shè)計實(shí)現(xiàn)這種關(guān)系,整體的來整體感受一下“策略模式”的優(yōu)點(diǎn)。然后再參考《Head First Design Patterns》這本書中的鴨子的示例,來一步步使用Swift來實(shí)現(xiàn)策略模式的案例。當(dāng)然我們只是參考《Head First Design Patterns》中的示例,本篇中的示例與其中的示例還是有所區(qū)別的。大部分設(shè)計模式的案例都是使用Java實(shí)現(xiàn)的,我們依然會使用Swift來實(shí)現(xiàn)。還是那句話,設(shè)計模式是針對面向?qū)ο缶幊陶Z言的,而不是針對某一種編程語言,Swift是面向?qū)ο蟮恼Z言,所以設(shè)計模式用于Swift編程中是沒有問題的。廢話少說,進(jìn)入今天的主題。

一、穿越火線中的“策略模式”(Strategy Pattern)

當(dāng)然,這個示例是我YY出來的示例,不是“穿越火線”這個游戲的設(shè)計方案呢。說到"穿越火線"如果你沒有玩過,那應(yīng)該聽過吧,就是“CrossFire”。我平時不怎么玩游戲,穿越火線之前體驗(yàn)過,不過只有被爆頭的份兒。聽說那些游戲玩家現(xiàn)在不怎么玩兒“CF”啦,改玩兒Dota,LOL啦,真的是這樣嗎?我個人對于游戲而言是外行了,不過玩?zhèn)€超級瑪麗、魂斗羅、植物大戰(zhàn)僵尸、節(jié)奏大師還是可以的(壞笑)。

言歸正傳,今天我們就模擬穿越火線中角色和武器的關(guān)系,使用“策略模式”來實(shí)現(xiàn)。首先我們先分析一下這個場景,穿越火線中角色分為不同的等級,也就是“軍銜”了,簡單的說幾個吧,由高到底對應(yīng)著“軍師旅團(tuán)營連排小工兵”,上面的是組織,軍銜莫過于各種級的士官,少中上尉,少中上校,少中上將(應(yīng)該對吧,本人不太專業(yè)呢,不過用于咱們要實(shí)現(xiàn)的例子是夠了)。我雖然不怎么會打CF,可是我會玩軍棋呢。

我是不是刷知乎刷多了,不能在這兒“一本正經(jīng)的胡說八道”了。言歸正傳,不同的角色所配備的武器裝備也不同,等級越高所使用的武器裝備也就越厲害。我們?nèi)绾问褂妹嫦驅(qū)ο髞肀磉_(dá)這種角色與武器之間的關(guān)系呢?我們先看一下下方的類“類圖”。
?


上面是一個簡化的類“類圖”,上面這種形式可以表達(dá)我們之前的那種場景。“軍人”是一個父類,其他具體等級的軍官都繼承自“SuperClass”。那么問題來了,在上面那種模式下,如果只有“少尉”和“中尉”配備某種武器,其他軍官不配備,我們就要在“少尉”和中尉的類中分別添加要實(shí)現(xiàn)的武器,那么這樣會產(chǎn)生冗余的代碼。還有個問題是上面的設(shè)計形式不利于擴(kuò)展,比如“少尉”也要配備狙擊步槍,豈不是得從“中尉”中的狙擊步槍的方法復(fù)制到“少尉”中。這樣也會產(chǎn)生重復(fù)代碼的。那么我們該怎樣去解決這個問題呢?

有童鞋說了,在Swift中的Protocol(協(xié)議,也就是Java中的接口)可以提供默認(rèn)的實(shí)現(xiàn)。也就是聲明一個protocol,然后通過extension來為協(xié)議添加默認(rèn)實(shí)現(xiàn),只要是類遵循該協(xié)議,那么這個類就擁有了這個默認(rèn)實(shí)現(xiàn)(當(dāng)然,Java中的接口是不能通過后期的延展來為其添加默認(rèn)實(shí)現(xiàn)的)。如果在Swift中使用接口的默認(rèn)實(shí)現(xiàn)的話,如果要對上述軍官擴(kuò)充裝備的話,設(shè)計中的類“類圖”(不是類圖,但與類圖相似)實(shí)現(xiàn)如下所示:
?


上面這種設(shè)計模式雖然不會產(chǎn)生重復(fù)的代碼,但是如果給“軍官”添加的武器過多的話,那么會導(dǎo)致相應(yīng)的類中實(shí)現(xiàn)的接口過多,這并不是我們想要的。下方將會給出一個良好的解決方案,也就是使用策略模式。

二、使用“策略模式”(Strategy Pattern)對上述關(guān)系進(jìn)行設(shè)計

“策略模式”的定義大概是:策略模式,將不同的策略(算法)進(jìn)行封裝,讓他們之間可以相互的替換,此模式讓策略的變化獨(dú)立于使用策略的用戶。在設(shè)計模式中有不同的設(shè)計原則,其中有一條就是“找出程序中可能需要變化的地方,并且把它嗎獨(dú)立出來,手游購買不要和不變的代碼混在一起”。根據(jù)這條設(shè)計原則,然后結(jié)合著上述示例不難分析出來,在上述示例中,使用軍官使用的不同武器是可以變化的,使用不同的武器正是采取不同的策略呢。

所以經(jīng)過上述討論,我們可以使用“策略模式”來重新設(shè)計上面的結(jié)構(gòu)。簡單的說就是把變化的“武器”部分進(jìn)行提取,然后在軍官中進(jìn)行使用,不同的軍官可以采取不同的策略,并且可以隨時替換。下面是我們使用“策略模式”重新設(shè)計后的關(guān)系,具體請看下圖。


在上面的類“類圖”中我們對可變的“武器策略進(jìn)行了提取”。我們使用了WeaponBehavior協(xié)議來規(guī)定武器的策略,使得不同的武器對外有統(tǒng)一的接口,在此就是使用武器,也就是開火。不同的武器使用不同的的“開火策略”,但是對外的接口都是一樣的。設(shè)計原則中有一條是“面向接口編程,而不是面向?qū)崿F(xiàn)編程”。這里所指的接口可以是協(xié)議,可以是抽象類,也可以是超類,其實(shí)就是利用面向?qū)ο蟮摹岸鄳B(tài)”特性。上面的紅框中實(shí)現(xiàn)的就是所有不同的策略。

而綠框中是我們的用戶,也就是軍官的定義,是我們不變的部分。在軍官中也有一個基類,在基類中定義了軍官的共性,其中依賴于“武器策略”的接口。在軍官超類中使用“武器策略”的協(xié)議聲明了一個對象,該對象就是該軍官所采取的武器策略。在軍官的超類中可以通過setWeapon()方法采取不同的策略,其中fire()方法就是使用該“武器策略”進(jìn)行開火。在具體的軍官中的changeXXX()方法就是調(diào)用setWeapon()方法進(jìn)行策略切換的方法。具體內(nèi)容請看下方的具體實(shí)現(xiàn)。

三、上述“策略模式”(Strategy Pattern)的具體實(shí)現(xiàn)

上面給出了“武器策略模式”的個個部分之間的關(guān)系,并給出了相應(yīng)的解釋。如果對此你感覺到抽象的話,那么我們接下來就用相應(yīng)的Swift代碼去實(shí)現(xiàn)上述示例。也就是將上面的理論部分進(jìn)行具體實(shí)現(xiàn),當(dāng)然在此我們用的是Swift語言,但是,你完全可以使用其他的面向?qū)ο缶幊陶Z言。下面就是我們具體的代碼實(shí)現(xiàn)。

下方就是我們對“武器策略”的實(shí)現(xiàn),紅框中對應(yīng)的就是上面圖中的WeaponBehavior(協(xié)議)接口,下方綠框中就是不同武器的策略,每個武器策略都遵循了WeaponBehavior協(xié)議。并且實(shí)現(xiàn)了相應(yīng)的useWeapon()方法。
?


對“武器策略”模塊實(shí)現(xiàn)完畢后,接下來我們就得實(shí)現(xiàn)軍官模塊了。也是根據(jù)上面我們所畫的“模式結(jié)構(gòu)圖”來實(shí)現(xiàn)我們的“軍官模塊”,下方Character就是所有軍官的基類,其中默認(rèn)的武器策略weapon就是手槍(PistolBehavior),其中有設(shè)置策略和改變策略的方法,并且還有使用策略的方法(fire())。下方的紅框就是實(shí)現(xiàn)的不同的軍官了,不同的軍官可以有不同的切換策略的方法。具體如下所示:
?


上面就是我們?nèi)繉?shí)現(xiàn)的代碼,下方是我們的測試用例和輸出結(jié)果。下方我們創(chuàng)建了一個“中尉”軍官----lieutenant,軍官默認(rèn)的是開的手槍。但是可以調(diào)用相應(yīng)的changeXXX()方法來切換武器策略。開手槍時,發(fā)現(xiàn)火力不行,然后就調(diào)用changeHK()方法切換到HK48步槍。這種關(guān)系使用“策略模式”就比較靈活,并且便于擴(kuò)展。比如中尉現(xiàn)在也要配備大狙,因?yàn)楝F(xiàn)在已經(jīng)有大狙這個武器策略了,所以我們現(xiàn)在只需在中尉中添加相應(yīng)的change方法,傳入大狙的武器策略即可,具體的就不在演示了。
?

總結(jié)

以上是生活随笔為你收集整理的游戏设计模式思考:“穿越火线”中的“策略模式”的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。