Java-龙与地下城怪物设计

一、题目

设计需求:
(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();
	}

}

六、实现效果

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦之海岛

创作不易,狐狸叹气

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值