用面向?qū)ο蟮乃枷胩接懹螒?ldquo;魔獸爭(zhēng)霸”(1)_第1頁(yè)
用面向?qū)ο蟮乃枷胩接懹螒?ldquo;魔獸爭(zhēng)霸”(1)_第2頁(yè)
用面向?qū)ο蟮乃枷胩接懹螒?ldquo;魔獸爭(zhēng)霸”(1)_第3頁(yè)
用面向?qū)ο蟮乃枷胩接懹螒?ldquo;魔獸爭(zhēng)霸”(1)_第4頁(yè)
用面向?qū)ο蟮乃枷胩接懹螒?ldquo;魔獸爭(zhēng)霸”(1)_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、【文章標(biāo)題】用面向?qū)ο蟮乃枷胩接懹螒颉澳ЙF爭(zhēng)霸”(1)【文章作者】曾健生【作者郵箱】【作者QQ】【作者博客】【編程環(huán)境】JDK 1.6.0_01【作者聲明】歡迎轉(zhuǎn)載文章,但轉(zhuǎn)載請(qǐng)保留文章的完整性以及注明文章的出處。*前言:面向?qū)ο笏枷胧菍W(xué)習(xí)java, .net等計(jì)算機(jī)語(yǔ)言的核心思想,在本人學(xué)習(xí)的過(guò)程中,本人直到最近對(duì)面向?qū)ο笏枷胗辛艘粋€(gè)大突破后才發(fā)現(xiàn)原來(lái)在玩 “魔獸爭(zhēng)霸”這個(gè)游戲的過(guò)程中就已經(jīng)包含了深刻的面向?qū)ο蟮乃枷耄F(xiàn)在根據(jù)自己對(duì)面向?qū)ο笏枷氲睦斫饨Y(jié)合“魔獸爭(zhēng)霸”這個(gè)游戲進(jìn)行相關(guān)的闡述(本人知道很多兄弟們對(duì)“魔獸爭(zhēng)霸”等相關(guān)即時(shí)戰(zhàn)略游戲相當(dāng)沉迷,用“魔獸爭(zhēng)霸”舉例說(shuō)明能減少學(xué)習(xí)的枯燥性,看

2、完本文后就能發(fā)現(xiàn)其實(shí)面向?qū)ο蟮乃枷胛覀冊(cè)缫咽煜ち?,只是沒發(fā)現(xiàn)而已),希望能對(duì)各位理解面向?qū)ο蟮乃枷胗兴鶐椭?。閱讀本文前最好對(duì)即時(shí)戰(zhàn)略游戲有所理解,即時(shí)戰(zhàn)略游戲指魔獸爭(zhēng)霸,星際(當(dāng)然也包括帝國(guó)時(shí)代,紅色警戒等游戲),有所理解是指起碼也要知道游戲是怎么玩的。最后,請(qǐng)?jiān)徲捎诒救藢?duì)“魔獸爭(zhēng)霸”不太熟悉而在魔獸的專業(yè)術(shù)語(yǔ)的使用上有所錯(cuò)誤,其實(shí)本人只是“魔獸爭(zhēng)霸”菜鳥(勉強(qiáng)能打贏初級(jí)電腦),而且本人也有半年多沒玩,很多內(nèi)容都忘記,閱讀本文的“魔獸”玩家請(qǐng)?jiān)徫野?本人才疏學(xué)淺,對(duì)于文中出現(xiàn)的各種錯(cuò)誤,敬請(qǐng)各位大俠指出!這里也簡(jiǎn)單闡述一下面向?qū)ο蟮母拍睿ㄔ敿?xì)的定義讀者可參考相關(guān)的書籍或文章):面向?qū)ο蟮乃?/p>

3、想力圖使計(jì)算機(jī)中描述的事物和現(xiàn)實(shí)生活中的盡量相近,其中類是指具有相同屬性,相同行為的一類事物;實(shí)例是指該類事物的具體例子首先開始就文中的一些概念進(jìn)行約定以減少閱讀的困難:(1) 我們玩“魔獸爭(zhēng)霸”游戲是在一個(gè)地圖(是指2D地圖)中進(jìn)行,如果現(xiàn)在有一個(gè)人族的農(nóng)民站在地圖上,那么這個(gè)農(nóng)民在地圖上有個(gè)坐標(biāo)(坐標(biāo)的原點(diǎn)是地圖左下角),譬如是農(nóng)民的坐標(biāo)(200,100),那么在地圖上的標(biāo)識(shí)如下(圖1),這個(gè)坐標(biāo)概念在下文中經(jīng)常用到,各位讀者必須要理解是怎么一回事(2) 全文中都是假設(shè)玩家選的種族是精靈族其實(shí)我們?cè)谕婺ЙF的過(guò)程中對(duì)類的概念已經(jīng)耳熟能詳了(對(duì)于這一點(diǎn),是本人在前幾天對(duì)面向?qū)ο笥辛艘粋€(gè)更深刻的

