学习Java第二十天--游戏角色案例(接口案例)

一个游戏角色案例,通过接口,实现游戏角色的职业、武器、伤害

首先我们要将接口设计好,
创建一个游戏角色的接口Role,赋予角色攻击和练习的能力:

interface Role {//角色接口
	int attack();//攻击方法,返回对敌人的伤害值
	void practise();//练习方法,练习后会提升伤害
}

创建法师法杖接口:

interface MagicStick {//法师使用的法杖接口
	int fire();//法师武器的属性
}

创建战士武器接口:

interface Weapon {//战士武器的接口
	void setSoldier(Soldier s);//设置武器的使用者
	
	int fire();//战士武器的属性
}

然后创建NameRole类,该类为一个抽象类,是所有角色的父类:

abstract class NameRole implements Role{//角色类,所有职业的父类
	private String name;//角色的名字
	private int age;//角色的年龄
	
	public int attack() { //返回值为角色的攻击对敌人的伤害
		return 0;
	}
	
	public void practise() {//练习方法,练习后会提升伤害
		
	}

	public NameRole() {
		super();
	}

	public NameRole(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "NameRole [name=" + name + ", age=" + age + "]";
	}
	
}

然后是武器类:

法师法杖:绿杖

import java.util.Calendar;

public class GreenStick implements MagicStick {//法师武器:绿杖

	@Override
	public int fire() {
		Calendar cal = Calendar.getInstance();
		int month = cal.get(Calendar.MONTH) + 1;//接收系统当前月份
		if(month == 6 || month == 7 || month == 8) {//当前月份为6、7、8时,提升魔法等级2
			return 2;
		}
		
		return 1;//否则提升魔法等级1
	}

	@Override
	public String toString() {
		return "GreenStick";
	}

}

黑杖:

import java.util.Calendar;

public class BlackStick implements MagicStick {//法师武器:黑杖

	@Override
	public int fire() {
		Calendar cal = Calendar.getInstance();
		int month = cal.get(Calendar.MONTH) + 1;
		
		if(month % 2 == 0) {//当当前月份为偶数月时,提升魔法等级2
			return 2;
		}else {
			return 1;//否则提升魔法等级1
		}
	}

	@Override
	public String toString() {
		return "BlackStick";
	}

}

战士武器:大刀:

public class Bolo implements Weapon {//战士武器:大刀

	Soldier soldier = null;//武器的持有者
	
	@Override
	public void setSoldier(Soldier s) {//绑定武器的使用者
		soldier = s;
	}

	@Override
	public int fire() {//武器的属性
		if(soldier.getAge() < 18) {//大刀的使用者年龄小于18时,伤害值为50
			return 50;
		}else{
			return 100;//否则为100
		}
	}

	@Override
	public String toString() {
		return "Bolo";
	}
}

长矛:

public class Pike implements Weapon {//战士武器:长矛

	String name = "Alex";//长矛的名字
	
	Soldier soldier = null;//武器的持有者
	
	@Override
	public void setSoldier(Soldier s) {//绑定武器的持有者
		soldier = s;
	}

	@Override
	public int fire() {//武器的属性
		if( this.name.equals( soldier.getName() ) == true) {//当长矛的名字和战士的名字一致时,伤害值为1000
			return 1000;
		}else {
			return 25;//否则伤害值为25
		}

	}

	@Override
	public String toString() {
		return "Pike";
	}
	
}

接下来就可以开始创建职业类:
法师类:

class Magicer extends NameRole{//法师类
	private int level = 1;//魔法等级,范围为1~10
	
	private MagicStick stick = null;//法师的法杖
	
	public int attack() {//返回法师攻击伤害值
		int basicValue = 5;//魔法基本伤害值
		return level * basicValue;
	}
	
	public void practise() {//练习方法,练习后会提升伤害
		if(level < 10) {//当魔法等级达到最高时,不再提升
			if(stick == null) {//当没有法杖时,提升魔法等级+1
				level++;
				return;
			}
			level += 1 + stick.fire();//有法杖时,按法杖的属性进行提升法师等级
			return;
		}
		return;
	}
	public Magicer() {
		super();
	}

	public Magicer(String name, int age, int level, MagicStick stick) {
		super(name, age);
		this.level = level;
		this.stick = stick;
	}

