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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2.用一个简单的pk小游戏深刻理解继承

發布時間:2023/12/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2.用一个简单的pk小游戏深刻理解继承 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們來寫一個pk類小游戲深刻理解一下繼承:

public class LiuBei {// 屬性String name;int ad;int hp;// PK 攻擊的是一種類型public void ack_1(LvBu lvbu) {lvbu.hp = lvbu.hp - this.ad;System.out.println(this.name + "攻擊了" + lvbu.name);System.out.println(lvbu.name + "失去了" + this.ad + "點HP");System.out.println(lvbu.name + "還剩下" + lvbu.hp + "點HP");} } public class LvBu{String name;int ad;int hp;// PK 攻擊的是一種類型public void ack_1(LiuBei liubei){liubei.hp = liubei.hp - (this.ad*2);System.out.println (this.name + "攻擊了" + liubei.name);System.out.println (liubei.name+"失去了"+(this.ad*2)+"點HP");System.out.println (liubei.name+"還剩下"+liubei.hp+"點HP");}} public class Entrance{public static void main(String[] args){// 先創建雙方對象LvBu lvbu = new LvBu ();LiuBei liubei = new LiuBei ();// 給對象的屬性賦值lvbu.name="呂布";lvbu.hp=2000;lvbu.ad=130;liubei.name="劉備";liubei.hp=1800;liubei.ad=150;int count=0;while(lvbu.hp>0&&liubei.hp>0){System.out.println ("-----第"+(++count)+"回合----");// 互相攻擊了一次lvbu.ack_1 (liubei);if(liubei.hp>0){// 被攻擊之后 再判斷一次生命值liubei.ack_1(lvbu);}}} }

? ? ? ? 這幾段代碼出現后,我們可以很明顯的看到,在呂布,劉備這兩個類中,有代碼冗余。這僅僅是兩個簡單的人物,我們想一想,假如我們一個人物需要寫1000行代碼,我們的游戲中有108個人物,那么總計就有108000行代碼。?

? ? ? ? 于是我們就要思考一個問題,能否將這些人物共同的功能寫在一個類中,讓每個人物都來“繼承”這個類中的功能?假如我們每個人物之間重復的代碼大約是400行,那么我們每個人物只需要編寫600行,用剛提到的策略,代碼行數總共為400+600*108=65200,少了42800行代碼,一下子使代碼行數少了一大半,并且可以有更好的維護性。

? ? ? ? 從這個例子可以看出,人物之間共同的代碼越多,繼承效果越好,實際上,兩個任務的共同的功能很可能超過了一半。上述策略就叫做繼承,繼承是面向對象的重要特征。在java中,被繼承的類叫父類、基類或者超類,與之對應的叫子類或派生類。

? ? ? ?我們就以這個pk游戲為例,他們都有攻擊功能,且屬性均為姓名、攻擊值、生命力,因此將兩個類共同的部分寫成一個類——Hero,讓兩個人物劉備和呂布繼承它即可。

public class Hero {String name;int ad;int hp;public void ack(Hero h){h.hp=h.hp-this.ad;System.out.println(this.name+"攻擊了"+h.name);System.out.println(h.name+"失去了"+this.ad+"點HP");System.out.println(h.name+"還剩下"+h.hp+"點HP");}public void move(){System.out.println(this.name+"每秒移動1米");} }

兩個子類如下:

public class LiuBei extends Hero{//重寫父類的方法@ Override //重寫方法的檢查注解public void move(){System.out.println(this.name+"每秒移動2米");} } public class LvBu extends Hero{//重寫父類的方法@ Override //重寫方法的檢查注解public void ack(Hero h){h.hp = h.hp - (this.ad*2);System.out.println (this.name + "攻擊了" + h.name);System.out.println (h.name+"失去了"+(this.ad*2)+"點HP");System.out.println (h.name+"還剩下"+h.hp+"點HP");}} public class Entrance{public static void main(String[] args){// 先創建雙方對象LvBu lvbu = new LvBu ();LiuBei liubei = new LiuBei ();// 給對象的屬性賦值liubei.name="呂布";liubei.hp=2000;liubei.ad=130;lvbu.name="劉備";lvbu.hp=1800;lvbu.ad=150;int count=0;while(lvbu.hp>0&&liubei.hp>0){System.out.println ("-----第"+(count++)+"回合----");// 互相攻擊了一次lvbu.ack (liubei);lvbu.move();if(liubei.hp>0){// 被攻擊之后 再判斷一次生命值liubei.ack(lvbu);liubei.move();}}} }

? ? ? ?從表面看,雖然劉備和呂布類都沒有定義成員變量,但他們繼承了父類的成員變量,可以i當作自己的變量一樣使用。他們各自也繼承或修改了父類的方法,具體不再闡述。

? ? ? ?為了便于理解,我們再寫一個書上的例子。以字體對話框和段落對話框為例,為了簡化起見,假如字體對話框特征是標題、字體名稱,該對話庫具有顯示的功能;段落對話框特征是標題、高度,該對話框具有顯示的功能。

? ? ? ?顯然,這兩個對話框都有標題和顯示功能,因此首先將兩個類共同的部分寫成一個類——Dialog。

public class Dialog {protected String title;public void show(){System.out.println(title+"對話框顯示");} }

? ? ? ?接下來編寫字體對話框類FontDialog來繼承Dialog類。

public class FontDialog extends Dialog {private String fontName;public FontDialog(String title,String fontName){this.title=title;this.fontName=fontName;} }

? ? ? ? 從表面上看,該類只定義了一個成員變量fontName,實際上還從父類繼承了title,可以當成自己的變量一樣使用。

? ? ? ? 下面用一個主函數進行測試:

public class Entrance{public static void main(String[] args) {FontDialog fd=new FontDialog("字體","宋體");fd.show();} }

? ? ? ?顯然,FontDialog從父類那里繼承了show方法,也能當成自己方法一樣來使用。

? ? ? ?注:如果一個成員要被子類繼承之后使用,這個成員不能是private,因為私有的成員不能在類的外部使用,當然也不能被子類使用。一般情況下,成員變量定義為protected類型,成員函數定義為public類型。

總結

以上是生活随笔為你收集整理的2.用一个简单的pk小游戏深刻理解继承的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。