功能:设计一组类和接口,满足如下要求:(编译成功即可)
a.游戏模拟:兵种包括轰炸机、直升机、重型坦克、轻型坦克、音波坦克、步兵、飞行兵
b.轰炸机、直升机、飞行兵属于空军;步兵、轻型坦克、重型坦克属于陆军,音波坦克属于水陆两栖;
(提示:设计时,音波坦克内有标记inWater,在构造时填入,若为true,则表示目前音波坦克在水中,否则就是在陆地上)
c.轻型坦克、步兵只能攻击陆军,音波坦克只能攻击空军,轰炸机可攻击陆军、海军;重型坦克可攻击陆军、空军,直升机、飞行兵可攻击海军、陆军、空军;
并验证设计效果。(即向兵种变量填入海/陆/空军兵种,检测a.attack(b)的输出)
先画图:
interface 海军{;}
interface 陆军{;}
interface 空军{;}
interface 可对地攻击{
default void attack(陆军 x) {System.out.print("可以攻击陆军");}
}
interface 可对空攻击{
default void attack(空军 x) {System.out.print("可以攻击空军");}
}
interface 可对海攻击{
default void attack(海军 x) {System.out.print("可以攻击海军");}
}
interface 可对地对海攻击 extends 可对地攻击,可对海攻击{;}
interface 可对地对空攻击 extends 可对地攻击,可对空攻击{;}
interface 可对地对海对空攻击 extends 可对地攻击,可对海攻击,可对空攻击{;}
abstract class 兵种{
private String type;
public 兵种(String x) { type=x;}
public String getType() { return type;}
public abstract void attack(兵种 x);
public String attackInfo(兵种 x) {
return type+"遇见"+x.getType();
}
}
abstract class 飞行器 extends 兵种 implements 空军{
public 飞行器 (String x) { super(x);}
}
class 轰炸机 extends 飞行器 implements 可对地对海攻击{
public 轰炸机 () { super("轰炸机");}
public void attack(兵种 x) {
System.out.print("\n"+attackInfo(x)+":");
if(x instanceof 音波坦克) {
if( ((音波坦克)x).getInWater() )
System.out.print("音波坦克在海里,可以攻击");
else
System.out.print("音波坦克在陆地,可以攻击");
return;
}
if(x instanceof 陆军) { attack((陆军)x); return;}
if(x instanceof 海军) { attack((海军)x); return;}
System.out.print("不能攻击!");
}
}
class 直升机 extends 飞行器 implements 可对地对海对空攻击{
public 直升机 () { super("直升机");}
public void attack(兵种 x) {
System.out.print("\n"+attackInfo(x)+":");
if(x instanceof 音波坦克) {
if( ((音波坦克)x).getInWater() )
System.out.print("音波坦克在海里,可以攻击");
else
System.out.print("音波坦克在陆地,可以攻击");
return;
}
if(x instanceof 海军) { attack((海军)x); return;}
if(x instanceof 陆军) { attack((陆军)x); return;}
if(x instanceof 空军) { attack((空军)x); return;}
System.out.print("不能攻击!");
}
}
abstract class 坦克 extends 兵种{
public 坦克(String x) { super(x);}
}
class 重型坦克 extends 坦克 implements 陆军,可对地对空攻击{
public 重型坦克 () { super("重型坦克");}
public void attack(兵种 x) {
System.out.print("\n"+attackInfo(x)+":");
if(x instanceof 陆军) {
if(x instanceof 音波坦克 && ((音波坦克)x).getInWater())
System.out.print("音波坦克在海里,不能攻击!");
else
attack((陆军)x);
return;
}
if(x instanceof 空军) { attack((空军)x); return;}
System.out.print("不能攻击!");
}
}
class 轻型坦克 extends 坦克 implements 陆军,可对地攻击{
public 轻型坦克 () { super("轻型坦克");}
public void attack(兵种 x) {
System.out.print("\n"+attackInfo(x)+":");
if(x instanceof 陆军) {
if(x instanceof 音波坦克 && ((音波坦克)x).getInWater())
System.out.print("音波坦克在海里,不能攻击!");
else
attack((陆军)x);
return;
}
System.out.print("不能攻击!");
}
}
class 音波坦克 extends 坦克 implements 海军,陆军,可对空攻击{
private int inWater;
public 音波坦克 (int x) {
super("音波坦克");
inWater = x;
}
public boolean getInWater(){
if(inWater == 1) return true;
else return false;
}
public void attack(兵种 x) {
System.out.print("\n"+attackInfo(x)+":");
if(x instanceof 空军) { attack((空军)x); return;}
System.out.print("不能攻击!");
}
}
abstract class 士兵 extends 兵种{
public 士兵(String x) { super(x);}
}
class 步兵 extends 士兵 implements 陆军,可对地攻击{
public 步兵 () { super("步兵");}
public void attack(兵种 x) {
System.out.print("\n"+attackInfo(x)+":");
if(x instanceof 陆军) {
if(x instanceof 音波坦克 && ((音波坦克)x).getInWater())
System.out.print("音波坦克在海里,不能攻击!");
else
attack((陆军)x);
return;
}
System.out.print("不能攻击!");
}
}
class 飞行兵 extends 士兵 implements 空军,可对地对海对空攻击{
public 飞行兵 () { super("飞行兵");}
public void attack(兵种 x) {
System.out.print("\n"+attackInfo(x)+":");
if(x instanceof 音波坦克) {
if( ((音波坦克)x).getInWater() )
System.out.print("音波坦克在海里,可以攻击");
else
System.out.print("音波坦克在陆地,可以攻击");
return;
}
if(x instanceof 陆军) { attack((陆军)x); return;}
if(x instanceof 海军) { attack((海军)x); return;}
if(x instanceof 空军) { attack((空军)x); return;}
System.out.print("不能攻击!");
}
}
class App_Game{
public static void main(String [] args) {
兵种 [] obj = {new 直升机(),new 轰炸机(),new 音波坦克(1),
new 轻型坦克(),new 飞行兵(),new 步兵(),
new 重型坦克(),new 音波坦克(0)}; //1表示音波坦克在海里,0表示在陆地
int i,j;
for(i=0,j=obj.length-1;i<obj.length;i++,j--)
obj[i].attack(obj[j]);
}
}
//加了个要求,要判断音波坦克在海里还是在陆地
根据不同兵种子类可攻击的类型 ,在兵种子类中进行判断