1、定义一个描述战斗单位的英雄(Hero)类,此类必须包含以下成员变量:名称(name),生命值(life),技能1攻击力(damage1),防御力(defence)。此类包含成员方法:受到对手攻击时的处理方法(attacked())。
2、此游戏中存在多种战斗角色:刺客(cike)、法师(fashi)、坦克(tanke),每种角色都是由要求1所定义的类派生出来的子类。各角色类都继承英雄(Hero)类,并添加成员属性:技能2攻击力(damage2)和技能3攻击力(damage3),在各角色类中,根据表1在其无参构造方法中初始化各角色的生命值、攻击力、防御力。定义一个免伤(Safe)接口,Safe接口中定义抽象方法show();各角色类都实现Safe接口,在重写的show()方法中输出免伤信息。类图如图1所示。
表1 各类英雄属性
英雄名称 |
生命值 |
技能1攻击力 |
技能2攻击力 |
技能3攻击力 |
防御力 |
刺客 |
100 |
6 |
15 |
30 |
8 |
法师 |
80 |
8 |
20 |
40 |
6 |
坦克 |
120 |
6 |
12 |
20 |
10 |
3、此游戏采用回合制,游戏操作者通过选定我方出战英雄和对战英雄,双方英雄不能相同。每个回合由我方先出击,然后轮到对方出击;受攻击的伤害值通过随机数选定技能1/技能2/技能3的攻击力确定,判断受攻击的伤害是否大于自身的防御值,如果大于,则调用attecked()方法,否则调用show()方法。持续对战直到有一方的生命值小于等于0,游戏结束。游戏必须具有完备的提示信息,例如提示用户输入、每个回合都显示敌我双方每个角色对象的各种参数值等。
4、在IDEA中新建“HeroAgainst”项目。完成实验后,将项目导出为压缩包(“File”®“Export”®“Project to Zip File...”)。
图1 类图
Scanner input=new Scanner(System.in);
String role = input.nextLine();
Random random = new Random();
int i = random.nextInt(3);
package Shiyan.duizhan;
import java.util.Random;
import java.util.Scanner;
class Hero {//定义英雄类
public String name;//英雄名称
int life;//英雄生命
int damage1;//英雄伤害
int defence;//英雄防御
int n;//接收英雄总伤害
int m;//未死时接收英雄伤害
public void attacked(int damage){
n = life;
life = life - (damage - defence);
m = damage - defence;
if(life >= 0){
System.out.println("受到了" + m + "伤害,生命值还剩" + life);
}else{
System.out.println("受到了" + m + "伤害,生命值还剩" + 0);
}
}
public void show(){
System.out.println("扛下了所有伤害");
}
}
class Chike extends Hero implements Safe{
int damage2;
int damage3;
@Override
public void show(){
System.out.println("刺客扛下来所有伤害");
}
}
class Fashi extends Hero implements Safe{
int damage2;
int damage3;
@Override
public void show(){
System.out.println("法师扛下来所有伤害");
}
}
class Tanke extends Hero implements Safe {
int damage2;
int damage3;
@Override
public void show(){
System.out.println("坦克扛下来所有伤害");
}
}
interface Safe {
public void show();
}
public class DuiZhanTest {
private static int d,w;
public static void main(String[] args) {
Hero h = new Hero();
Chike cike = new Chike();//实例化刺客
cike.life = 100;
cike.damage1 = 6;
cike.damage2 = 15;
cike.damage3 = 30;
cike.defence = 8;
Fashi fashi = new Fashi();//实例化法师
fashi.life = 80;
fashi.damage1 = 8;
fashi.damage2 = 20;
fashi.damage3 = 40;
fashi.defence = 6;
Tanke tanke = new Tanke();//实例化坦克对象
tanke.life = 120;
tanke.damage1 = 6;
tanke.damage2 = 12;
tanke.damage3 = 20;
tanke.defence = 10;
System.out.println("请选择一个角色,并输入角色编号:");
System.out.println("A.刺客 B.法师 C.坦克 ");
Scanner input1 = new Scanner(System.in);
String role1 = input1.nextLine();
System.out.println("请选择一个不同英雄的对手,并输入对手编号:");
System.out.println("A.刺客 B.法师 C.坦克 ");
Scanner input2 = new Scanner(System.in);
String role2 = input1.nextLine();
String[] hero = {"刺客", "法师", "坦克"};//中文英雄名称
Hero[] yx2 = {cike, fashi,tanke };//实例化的对象
String[] yx1 = {"A", "B", "C"};//比较所选的英雄
int[][] damage = {{6, 15, 30}, {8, 20, 40}, {6, 12, 20}};//英雄对应的各技能伤害
for (int i = 0; i < 3; i++) {
if (role1.equals(yx1[i])) {
w = i;
}
if (role2.equals(yx1[i])) {
d = i;
}
}
System.out.println("我方:" + hero[w] + " " + "VS" + " " + "对方:" + hero[d]);
System.out.println("===============对战开始===============");
for (int j = 1; yx2[w].life > 0 && yx2[d].life > 0; j++) {
System.out.println("第" + j + "回合");
Random random = new Random();
int hurt = random.nextInt(3);
if (damage[w][hurt] > yx2[d].defence&&yx2[w].life>0) {//判断我方伤害是否大于敌方防守力
System.out.print("敌方"+hero[d]);
yx2[d].attacked(damage[w][hurt]);
}
if (damage[w][hurt] <= yx2[d].defence) {//判断我方伤害是否小于敌方防守力
yx2[d].show();
}
if (damage[d][hurt] > yx2[w].defence&&yx2[d].life>0) {//判断敌方伤害是否大于我方防守力
System.out.print("我方"+hero[w]);
yx2[w].attacked(damage[d][hurt]);
}
if (damage[d][hurt] <= yx2[w].defence) {//判断敌方伤害是否小于我方防守力
yx2[w].show();
}
if(yx2[d].life<=0)//敌方英雄血量为零
{
System.out.println("敌方英雄阵亡,游戏结束");break;
}
if(yx2[w].life<=0)//我方英雄血量为零
{
System.out.println("我方英雄阵亡,游戏结束");break;
}
}
}
}
图2 运行结果