骑士进化论RPG游戏实现
騎士進化論RPG游戲實現
聲明:本博文系本人原創作品,未經本人許可,不得擅自轉載,甚至修改內容,僅限于學習交流。本人保留該博文的 ? ? ? ? ? ?所有權利。 ? ? ? ? ? ?博文地址:http://blog.csdn.net/u012027907前言
? ? ? ? 這是第一次使用java語言和Myeclipse集成開發環境進行多人協作開發一款小游戲,其實,我之前就想讓多個人開發一個小程序或軟件。畢竟,以后到公司去,開發任何的軟件都不是一個人能完成的,如何從現在開始就鍛煉大家的團結協作的能力顯得非常重要,如果能將多個人的力量有效地整合,就能實現1+1大于2的效果,否則,就無法進行軟件的開發。即使一個人的能力很強,如果不能學會與人協作,在這樣的社會恐怕不能夠生存下去。
? ? ? ? 本次開發的游戲是RPG(角色扮演)游戲,這樣的游戲我們經常見到。本來老師要求是文字版的RPG,我想盡量接近通常玩的那種游戲,盡量少使用文字,當然,如果以目前的知識無法實現的,可以用文字來描述。我們應該以高標準來要求自己,這樣才能真正的鍛煉自己。
1.? 任務分工:(暫定)
張XX(組長):負責整體的架構設計及主游戲模塊。
房X(組員):跑步模塊及游戲介紹模塊。
南XX(組員):智力闖關模塊及幫助模塊。
白X(組員):飛鏢模塊及地圖模塊。
2.? 對所有成員要求:
1).小組成員必須按時完成各自的任務。
2).設計上與技術上有問題的先自行解決(看書、上網查),如不能解決的集體討論解決。有其它的問題及時提出來!
3).必須寫文檔(寫把各自模塊的整體設計用UML圖或Viso畫的圖(盡量不要只是簡單的語言敘述)表達出來),學會用面向對象的思想來來設計,采用模塊化的思想分解模塊。(設計原則與設計模式能用的用)
4)每個類必須有類說明,每個函數也必須有函數說明,函數的具體設計也必須有必要的注釋。
5)如果不能遵守規定或要求的可以提前退出,不強留。
(注:即使不會寫代碼,也沒關系,只要一能用UML圖或其他的圖等表達出自己的設計思想及具體的實現設計也行)
3.?說明:
? ?運行環境:Myeclipse集成開發環境,jdk 1.6版本。
?? 使用語言:Java語言。
? ?版本控制:SVN進行版本控制。
?? 代碼管理:Google Code 進行上傳下載以實現多人同時開發。
一、需求分析:
1.1游戲背景:
時代:劍與魔法的中古騎士時代。
國家:神圣的卡拉斯王國。
社會結構:卡拉斯王國是由多數農民和少數騎士所組成的王國,因此沒有和魔王對抗的能力,
背景介紹:
? ? 卡拉斯王國的統治者是現任的國王卡拉斯七世,但由于由于受到魔王的危害,使得王國受到了威脅,整個王國實際上被魔王控制,小公主已經在上一次魔王手下的來襲時被抓走了。
一天,在一個殘破的村莊,一名有名騎士的妻子生了四個孩子,三個男孩,一個女孩,據村里人說:這四個孩子可能是神之子,他們從小就各個力大無比、與眾不同。他們分別是:
人物角色:惡靈騎士、幻影騎士、火龍騎士、玉女騎士。
?當他們長到十幾歲時,父母告訴他們整個王國都被魔王所控制,國王和公主都被軟禁。于是,他們立志要打敗魔王,拯救自己的國家。
但他們現在年紀還小,且實力還無法與魔王抗衡。
必須先進行訓練(跑步、智力闖關、飛鏢練習),獲得一定的體力值、智力值及武藝值后,才能出去征戰,奪回被魔王占領的土地。要想打敗魔王,必須先取得傳說中的勇者之劍及勇者之鎧。勇者之鎧被放置在大陸西邊的神殿里,那里已經被魔王的部下所占領了;勇者之劍則要取得大陸南邊火山里的金屬,再交給老鐵匠來打造,老鐵匠被魔王綁在大陸東邊的暗室里。騎士先來到大陸西邊的神殿,打敗了占領此地的魔王手下,取得了勇者之鎧。接下來南邊的火山,在通過了迷宮洞窟的考驗后,找到了可以打造勇者之劍的神秘金屬。帶著神秘的金屬去解救被綁的老鐵匠,將神秘金屬交給他,就可以打造出勇者之劍。有了勇者之劍和勇者之鎧之后,前往魔王的宮殿與魔王展開決戰,在打敗了魔王救回公主后,使王國恢復了和平,而騎士也和公主結婚成為下一任的國王。
1.2游戲設置:
可選人物角色:惡靈騎士、幻影騎士、火龍騎士、玉女騎士。
人物成長等級:0-13。
普通裝備:鎧甲、盾牌、頭盔、戰靴、利劍、魔刀等。
???????????? (這些裝備可以在店鋪使用金幣購買)
??特殊裝備:勇者之劍、勇者之鎧。
??生存值:體力值(血量)、智力值(防御力)、武藝值(攻擊力)。
?????????? (體力值越高,血量越多;
??????????? 智力值越高,防御力越高。
??????????? 武藝值越高,攻擊力越高)
??訓練內容:跑步(獲得血量值)
??????????? 智力闖關(獲得防御值)
??????????? 飛鏢練習(獲得攻擊值)
??地圖:大陸西邊(放著勇者之鎧)
????????? 大陸南邊(鑄造勇者之劍的金屬)
????????? 大陸東邊(鑄劍師)
????????? 大陸北邊(魔王的的宮殿)
?????????地圖如下:(找個游戲地圖)
1.3功能需求:
A.任務整體分為兩大塊:
1) 訓練階段(跑步、智力闖關、飛鏢練習)。
2) 征戰階段(到西邊獲取勇者之鎧、到南邊獲取鑄造勇者之劍的金屬、到東邊解救鑄劍師、到北邊大戰魔王)。
B.設計需求:(單機版窗體顯示)
1)顯示各模塊的窗體設計。
2)讀文件或讀數據庫中數據的模塊設計。
3)加載音樂的模塊。
4)不同人物及資源類的設計。
C.用例圖:
D.功能模塊圖:
二、總體設計
1.架構設計
A.? 包UI(視圖、界面層):只負責界面的顯示。
B.? 包Business(業務邏輯層):核心業務的處理。
C.? 包DataAccess(數據訪問層):讀寫數據。
2.業務處理流程圖:
3.UML圖
MVC架構圖:
A.? 主模塊設計:
三、詳細設計
1.UI包:
(1).CommonFrm類:
? ? ?公共窗體,其他窗體都繼承自它,保持窗體的一致性,其設置了窗體的大小和顯示位置。
(2).JMainMenuFrm類:
? ? 顯示游戲主菜單,包括:新建游戲、加載游戲、游戲設置、游戲幫助及退出按鈕。
(3)JPlayGameFrm類:
? ? 主游戲顯示窗口,主要顯示游戲。
(4)JLaborTrainFrm類:
? ? 體力訓練模塊(跑步)界面。
(5)JIntelligenceTrainFrm類:
??? 智力訓練界面(走迷宮)界面。
(6)MartialArtsTrainFrm類:
??? 武藝訓練(射擊)界面。
(7)JSettingFrm類:
?? 游戲設置界面。
(8)JSkillTraining類:
?? 選擇開始主游戲還是個訓練的界面。
(9)JGameDescription類:
?? 游戲簡介。
?2.Business包
A.輸入管理包(Business.input)
(1).InputManager類:負責主游戲的鍵盤輸入處理。
| 構造方法摘要 | |
| InputManager()? | ? |
| InputManager(JMainGamePanel?contentPanel,?Knight?knight)? | ? |
| InputManager(Knight?knight)? | ? |
?
| 方法摘要 | |
| ?Knight | GetKnight()? |
| ?boolean | IsFightPressed()? |
| ?boolean | IsMovePressed()? |
| ?void | keyPressed(java.awt.event.KeyEvent?e)? |
| ?void | keyReleased(java.awt.event.KeyEvent?e)? |
| ?void | keyTyped(java.awt.event.KeyEvent?e)? |
?
(1)??? RunKeyDown類:跑步模塊的輸入類
?? ?
| 方法摘要 | |
| ?boolean | IsMovePressed()? |
| ?void | keyPressed(java.awt.event.KeyEvent?arg0)? |
| ?void | keyReleased(java.awt.event.KeyEvent?arg0)? |
| ?void | keyTyped(java.awt.event.KeyEvent?arg0)? |
| ? | ? |
(2)??? 智力模塊的輸入類:
Carelistenner類
?B.面板管理包(Business.PanelManager)
(1).JMainGamePanel類:負責主游戲的面板業務邏輯,通過重寫paintComponet(Graphics g)方法,來加載顯示的界面。
?
| 構造方法摘要 | |
| JMainGamePanel(JPlayGameFrm?playFrm, boolean?isLoad)? | ? |
?
| 方法摘要 | |
| ?void | display()? |
| ?void | drawBackGround(java.awt.Graphics?g)? |
| ?void | drawGameOver(java.awt.Graphics?g)? |
| ?void | drawVictory(java.awt.Graphics?g)? |
| ?Knight | getKnight()? |
| ?boolean | IsLive()? |
| ?boolean | IsLivedemon()? |
| ?boolean | isLoadData()? |
| ?void | NextGate()? |
| ?void | nextPerson()? |
| ?void | paintComponent(java.awt.Graphics?g)? |
| ?void | readAtk()? |
| ?void | readDfe()? |
| ?void | reSet()? |
| ?void | reStart()? |
| ?void | saveGame()? |
?
C.人物類管理包(Business.Person)
(1).Person類:
| 構造方法摘要 | |
| Person()? | ? |
?
| 方法摘要 | |
| ?void | drawLevel(java.awt.Graphics?g)? |
| ?void | DrawPerson()? |
| ?void | DrawWeapon()? |
| ?int | GetVit()? |
| ?void | MoveDown(int?y)? |
| ?void | MoveLeft(int?x)? |
| ?void | MoveRight(int?x)? |
| ?void | MoveUp(int?y)? |
| ?void | SetVit(int?newVit)? |
| ? | ? |
?
(2).Knight類:
| 構造方法摘要 | |
| Knight()? | ? |
| Knight(JMainGamePanel?panel)? | ? |
?
| 方法摘要 | |
| ?void | actionChanged()? |
| ?void | addScore(int?x)? |
| ?void | changeWeapon(int?weaponType)? |
| ?void | drawAttack(java.awt.Graphics?g)? |
| ?void | drawBlood(java.awt.Graphics?g)? |
| ?void | drawDefense(java.awt.Graphics?g)? |
| ?void | drawDied(java.awt.Graphics?g)? |
| ?void | drawFight(java.awt.Graphics?g)? |
| ?void | drawGetHurt(java.awt.Graphics?g)? |
| ?void | drawLevel(java.awt.Graphics?g)? |
| ?void | drawPerson(java.awt.Graphics?g)? |
| ?void | drawPhoto(java.awt.Graphics?g)? |
| ?void | drawPlace(java.awt.Graphics?g)? |
| ?void | drawScore(java.awt.Graphics?g)? |
| ?void | drawWeapon(java.awt.Graphics?g)? |
| ?void | fight()? |
| ?java.awt.geom.AffineTransform | flip(javax.swing.ImageIcon?icon, int?x, int?y)? |
| ?int | getAtk()? |
| ?int | getDfe()? |
| ?int | getDiedNum()? |
| ?int | getDirection()? |
| ?void | getHurt()? |
| ?boolean | GetisFight()? |
| ?boolean | GetisGethurt()? |
| ?boolean | getIsVictory()? |
| ?int | getLevel()? |
| ?int | getPersonNum()? 獲得人物數 |
| ?int | getScore()? |
| ?int | getWeaponType()? |
| ?int | getX()? |
| ?int | getY()? |
| ?void | improveLevel()? |
| ?void | improvevit(int?vit)? |
| ?boolean | IsOver()? |
| ?boolean | IsPersonsub()? |
| ?void | MoveDown(int?y)? |
| ?void | MoveLeft(int?x)? |
| ?void | MoveRight(int?x)? |
| ?void | MoveUp(int?y)? |
| ?void | setAtk(int?atk)? |
| ?void | setDemon(Demon[]?demo, int?num)? |
| ?void | setDfe(int?dfe)? |
| ?void | setIsPersonSub()? |
| ?void | setLevel(int?level)? |
| ?void | setPerson(int?x)? |
| ?void | setPosX(int?x)? |
| ?void | setPosY(int?y)? |
| ?void | setScore(int?score)? |
| ?void | setVictory(boolean?isvic)? |
| ?void | StateRun()? |
| ?void | StaticState(java.awt.Graphics?g)? |
| ?void | subVit()? |
?
(3).Demon類:
| 構造方法摘要 | |
| Demon()? | ? |
| Demon(JMainGamePanel?panel, int?P_posx, int?P_posy, int?starttime)? | ? |
?
| 方法摘要 | |
| ?void | drawPerson(java.awt.Graphics?g)? |
| ?java.awt.geom.AffineTransform | flip(javax.swing.ImageIcon?icon, int?x, int?y)? |
| ?void | getKnightPosXY(int?x, int?y)? |
| ?int | getPosX()? |
| ?int | getPosY()? |
| ?int | getSpritetype()? |
| ?boolean | IsOver()? |
| ?void | recover()? |
| ?void | Run()? |
| ?void | setFullBlood()? |
| ?void | setKnight(Knight?knight)? |
| ?void | setPosX(int?x)? |
| ?void | setPosY(int?y)? |
| ?void | setspritetype()? |
| ?void | setspritetype(int?x)? |
| ?void | spritegetHurt()? |
| ?void | subVit()? |
?
D.資源管理包(Business.ReourceManager)
(1).ResourceManager類:
| 構造方法摘要 | |
| ResourceManager()? | ? |
?
| 方法摘要 | |
| ?javax.swing.ImageIcon | GetImage(java.lang.String?imageName)? |
| ?java.awt.Image | GetImage1(java.lang.String?imageName)? |
?
(2).SoundManager類:
| 構造方法摘要 | |
| SoundManager()? | ? |
?
| 方法摘要 | |
| ?void | bgMusic()? |
| ?void | CloseGmMusic(java.lang.String?str)? |
| static?boolean | isGameMusic()? |
| ?boolean | isOpenBgMusic()? |
| ?void | PlayGmMusic(int?soundType)? |
| ?void | PlayGmMusic(java.lang.String?str)? |
?
(3).FileManager類:
| 構造方法摘要 | |
| FileManager()? | ? |
?
| 方法摘要 | |
| ?void | clearData(java.lang.String?name)? |
| ?void | readData(int[]?data, int?n)? |
| ?int | readData(java.lang.String?name)? |
| ?java.lang.String | readfile(java.lang.String?name)? |
| ?void | writeData(int[]?data, int?n)? |
| ?void | writeData(java.lang.String?name, int?data)? |
?E.換武器包(Business.WeaponBehaviour)
(1).ChangeWeapon接口
| 方法摘要 | |
| ?int | getWeaponType()? |
| ?void | setFightEffect(int?fightEffect)? |
| ?void | setWeapon()? |
| ?void | setWeaponEffect(int?i)? |
| ?void | setXY(int?x, int?y, int?direction)? |
| ?void | useWeapon(java.awt.Graphics?g)? |
?
(2).AxeWeapon類:
實現以上接口。
(3).KnifeWeapon類:
實現以上接口。
(4).HammerWeapon類:
實現以上接口。
(5).Weapon類:
| 方法摘要 | |
| ?int | getWeaponType()? |
| ?void | setFightEffect(int?fightEffect)? |
| ?void | setWeapon()? |
| ?void | setWeaponEffect(int?i)? |
| ?void | setWeaponType(int?type)? |
| ?void | setXY(int?x, int?y, int?direction)? |
?F.跑步訓練包( ?Business.LaborTrain)
(3)??? RunPanel類:
| 構造方法摘要 | |
| RunPanel(JLaborTrainFrm?labor)? | ? |
?
| 方法摘要 | |
| ?void | closePanel()? |
| ?void | CompareScore(int?score)? |
| ?void | display()? |
| ?void | drawBackGround(java.awt.Graphics?g)? |
| ?void | drawBlood(java.awt.Graphics?g)? |
| ?void | drawCoins(java.awt.Graphics?g)? |
| ?void | drawDistance(java.awt.Graphics?g)? |
| ?void | drawJinbi(java.awt.Graphics?g)? |
| ?void | drawPaiHangBang(java.awt.Graphics?g)? |
| ?void | drawPerson(java.awt.Graphics?g)? |
| ?void | drawShitou(java.awt.Graphics?g)? |
| ?void | drawSun(java.awt.Graphics?g)? |
| ?void | drawZhangai(java.awt.Graphics?g)? |
| ?void | init()? |
| ?void | MoveDown()? |
| ?void | MoveJump()? |
| ?void | paintComponent(java.awt.Graphics?g)? |
| ?void | PlayGame(java.awt.Graphics?g)? |
| ?void | setBackGround(java.lang.String?background)? |
| ?void | setPerson(java.lang.String?person)? |
| ?void | storeScore(int?score)? |
智力訓練包
| 方法摘要 | |
| ?void | display()? |
| ?void | drawmigongPhoto(java.awt.Graphics?g)? |
| ?void | drawpeoplePhoto(java.awt.Graphics?g)? |
| ?void | drawzhangaiwu(java.awt.Graphics?g)? |
| ?void | movedown()? |
| ?void | moveleft()? |
| ?void | moveright()? |
| ?void | moveup()? |
| ?void | paintComponent(java.awt.Graphics?g)? |
| ?void | storeScore(int?score)? |
?
(1)主要的類和接口:
????武藝訓練窗體類:ClassJMartialArtsTrainFrm{};
?武藝訓練面板類:Class JMartialArtsTrainPanel{};
?接口:interfaceDraw{};
(2)主要的方法有:
?2.1構造方法public JMartialArtsTrainPanel(){};
???2.2飛鏢的計時器
????? timer1.schedule(new TimerTask() {
??? 2.3 盤的計時器
?????? timer2.schedule(new TimerTask() {
? ?2.3 繪制騎士最后輸贏狀態
??? public void drawGame(Graphics g)
??? 2.4 判斷飛鏢是否可以移動
??? public boolean JianMove() ? ?
?? ?2.5 設置計分制,飛鏢射擊靶數等
??? public void drawValue(Graphics g)
?? 2.6 顯示當前分數
??? publicvoid drawScore(Graphics g)
?2.7從JPanel派生子類,復寫父類中paintComponent(Graphicsg)方法。
??? @Override
??? protected void paintComponent(Graphics g)
?3.數據訪問包
(1).加載文件類(LoadImage)
主要方法:
| 方法摘要 | |
| ?java.awt.Image | loadImage(java.lang.String?name)? |
| ?javax.swing.ImageIcon | LoadImageIcon(java.lang.String?name)? |
?(2). 加載音樂類(LoadMusic)
| 方法摘要 | |
| static?void | closeMusic()? |
| static?boolean | isBgMusic()? |
| static?boolean | isGameMusic()? |
| static?void | playMusic(java.lang.String?str)? |
| static?void | setBgMusic(boolean?bgMusic)? |
| static?void | setGameMusic(boolean?gameMusic)? |
(3).讀文本文件類(ReadData)
?
| 方法摘要 | |
| ?java.lang.String | read(java.lang.String?name)? |
| ?void | readData(int[]?a, int?n)? |
| ?int | readData(java.lang.String?name)? |
(4).寫文件類
| 方法摘要 | |
| ?void | clearData(java.lang.String?name)? |
| ?void | write(int?value)? |
| ?void | writeData(int[]?data, int?n)? |
| ?void | writeData(java.lang.String?name, int?data)? 寫整型數據 |
?四、測試與實現
1.歡迎界面
2.游戲主菜單
3.游戲選擇界面
4.主游戲界面
5.跑步訓練界面
6.射箭訓練界面
7.智力訓練界面
8.游戲設置界面
9.幫助界面
五、總結
張XX的總結:
? ? ? ? 通過對RPG游戲的開發,使我學到了很多東西,但我認為最重要的是如何多人協作共同開發一款軟件,這是最重要的東西,因為現在的軟件的都是多人同時并行開發,沒有單打獨斗的軟件了,學會與人協作就顯得十分重要了。如何有效的協調每個人的任務,如何使得四個人相加的結果大于4.這是一門很深的學問,還需要繼續學習。但我覺得我們這一組,不管是任務分工,還是溝通交流都還不錯,大家也都很盡力。從最后完成的作品來看,效果還不錯。
? ? ? ? 我們在軟件的架構初期,就用了MVC這樣的好的框架,這為后面的不同類之間的訪問和協調都提供了好的框架基礎。這一點我覺得做的比較好。也有效的分裝了變化,為軟件的擴充打下了堅實的基礎。在軟件的設計過程中也是遇到了各種問題,從最初的什么都不會,到遇到各種困難然后逐一解決,再到最后完成了整個軟件,在這其中有最初的BUG到處有的痛苦、也有解決了某個問題時的激動等酸甜苦辣。正是由于我們不懼困難,堅持不懈,有著不解決它就誓不罷休的精神,才使得我們堅持到最后,并很好地完成它。當然,學到的東西只有自己清楚,不光是java的技術,更是軟件設計及溝通協作的思想和技巧。
房X的總結:
? ? ? ? 通過這次小組一起開發RPG游戲,總體感覺學了不少知識,一些通過組長的講解整體架構和參看組長的代碼,另外通過自己查找資料,感覺組長的整體架構非常好,同時也感覺到java語言編程比較容易上手,更加增加我對java語言的學習興趣。?在編寫代碼過程中遇到過不少的問題,通過不段的思考,反復修改和尋求組長等組員幫助,最終解決了問題。感覺在小組中,相互之間學到很多,而且編起代碼來更有激情,看到了別人的編程思想,學習他人,改進自己,學習非常高效。
南XX總結:
? ? ? 這次RPG游戲的制作,非常的感謝組長的努力,為我們的整體構架打下了非常好的基礎,運用了mvc架構方式,第一次了解到,感覺整體架構非常清晰,修改和添加都非常容易,是一個非常好的架構模式,并且在主框架下,用到了組長所寫的的一些函數,使我的智力模塊的編寫如雨得水,通過此次的RPG游戲編寫,熟悉了封裝類的實現,不僅使代碼非常清晰,而且容易讀懂,這次的編寫讓我對java產生了深深的興趣,更會激勵我在未來的路上好好學習 ? ?
白X總結:
? ? 飛鏢模塊的整體設計過程還算是比較順利的,沒有什么過多的算法,就只要實現分數的計算就行。在一開始還沒有學習Java Swing圖形用戶界面的時候,覺得游戲無從下手,在組長已經設計好整個框架的時候還是不知道怎么做,我的模塊也就做的有點晚了,開始只實現了飛鏢的移動,盤沒有設置成移動的,游戲玩起來玩家只可以控制飛鏢的發射,操作是否進行下一輪的游戲,而且分數都是隨機生成的,這樣一來,感覺整個游戲失去了趣味性。后來在組長的審查和小組討論后,對游戲做了進一步改進,首先讓盤也動起來,然后讓玩者控制什么時候發射飛鏢,并且可以對飛鏢的速度進行操控,這樣便使得游戲玩著更有趣了。整個飛鏢模塊的游戲界面友好,符合主題,基本功能也實現了。期間遇到了各種各樣的問題,但是在請教我們的組長和其他成員之后,問題得到了解決,通過這些錯誤的修改,個人的分析能力也得到了加強。對于我們小組的整個RPG游戲設計,由我們組長精心策劃,為我們設計出了MVC這樣好的框架,并為大家分配好了每個人的任務,我們都在組長的指導下順利的完成了我們的任務。以后希望還會有這樣的合作學習,向大家學習更多的東西,不斷擴展自己的知識面。
軟件的優點:有漂亮的圖形界面,有很好的架構設計,用戶體驗較好,功能多樣以滿足不同玩家的需求,有游戲幫助及游戲設置等完善的功能等。
軟件的缺點:部分功能還未實現,如商店購買裝備等。有些地方還可以進一步改進。
??? 總體而言,軟件較好的完成了功能需求!
總結
以上是生活随笔為你收集整理的骑士进化论RPG游戏实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 没有GPS模块无人机无法解锁解决方法测试
- 下一篇: 【蓝桥杯单片机(18)】第七届省赛-模拟