	public int getLevel() {
		return level;
	}

	public void setLevel(int level) {
		this.level = level;
	}

	public MagicStick getStick() {
		return stick;
	}

	public void setStick(MagicStick stick) {
		this.stick = stick;
	}

	@Override
	public String toString() {
		return "Magicer [Name =" + getName() + ", Age =" + getAge() + ", level =" + level + ", stick =" + stick
				+ ", attack =" + attack() + "]";
	}
	
}

战士类:

class Soldier extends NameRole{//战士类
	private int hurt = 0;//攻击伤害值
	
	private Weapon weapon = null;//战士的武器
	
	public int attack() {//返回战士攻击对敌人造成的伤害值
		int att = hurt + weapon.fire();
		return att;
	}

	public void practise() {//练习方法,练习后会提升伤害
		hurt += 10;//每次练习,战士的攻击伤害值提升10
	}

	public Soldier() {
		super();
	}

	public Soldier(String name, int age, int hurt, Weapon weapon) {
		super(name, age);
		this.hurt = hurt;
		this.weapon = weapon;
		this.weapon.setSoldier(this);
	}

	public int getHurt() {
		return hurt;
	}

	public void setHurt(int hurt) {
		this.hurt = hurt;
	}

	public Weapon getWeapon() {
		return weapon;
	}

	public void setWeapon(Weapon weapon) {
		this.weapon = weapon;
	}

	@Override
	public String toString() {
		return "Soldier [Name =" + getName() + ", Age =" + getAge() + ", hurt =" + hurt + ", weapon=" + weapon
				+ ", attack=" + attack() + "]";
	}
	
}

然后设计Team类,用以角色组队:

class Team {//组队类
	NameRole[] team = new NameRole[6];//组队成员最多为6人
	int teamMenberNumber = 0;//团队成员数量
	
	public void addMember(NameRole role) {//组队增加一个成员
		
		if(role == null) {//判断传入的角色是否是无效的
			return;
		}
		if(teamMenberNumber == 6) {//判断组队成员是否已达上限
			return;
		}
		if(role.getClass() != (new Magicer()).getClass() && 
				role.getClass() != (new Soldier()).getClass()) {//确保成员是有职业的
			return;
		}
		team[teamMenberNumber] = role;//将成员加入团队
		teamMenberNumber++;//团队成员数量加一
	}
	public int attackSum() {
		int sum = 0;
		for(int i = 0 ; i < teamMenberNumber ; i++) {
			if(team[i].getClass() == (new Magicer()).getClass()) {//判断角色的真实职业,并将伤害值相加
				Magicer r = (Magicer)team[i];
				sum += r.attack();
			}else{
				Soldier r = (Soldier)team[i];
				sum += r.attack();
			}
		}
		return sum;
	}
}

这只是一个初级的游戏角色设计,最后我们编写测试类来测试代码是否可行:

public class Test {

	public static void main(String[] args) {
		Team[] teams = new Team[2];
		System.out.println("-----欢迎来到Test-----");
		System.out.println("---您现在有两个个冒险团---");
		System.out.println("-----战士冒险团成员-----");
		Soldier[] soldiers = showSoldier();
		teams[0] = addTeam(soldiers);
		System.out.println("战士冒险团的总合伤害值为:" + teams[0].attackSum());
		System.out.println("\n-----法师冒险团成员-----");
		Magicer[] magicers = showMagicer();
		teams[1] = addTeam(magicers);
		System.out.println("法师冒险团的总合伤害值为:" + teams[1].attackSum());
		
		System.out.println("\n两个冒险团练习后,伤害值为:");
		practise(teams[0]);
		practise(teams[1]);
		System.out.println("-----战士冒险团成员-----");
		for(int i = 0 ; i < soldiers.length ; i++) {
			System.out.println(soldiers[i].toString());
		}
		System.out.println("战士冒险团的总合伤害值为:" + teams[0].attackSum());
		System.out.println("\n-----法师冒险团成员-----");
		for(int i = 0 ; i < magicers.length ; i++) {
			System.out.println(magicers[i]);
		}
		System.out.println("法师冒险团的总合伤害值为:" + teams[1].attackSum());
	}
	
	

