一、题目
设计需求:
(1)
怪物的共有属性有:名称、血量、攻击力、防御力;
共有的方法有:显示属性、判定是否死亡和攻击
(2)
设置两种怪物:独眼巨人,树怪
(3)
独眼巨人特有的属性有:武器(狼牙棒或钉锤);
独眼巨人具有的攻击方法是:使用武器(狼牙棒或钉锤)攻击。
(4)
树怪特有的属性:高度
树怪的攻击方式是使用树枝缠绕攻击。
(5)
创建两只独眼巨人和1只树怪的对象,放入集合中,并轮流攻击集合中的下一个对象(0攻击1,1攻击2,2攻击0),直到只剩下一只怪物存活。
(6)
伤害值计算公式为:攻击者攻击力 - 被攻击者防御力
被攻击者的血量会因受到伤害而减少
(7)
死亡判定规则:血量小于等于0
二、怪物基类
//Monster.java
public class Monster {//怪物父类
String name;//名称
double health;//血量
double attack;//攻击力
double defense;//防御力
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getHealth() {
return health;
}
public void setHealth(double health) {
this.health = health;
}
public double getAttack() {
return attack;
}
public void setAttack(double attack) {
this.attack = attack;
}
public double getDefense() {
return defense;
}
public void setDefense(double defense) {
this.defense = defense;
}
public Monster() {//构造方法
}
public Monster(String name,double health,double attack,double defense) {//构造方法
this.name = name;
this.health = health;
this.attack = attack;
this.defense = defense;
}
void show_info() {//显示属性
System.out.print("\n名称:"+ this.name + " 血量: " +this.health+" 攻击力: "+this.attack+" 防御力: "+this.defense);
}
boolean is_death() {//判断是否死亡
if(this.health<=0) {//血量不足时
return true;
}
else return false;
}
void attack(Monster enemy) {//攻击
double harm = this.attack - enemy.defense;//伤害计算
if(harm<0)//无效攻击
harm = 0;
this.health -= harm;//扣血
}
}
三、独眼巨人类
//Monster_DY.java
import java.util.Random;
public class Monster_DY extends Monster{//独眼巨人子类
String arms;//武器
Random random = new Random();
public String getArms() {
return arms;
}
public void setArms(String arms) {
this.arms = arms;
}
public Monster_DY() {//构造方法
super();
}
public Monster_DY(String name,double health,double attack,double defense,String arms) {//构造方法
super(name, health, attack, defense);
this.arms = arms;
}
void show_info() {//显示属性,方法重构造
super.show_info();
System.out.print(" 武器: "+this.arms);
}
void attack(Monster enemy) {//攻击,方法重构造
super.attack(enemy);
int flag = random.nextInt(1);//生成0或1的随机数
if(flag==0) {//切换武器钉锤
this.arms = "钉锤";
}
else {//切换武器狼牙棒
this.arms = "狼牙棒";
}
System.out.println(this.name+"使用"+this.arms+"攻击, "+"对"+enemy.name+"造成了"+this.attack+"点伤害!");
}
}
四、树怪类
//Monster_SG.java
public class Monster_SG extends Monster{//树怪子类
double height;//高度
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public Monster_SG() {//构造方法
super();
}
public Monster_SG(String name,double health,double attack,double defense,double height) {//构造方法
super(name, health, attack, defense);
this.height = height;
}
void show_info() {//显示属性,方法重构造
super.show_info();
System.out.print(" 高度: "+this.height);
}
void attack(Monster enemy) {//攻击,方法重构造
super.attack(enemy);
System.out.println(this.name+"使用树枝缠绕攻击, "+"对"+enemy.name +"造成"+this.attack+"点伤害!");
}
}
五、测试类
//GameTest.java
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Random;
import javax.lang.model.util.ElementFilter;
import javax.sound.sampled.LineListener;
public class GameTest {
public static void main(String[] args) {
Monster_DY dy1 = new Monster_DY("独眼巨人", 100, 30, 5, "狼牙棒");
Monster_DY dy2 = new Monster_DY("独眼巨人王", 300, 50, 5, "钉锤");
Monster_SG sg = new Monster_SG("树怪战士", 200, 50, 6, 30);
dy1.show_info();
dy2.show_info();
sg.show_info();
ArrayList<Monster> list = new ArrayList<Monster>();//动态数组,元素为Monster类型
list.add(dy1);
list.add(dy2);
list.add(sg);
System.out.println("\n**************************************************************");
int index = 0;
while(list.size()>1) {//怪物互打
Monster cur = list.get(index);//发起攻击的怪物
Monster enemy = list.get((index+1)%list.size());//被攻击的怪物
cur.attack(enemy);//攻击
if(enemy.is_death()) {//攻击目标死亡时
System.out.println(enemy.name+"被"+cur.name+"打死了");
list.remove(enemy);
}
index = (index+1)%list.size();
}
System.out.println("\n**************************************************************");
System.out.println("胜利者是: ");
list.get(0).show_info();
}
}