問題描述:
在本題中使用面向物件的方式設計實作一個簡單的對戰游戲。該游戲有戰士Soldier和法師Master兩種型別的玩家。每個玩家都可以指定姓名name,每種玩家都具有給定的生命值hp、攻擊力atk和防御力def。通過定義attack()方法來讓每個玩家具有戰斗能力。
每個玩家還可以配有一個武器裝備Weapon,裝備可以改變玩家的攻擊力和防御力。Weapon通過實作Tradable介面還可以實作買賣。
撰寫GameTest類測驗運行該游戲。在該類中撰寫fight(Player, Player)方法來模擬兩個玩家對戰。對戰程序中隨機選中一個玩家進行攻擊,如此重復,直到某一方的hp值小于0。在main()方法中,構造兩個玩家物件,一個Solder一個Master,呼叫fight()方法進行對戰,并輸出對戰結果。
本題所需設計的類和介面的具體細節如下。
1)Tradable介面(10分)
Tradable介面中宣告兩個void方法:but(int price)和sell(int price)
2)Weapon類(10分)
Weapon類實作了Tradable介面。
Weapon類有兩個私有的int型別的屬性:表示攻擊力的atk和表示防御力的def。為這兩個屬性提供公有的訪問器方法。為Weapon類提供一個帶參構造方法Weapon(int atk, int def)。
3)Player類(10分)
Player類有五個受保護的屬性:
String name表示玩家的名字
int hp表示玩家的生命值,初始值為100
int atk表示玩家的攻擊力
int def表示玩家的防御力
Weapon weapon表示玩家裝備的武器
為屬性name、hp、weapon提供訪問器方法和修改器方法。
為屬性atk、def只提供訪問器方法,注意玩家的攻擊力由其自身的攻擊力和weapon的攻擊力組成,防御力def亦是如此。
在Player類中重寫toString()方法,回傳玩家的namt和hp值。
在Player類中提供一個void的attack(Player player)方法,該方法可以改變被攻擊的player物件的hp值,而攻擊者的生命值不受影響。
void attack(Player player) {
Random random = new Random();
int realAtk = random.nextInt(getAtk()); //實際攻擊力
int realDef = random.nextInt(player.getDef()); //實際防御力
int realHp = realAtk - realDef > 0 ? realAtk - realDef : 0; //實際損失的生命值
player.setHp(player.getHp() - realHp); //修改被攻擊的玩家的生命值
}
4)Soldier類(10分)
Soldier類是Player類的子類。為該類提供一個帶參構造方法Soldier(String name, Weapon weapon) ,用于初始化Soldier物件的name、weapon、hp、atk、def五個屬性的值。hp初始值為100,atk為8,def為4。
5)Master類(10分)
Master類也是Player類的子類。為該類提供一個帶參構造方法Master(String name, Weapon weapon) ,用于初始化Master物件的name、weapon、hp、atk、def五個屬性的值。hp初始值為100,atk為4,def為10。
Master類增加一個治愈方法cure(Player p),用于為指定的Player物件的hp值增加10。
6)用于測驗的GameTest類,其中包含main()方法和fight()方法。(10分)
fight()方法的方法簽名為void fight(Player p1, Player p2)。在該方法中兩個玩家隨機出戰(即呼叫其attack()方法),直到其中一方玩家的hp值小于0。輸出兩個玩家誰輸誰贏。
在main()方法中,宣告兩個Player物件p1和p2,p1指向new Soldier("戰士", new Weapon(5, 5)),p2指向new Master("法師", new Weapon(5, 5))。呼叫fight(p1,p2)測驗對戰情況。
uj5u.com熱心網友回復:
控制臺小游戲?
uj5u.com熱心網友回復:
能描述這么清楚,你行的轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/55186.html
標籤:非技術區