	public static Soldier[] showSoldier() {
		Soldier[] soldiers = new Soldier[] {
				new Soldier("Tom", 16 , 20 , new Bolo()),
				new Soldier("Jake", 35 , 15 , new Bolo()),
				new Soldier("Bill", 24 , 25 , new Pike()),
				new Soldier("Alex", 22 , 20 , new Pike())
		};
		for(int i = 0 ; i < soldiers.length ; i++) {
			System.out.println(soldiers[i].toString());
		}
		return soldiers;
	}
	
	public static Magicer[] showMagicer() {
		Magicer[] magicers = new Magicer[] {
				new Magicer("Jane", 18 , 2 , new GreenStick()),
				new Magicer("Rose", 20 , 4 , new GreenStick()),
				new Magicer("annie", 19 , 5 , new BlackStick()),
				new Magicer("Angle", 16 , 2 , new BlackStick()),
		};
		for(int i = 0 ; i < magicers.length ; i++) {
			System.out.println(magicers[i]);
		}
		return magicers;
	}
	
	
	public static Team addTeam(Object[] objs) {
		Team team = new Team();
		for(int i = 0 ; i < objs.length ; i++) {
			if(objs[i].getClass() == (new Soldier()).getClass()) {
				Soldier soldier = (Soldier)objs[i];
				team.addMember(soldier);
			}
			if(objs[i].getClass() == (new Magicer()).getClass()) {
				Magicer magicer = (Magicer)objs[i];
				team.addMember(magicer);
			}
		}
		return team;
	}
	
	public static void practise(Team team) {
		for(int i = 0 ; i < team.teamMenberNumber ; i++) {
			if(team.team[i].getClass() == (new Soldier()).getClass()) {
				Soldier soldier = (Soldier)team.team[i];
				soldier.practise();;
			}
			if(team.team[i].getClass() == (new Magicer()).getClass()) {
				Magicer magicer = (Magicer)team.team[i];
				magicer.practise();;
			}
		}
	}
}

运行结果为:

-----欢迎来到Test-----
---您现在有两个个冒险团---
-----战士冒险团成员-----
Soldier [Name =Tom, Age =16, hurt =20, weapon=Bolo, attack=70]
Soldier [Name =Jake, Age =35, hurt =15, weapon=Bolo, attack=115]
Soldier [Name =Bill, Age =24, hurt =25, weapon=Pike, attack=50]
Soldier [Name =Alex, Age =22, hurt =20, weapon=Pike, attack=1020]
战士冒险团的总合伤害值为:1255

-----法师冒险团成员-----
Magicer [Name =Jane, Age =18, level =2, stick =GreenStick, attack =10]
Magicer [Name =Rose, Age =20, level =4, stick =GreenStick, attack =20]
Magicer [Name =annie, Age =19, level =5, stick =BlackStick, attack =25]
Magicer [Name =Angle, Age =16, level =2, stick =BlackStick, attack =10]
法师冒险团的总合伤害值为:65

两个冒险团练习后,伤害值为:
-----战士冒险团成员-----
Soldier [Name =Tom, Age =16, hurt =30, weapon=Bolo, attack=80]
Soldier [Name =Jake, Age =35, hurt =25, weapon=Bolo, attack=125]
Soldier [Name =Bill, Age =24, hurt =35, weapon=Pike, attack=60]
Soldier [Name =Alex, Age =22, hurt =30, weapon=Pike, attack=1030]
战士冒险团的总合伤害值为:1295

-----法师冒险团成员-----
Magicer [Name =Jane, Age =18, level =4, stick =GreenStick, attack =20]
Magicer [Name =Rose, Age =20, level =6, stick =GreenStick, attack =30]
Magicer [Name =annie, Age =19, level =7, stick =BlackStick, attack =35]
Magicer [Name =Angle, Age =16, level =4, stick =BlackStick, attack =20]
法师冒险团的总合伤害值为:105

逻辑上基本没有问题,然后因为时间原因没有将界面设计的好些,测试类的函数其实都可以整合到各个相应的类中。总的来说,通过这样一个案例,可以很好的理解接口在实际应用中的作用,并且这样的案例,使我将目前所学知识进行了一个整体的融会。

发布了34 篇原创文章 · 获赞 7 · 访问量 1291

猜你喜欢

转载自blog.csdn.net/weixin_44257082/article/details/104599663
今日推荐