4、認(rèn)識(shí)后才發(fā)現(xiàn),各位玩家看了后一定會(huì)恍然大悟-)下面就面向?qū)ο笾械膶傩裕袨?,類,?shí)例等概念用游戲的例子說(shuō)明一下(1) 屬性:是說(shuō)明某個(gè)物體的基本特征,通過(guò)一系列的屬性數(shù)據(jù),我們就能得出結(jié)論某個(gè)物體是什么?譬如一個(gè)精靈族的小精靈,它的生命是120,防御是0,看起來(lái)像是發(fā)紅光的物體,知道了小精靈的以上數(shù)據(jù),就對(duì)小精靈有所了解。如圖1 圖1(2) 行為:說(shuō)明某個(gè)物體能干什么?譬如小精靈能采礦(),能建造生命之樹(),能移動(dòng)()等,這都是小精靈的能干的事情。如圖2 、圖2(3) 類:是某一種事物的描述。我們知道在精靈族種小精靈的生命值120,防御力是0,小精靈能采礦(),能建造生命之樹(),能移動(dòng)()

5、,但我們不需要知道具體到底指的是哪個(gè)小精靈,反正小精靈這個(gè)概率就有以上的內(nèi)容。所以小精靈就是一個(gè)類,它可以存在于抽象層次(知道是什么一回事),但不需要實(shí)體。在精靈古樹種有個(gè)生產(chǎn)小精靈的按鈕,我們知道這個(gè)按鈕能生產(chǎn)小精靈,生產(chǎn)的小精靈除了位置和內(nèi)部ID號(hào)外其他都是一樣的。所以這個(gè)生產(chǎn)小精靈的按鈕就是已經(jīng)蘊(yùn)含了面向?qū)ο笾械摹靶【`”類的概念。如圖3圖3(4) 實(shí)例:類只是某一種事物的抽象的概念。就正如“小精靈”類一樣,如果不訓(xùn)練一個(gè)小精靈去采礦,那么小精靈類永遠(yuǎn)不會(huì)采礦。如果我們需要一個(gè)小精靈去采礦,我們就必需點(diǎn)擊一下訓(xùn)練小精靈的按鈕訓(xùn)練一個(gè)小精靈出來(lái)點(diǎn)擊訓(xùn)練小精靈按鈕創(chuàng)造一個(gè)小精靈,用面向?qū)ο蟮?/p>

6、術(shù)語(yǔ)描述就是用小精靈類產(chǎn)生了一個(gè)小精靈的實(shí)例。訓(xùn)練出來(lái)的小精靈就是小精靈類一個(gè)實(shí)例。圖4就是用小精靈類創(chuàng)造的多個(gè)實(shí)例: 圖4經(jīng)過(guò)以上的論述,本人得出了一個(gè)結(jié)論:每個(gè)玩家都已很熟悉面向?qū)ο笏枷?。玩魔獸的過(guò)程就像是一個(gè)面向?qū)ο缶幊痰倪^(guò)程:我們玩游戲就是用暴雪公司提供的各種類和方法,思考用那些類(英雄類,小精靈類,戰(zhàn)士類等),創(chuàng)造多少個(gè)實(shí)例(訓(xùn)練多少各精靈,生產(chǎn)多少個(gè)弓箭手,需要用哪個(gè)英雄),針對(duì)各個(gè)對(duì)象的屬性(生命值,資源值,攻擊力,防御力)考慮調(diào)用哪些方法(小精靈去采礦(),小精靈建造生命之樹(),弓箭手攻擊()來(lái)獲取勝利,在這個(gè)基礎(chǔ)上玩家們創(chuàng)造出不同的戰(zhàn)術(shù)獲取勝利。所以正在學(xué)習(xí)面向?qū)ο蟮母魑煌?/p>

7、家,其實(shí)我們?cè)缫褜?duì)面向?qū)ο蟮哪翘姿枷敕浅J煜?,只是我們不知道這就是面向?qū)ο笏枷攵?。希望閱讀完本文的各位玩家能根據(jù)本文的內(nèi)容及時(shí)把思維轉(zhuǎn)換過(guò)來(lái),更快地邁入面向?qū)ο蟮氖澜纭,F(xiàn)在我們開始在程序的角度用“魔獸爭(zhēng)霸”游戲闡述面向?qū)ο蟮乃枷耄ㄒ韵碌拇a進(jìn)行了最大程度的簡(jiǎn)化,只闡述最核心的部分,各位讀者要明白,真正的游戲編程沒有這么簡(jiǎn)單-,Let Go!那么現(xiàn)在我們從程序員的角度思考一下,如果現(xiàn)在有這么一個(gè)場(chǎng)景:玩家生產(chǎn)了一個(gè)弓箭手去攻擊對(duì)手不死族的食尸鬼。如果你是一個(gè)程序員,應(yīng)該怎么用面向?qū)ο缶幊掏瓿蛇@個(gè)場(chǎng)景動(dòng)作?根據(jù)我們玩“魔獸爭(zhēng)霸”的經(jīng)驗(yàn),第一步是生產(chǎn)一個(gè)弓箭手,這個(gè)不難,但如果玩家是生產(chǎn)2個(gè),3個(gè)

8、,4個(gè),如果每次生產(chǎn)一個(gè)弓箭手都要把弓箭手的所有代碼重寫一遍,那不是把我們寫程序的活活累死!不要著急,我們可以分析一下每個(gè)弓箭手有什么不同。現(xiàn)在我們?cè)倩仡櫼幌骂惖母拍睿侯愂侵妇哂邢嗤瑢傩?,相同行為的一類事物。?duì)于弓箭手,就正如我們玩家所熟悉的,每個(gè)弓箭手相對(duì)于其他弓箭手唯一的不同就是所在的位置(也就是在地圖上的坐標(biāo))還有一個(gè)ID,其它的什么攻擊力,防御力,生命值,移動(dòng)的方法:步行,攻擊的方法:用弓箭射擊 ,受到攻擊的防御行為等都是一樣的。那么對(duì)于所有的弓箭手來(lái)說(shuō),除了所在的位置不同外的所有屬性(攻擊力,防御力,生命值),所有行為(移動(dòng)的方法:步行,攻擊的方法:弓箭射擊,受到攻擊的行為)是不是一

9、樣??!這不是已經(jīng)符合了類的定義嗎?所以把弓箭手抽象為一個(gè)類Bower。類的定義如下:/這是一個(gè)弓箭手類class Bower private int posX; /弓箭手在地圖上X的坐標(biāo)private int posY; /弓箭手在地圖上Y的坐標(biāo)private int ID; /弓箭手在地圖上Y的坐標(biāo)private int lifeNum; /弓箭手的生命值private int attackNum; /弓箭手的攻擊力private int untenNum; /弓箭手的防御力/構(gòu)造函數(shù),生產(chǎn)一個(gè)弓箭手,傳入?yún)?shù)為在地圖中的坐標(biāo)public Bower( int IDNum, int x, i

10、nt y )posX=x;/弓箭手生產(chǎn)出來(lái)后在地圖上X的坐標(biāo)posY=y;/弓箭手生產(chǎn)出來(lái)后在地圖上Y的坐標(biāo)lifeNum= 245;/弓箭手的默認(rèn)生命值attackNum=16;/弓箭手的默認(rèn)攻擊力untenNum=0;/弓箭手的默認(rèn)防御力ID=IDNum;/弓箭手的IDSystem.out.println("弓箭手 "+ID+"生產(chǎn)完畢了");/默認(rèn)構(gòu)造函數(shù)public Bower( )/*一般來(lái)說(shuō),生命值,攻擊力,防御力等都屬于對(duì)象的核心數(shù)據(jù),對(duì)它們的訪問必須要嚴(yán)格控制,所以設(shè)計(jì)出getLifeNum(),getAttackNum(),getUnt

11、enNum()這三個(gè)方法*/獲取弓箭手的剩余生命值public int getLifeNum()return lifeNum;/獲取弓箭手的攻擊力public int getAttackNum()return attackNum;/獲取弓箭手的防御力public int getUntenNum()return untenNum;/獲取弓箭手的ID號(hào)public int getID()return ID;/獲取弓箭手的X坐標(biāo)public int getX()return posX;/獲取弓箭手的Y坐標(biāo)public int getY()return posY;/弓箭手移動(dòng)的行為,就是一般情況下用點(diǎn)

12、擊了/一個(gè)弓箭手后命令弓箭手移動(dòng)到某個(gè)位置所用的方法/傳入?yún)?shù)為要移動(dòng)到的對(duì)象public void moveTo( Ghost gs )posX=gs.getX();posY=gs.getY();System.out.println( "弓箭手"+ID+"移動(dòng)到地點(diǎn) "+posX+","+posY );/用弓箭手攻擊食尸鬼的方法,傳入的參數(shù)為攻擊的對(duì)象/附:本人感覺這個(gè)攻擊行為抽象的設(shè)計(jì)非常差,如果有好的方法,/敬請(qǐng)指教public void attackByBow( Ghost gs )gs.getHunt( this );/受到

13、攻擊時(shí)調(diào)用這個(gè)方法計(jì)算傷害值public void getHunt( Ghost gs )/只有在食尸鬼和弓箭手都沒死亡的前提下會(huì)攻擊if( gs.getLifeNum()>0 && getLifeNum()>0 )/如果受到的攻擊值大于自身的生命值表示對(duì)象死亡if( (gs.getAttackNum()-getUntenNum()>=lifeNum )lifeNum=0;System.out.print("弓箭手"+getID()+"受到食尸鬼"+gs.getID();System.out.print("的攻

14、擊力"+gs.getAttackNum();System.out.println(",弓箭手"+ID+"死亡");else /用生命值減去受到的傷害值lifeNum=lifeNum-(gs.getAttackNum()-getUntenNum();System.out.print("弓箭手"+getID()+"受到食尸鬼"+gs.getID();System.out.print("的攻擊力"+gs.getAttackNum();System.out.println(",剩余生

15、命值為"+getLifeNum(); 對(duì)于食尸鬼,可以用同樣的抽象方法成一個(gè)食尸鬼類/這是一個(gè)食尸鬼類class Ghostprivate int posX; /食尸鬼在地圖上X的坐標(biāo)private int posY; /食尸鬼在地圖上Y的坐標(biāo)private int ID; /食尸鬼在地圖上Y的坐標(biāo)private int lifeNum; /食尸鬼的生命值private int attackNum; /食尸鬼的攻擊力private int untenNum; /食尸鬼的防御力/構(gòu)造函數(shù),生產(chǎn)一個(gè)食尸鬼,傳入?yún)?shù)為在地圖中的坐標(biāo)public Ghost( int IDNum,int x

16、, int y )posX=x;/食尸鬼生產(chǎn)出來(lái)后在地圖上X的坐標(biāo)posY=y;/食尸鬼生產(chǎn)出來(lái)后在地圖上Y的坐標(biāo)lifeNum= 245;/食尸鬼的默認(rèn)生命值attackNum=12;/食尸鬼的默認(rèn)攻擊力untenNum=0;/食尸鬼的默認(rèn)防御力ID=IDNum;/食尸鬼的IDSystem.out.println("食尸鬼 "+ID+"生產(chǎn)完畢了");/默認(rèn)構(gòu)造函數(shù)public Ghost( )/獲取食尸鬼的剩余生命值public int getLifeNum()return lifeNum;/獲取食尸鬼的攻擊力public int getAttack

17、Num()return attackNum;/獲取食尸鬼的防御力public int getUntenNum()return untenNum;/獲取食尸鬼的ID號(hào)public int getID()return ID;/獲取食尸鬼的X坐標(biāo)public int getX()return posX;/獲取食尸鬼的Y坐標(biāo)public int getY()return posY;/食尸鬼移動(dòng)的行為,就是一般情況下用點(diǎn)擊了/一個(gè)食尸鬼后命令食尸鬼移動(dòng)到某個(gè)位置所用的方法/傳入?yún)?shù)為要移動(dòng)到的對(duì)象public void moveTo( Bower bo )posX=bo.getX();posY=bo.g

18、etY();System.out.println( "食尸鬼"+ID+"移動(dòng)到地點(diǎn) "+posX+","+posY );/用食尸鬼攻擊弓箭手的方法,傳入的參數(shù)為攻擊的對(duì)象/附:本人感覺這個(gè)攻擊行為抽象的設(shè)計(jì)非常差,如果有好的方法,/敬請(qǐng)指教public void attackByWater( Bower bo )bo.getHunt( this );/受到攻擊時(shí)調(diào)用這個(gè)方法計(jì)算傷害值public void getHunt( Bower bo )/只有在食尸鬼和弓箭手都沒死亡的前提下會(huì)攻擊if( bo.getLifeNum()>0

19、 && getLifeNum()>0 )/如果受到的攻擊值大于自身的生命值表示對(duì)象死亡if( (bo.getAttackNum()-getUntenNum()>=lifeNum )lifeNum=0;System.out.print("食尸鬼"+getID()+"受到弓箭手"+bo.getID();System.out.print("的攻擊力"+bo.getAttackNum();System.out.println(",食尸鬼"+ID+"死亡");else /用生命

20、值減去受到的傷害值lifeNum=lifeNum-(bo.getAttackNum()-getUntenNum();System.out.print("食尸鬼"+getID()+"受到弓箭手"+bo.getID();System.out.print("的攻擊力"+bo.getAttackNum();System.out.println(",剩余生命值為"+getLifeNum() );那么現(xiàn)在我們根據(jù)上面寫的類,用一段代碼模擬玩家生產(chǎn)了一個(gè)弓箭手去攻擊對(duì)手不死族的食尸鬼這個(gè)過(guò)程class GameStartpubl

21、ic static void main( String args )/下面一段代碼產(chǎn)出了一個(gè)食尸鬼Ghost gs= new Ghost( 1, 90, 90 );/下面這兩行代碼表示玩家創(chuàng)建了兩個(gè)弓箭手,相當(dāng)于玩家按了兩下生產(chǎn)弓箭手的按鈕Bower bo1= new Bower( 1, 180, 180 );Bower bo2= new Bower( 2, 180, 180 );/這里的設(shè)計(jì)就能體現(xiàn)面向?qū)ο蟮暮锰?/1.直觀,把弓箭手移動(dòng)到食尸鬼的位置代碼為bo1.moveTo( gs ),/ 從字面上就能理解這句代碼的含義/2.把程序員從繁瑣的移動(dòng)細(xì)節(jié)中解放出來(lái),我們只需要調(diào)用弓箭手的/

22、方法命令弓箭手移動(dòng),至于弓箭手移動(dòng)時(shí)走路的方式如何,是走直線還是/ 曲線,這些都不需要在這里寫代碼,因?yàn)檫@些內(nèi)容都是封裝在類的內(nèi)部處理 /下面這兩行代碼表示玩家指揮兩個(gè)弓箭手移動(dòng)到要攻擊的食尸鬼的位置,/相當(dāng)于玩家指揮兩個(gè)弓箭手走向食尸鬼bo1.moveTo( gs );bo2.moveTo( gs );/這里也同樣體現(xiàn)了面向?qū)ο缶幊痰暮锰帲覀冎恍枰o弓箭手發(fā)出/攻擊的命令就行,至于攻擊的細(xì)節(jié)(用手還是用腳,攻擊的力度等)都是/封裝在類的內(nèi)部實(shí)現(xiàn),程序員調(diào)用這個(gè)方法時(shí)不需要理會(huì)里面的細(xì)節(jié)/下面的while循環(huán)是兩個(gè)弓箭手開始攻擊食尸鬼攻擊的過(guò)程/為了編寫代碼的方便性,假設(shè)弓箭手和食尸鬼相遇時(shí)

23、才互相攻擊,/沒有遠(yuǎn)程攻擊手段,只站在原地互相攻擊,請(qǐng)各位魔獸玩家原諒我吧-/攻擊過(guò)程抽象如下(有點(diǎn)像回合制的RPG游戲-)/1.弓箭手1攻擊食尸鬼后食尸鬼反擊弓箭手1/2.弓箭手2攻擊食尸鬼后食尸鬼反擊弓箭手2/3.如果食尸鬼或兩個(gè)弓箭手都沒死亡就重復(fù)1,2的過(guò)程while( true )/弓箭手1攻擊食尸鬼bo1.attackByBow( gs );/如果食尸鬼沒死亡就反擊gs.attackByWater( bo1 );/弓箭手2攻擊食尸鬼bo2.attackByBow( gs );/如果食尸鬼沒死亡就反擊gs.attackByWater( bo2 );/攻擊結(jié)束的條件是以下兩個(gè)條件之一(當(dāng)生命值等于0時(shí)表示死亡)/1.食尸鬼死亡/2.兩個(gè)弓箭手死亡if( (gs.getLifeNum()=0) | (bo1.getLifeNum()=0 && bo2.getLifeNum()=0) )break;/根據(jù)食尸鬼的生命值是否等于0判斷任何if( gs.getLifeNum()>0 )System.out.println("兩個(gè)弓箭手死亡,任務(wù)失敗");

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論