一个游戏角色案例,通过接口,实现游戏角色的职业、武器、伤害
首先我们要将接口设计好,
创建一个游戏角色的接口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
逻辑上基本没有问题,然后因为时间原因没有将界面设计的好些,测试类的函数其实都可以整合到各个相应的类中。总的来说,通过这样一个案例,可以很好的理解接口在实际应用中的作用,并且这样的案例,使我将目前所学知识进行了一个整体的融会。