当前位置:   article > 正文

超级烧脑的java接口扩展练习题(封装+继承+多态+实现+相互调用+多个实现类)_写接口练习

写接口练习

———完成以下游戏角色内容————封装、继承、多态—————————

注:某些方法的形参列表、返回值可以根据情况调整,并非固定不可变

父类:Role(角色),是所有职业的父类
1)属性:name,表示角色的名字
2)方法:public int attack(),该方法返回值为角色的攻击对敌人的伤害

1:Role类

  1. package com.project.game;
  2. public abstract class Role {
  3. private String name;
  4. public Role(){
  5. }
  6. public Role(String name) {
  7. this.name = name;
  8. }
  9. public String getName() {
  10. return name;
  11. }
  12. public void setName(String name) {
  13. this.name = name;
  14. }
  15. public abstract int attack();
  16. }

Role的第一个子类:Magicer(法师)
1)属性:魔法等级(范围为1~10)
2)方法:public int attack(),该方法返回法师的攻击对敌人造成的伤害值
      法师攻击伤害值为:魔法等级*魔法基本伤害值(固定为5)

2:Magicer类

  1. package com.project.game;
  2. public class Magicer extends Role {
  3. private int magicLevel;
  4. public Magicer() {
  5. }
  6. public Magicer(int magicLevel) {
  7. this.magicLevel = magicLevel;
  8. }
  9. public int getMagicLevel() {
  10. return magicLevel;
  11. }
  12. public void setMagicLevel(int magicLevel) {
  13. this.magicLevel = magicLevel;
  14. }
  15. public int attack(){
  16. int shanghai=5;
  17. int num=magicLevel*shanghai;
  18. System.out.println("法师攻击伤害值为:"+num);
  19. return num;
  20. }
  21. }

Role的第二个子类:Soldier(战士)
1)属性:攻击伤害值
2)方法:public int attack(),该方法返回战士对敌人造成的伤害值
      战士的攻击伤害值为:其攻击伤害属性值

3:Soldier类

  1. package com.project.game;
  2. import com.project.game.Role;
  3. public class Soldier extends Role {
  4. private int attackDamage;
  5. public Soldier(){
  6. }
  7. public Soldier(int attackDamage){
  8. this.attackDamage=attackDamage;
  9. }
  10. public int getAttackDamage(){
  11. return attackDamage;
  12. }
  13. public void setAttackDamage(int attackDamage){
  14. this.attackDamage=attackDamage;
  15. }
  16. public int attack(){
  17. System.out.println("战士攻击伤害值为:"+attackDamage);
  18. return attackDamage;
  19. }
  20. }

再设计一个Team类,表示一个组队。
1)addMember,表示组队增加一个成员
      注意:组队成员最多为6人
      提示:应当利用一个数组属性,保存所有成员
2)attackSum,表示组队所有成员进行攻击时,对敌人造成的总伤害

4:Team类

  1. package com.project.game;
  2. import com.project.game.Magicer;
  3. import com.project.game.Role;
  4. public class Team {
  5. Role[]role;
  6. int count=0;
  7. public void addMember(){
  8. if(count<6){
  9. count++;
  10. role=new Role[count];
  11. }
  12. }
  13. int num=0;
  14. public void addMembers(Role roles){
  15. if(num<role.length){
  16. role[num]=roles;
  17. num++;
  18. }
  19. }
  20. // public void addMembers(Role role1){
  21. // for(int i=1;i<role.length;i++){
  22. // role[i]=role1;
  23. // }
  24. // }
  25. public int attackSum(){
  26. int zongshanghai=0;
  27. for(int i=0;i<role.length;i++){
  28. if(role[i] instanceof Magicer){
  29. zongshanghai+=role[i].attack();
  30. }else{
  31. zongshanghai+=role[i].attack();
  32. }
  33. }
  34. return zongshanghai;
  35. }
  36. }

 5:Test测试类

  1. package com.project.game;
  2. import com.project.game.Magicer;
  3. import com.project.game.Soldier;
  4. import com.project.game.Team;
  5. public class Test {
  6. public static void main(String[]args){
  7. Team team=new Team();
  8. team.addMember();
  9. team.addMember();
  10. team.addMember();
  11. team.addMember();
  12. team.addMember();
  13. team.addMember();
  14. System.out.println("count值为:"+team.count);
  15. team.addMembers(new Magicer(2));
  16. team.addMembers(new Magicer(2));
  17. team.addMembers(new Magicer(2));
  18. team.addMembers(new Magicer(2));
  19. team.addMembers(new Magicer(2));
  20. team.addMembers(new Soldier(100));
  21. System.out.println("数组长度为:"+team.role.length);
  22. // for(int i=0;i<team.role.length;i++){
  23. // System.out.println(i+"team.role[i]");
  24. // }
  25. // team.addMembers(new Soldier(10));
  26. // team.addMembers(new Soldier(10));
  27. // team.addMembers(new Soldier(10));
  28. // team.addMembers(new Soldier(10));
  29. // team.addMembers(new Soldier(10));
  30. // team.addMembers(new Soldier(10));
  31. int num=team.attackSum();
  32. System.out.println("总伤害为:"+num);
  33. }
  34. }


—————在上述代码基础之上完成以下需求——封装、继承、多态、接口—————————


创建Role接口,包含两个方法:
1)int attack(); 表示攻击,返回值表示对敌人的伤害
2)void practise(); 表示练习。练习之后对敌人的伤害会增加

6:Role接口

  1. package com.project.gameInterface;
  2. public interface Role {
  3. int attack();
  4. void practise();
  5. }

创建NamedRole类,该类为一个抽象类,实现了Role 接口,并有两个属性:
1)name:角色的名字
2)age:角色的年龄

7:NamedRole抽象类

  1. package com.project.gameInterface;
  2. public abstract class NamedRole implements Role{
  3. private String name;
  4. private int age;
  5. public NamedRole() {
  6. }
  7. public NamedRole(String name, int age) {
  8. this.name = name;
  9. this.age = age;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public int getAge() {
  18. return age;
  19. }
  20. public void setAge(int age) {
  21. this.age = age;
  22. }
  23. }

增加MagicStick接口。该接口表示法师使用的法杖。接口中包含一个方法:
1)int fire()

8:MagicStick接口

  1. package com.project.gameInterface;
  2. public interface MagicStick {
  3. int fire();
  4. }

为MagicStick接口增加两个实现类,分别为GreenStick和BlackStick。其中,对于这两个类的fire方法:
1)GreenStick 平时返回1,夏天(6~8月)使用时返回2
2)BlackStic奇数月返回1,偶数月返回2

9:GreenStick类

  1. package com.project.gameInterface;
  2. import java.time.LocalDate;
  3. import java.time.YearMonth;
  4. public class GreenStick implements MagicStick{
  5. LocalDate currentDate = LocalDate.now();
  6. YearMonth yearMonth = YearMonth.from(currentDate);
  7. int month = yearMonth.getMonthValue();
  8. @Override
  9. public int fire() {
  10. System.out.println("当前月份: " + month);
  11. if(month>=6&&month<=8){
  12. System.out.println("六月到八月返回2");
  13. return 2;
  14. }else {
  15. System.out.println("非六到八月返回1");
  16. return 1;
  17. }
  18. }
  19. }

10:BlackStick类

  1. package com.project.gameInterface;
  2. import java.time.LocalDate;
  3. import java.time.YearMonth;
  4. public class BlackStick implements MagicStick{
  5. LocalDate currentDate = LocalDate.now();
  6. YearMonth yearMonth = YearMonth.from(currentDate);
  7. int month = yearMonth.getMonthValue();
  8. @Override
  9. public int fire() {
  10. System.out.println("当前月份: " + month);
  11. if(month%2==0){
  12. System.out.println("偶数月返回2");
  13. return 2;
  14. }else{
  15. System.out.println("奇数月返回1");
  16. return 1;
  17. }
  18. }
  19. }

修改Magicer类
1)为法师类增加MagicStick类的属性stick,表示法师使用的法杖
2)让其继承自NamedRole类,并实现attack和practise 功能
3)int attack()返回值为法师的魔法等级(level)*每一级的固定伤害(5)
4)void practise()方法:

    当法师的stick属性为null时,调用 practise则level++
    当法师的stick不为null时,调用practise 方法时,法师的等级level满足:level = level + 1 + stick.fire();即:法师的等级增加为1+stick 属性的fire方法的返回值

11:修改Magicer类

  1. package com.project.gameInterface;
  2. public class Magicer extends NamedRole{
  3. private int magicLevel;
  4. private MagicStick stick;
  5. public Magicer() {
  6. }
  7. public Magicer(int magicLevel,MagicStick stick) {
  8. this.magicLevel = magicLevel;
  9. this.stick=stick;
  10. }
  11. public int getMagicLevel() {
  12. return magicLevel;
  13. }
  14. public void setMagicLevel(int magicLevel) {
  15. this.magicLevel = magicLevel;
  16. }
  17. public MagicStick getStick() {
  18. return stick;
  19. }
  20. public void setStick(MagicStick stick) {
  21. this.stick = stick;
  22. }
  23. public int attack(){
  24. int shanghai=5;
  25. int num=magicLevel*shanghai;
  26. System.out.println("法师攻击伤害值为:"+num);
  27. return num;
  28. }
  29. @Override
  30. public void practise() {
  31. if(stick==null){
  32. magicLevel++;
  33. }else{
  34. magicLevel+=1+stick.fire();
  35. }
  36. System.out.println("法师等级为:"+magicLevel);
  37. }
  38. }

增加Weapon接口,表示战士使用的武器。Weapon接口中定义了两个方法:
1)void setSoldier(Soldier s); 该方法表示设置武器的使用者
2)int fire(); 该方法的返回值表示战士使用该武器时,对敌人的伤害值

12:Weapon接口

  1. package com.project.gameInterface;
  2. public interface Weapon {
  3. //表示战士使用的武器
  4. void setSoldier(Soldier s);
  5. int fire();
  6. }

为 Weapon 增加两个实现了,Bolo,表示大刀,Pike,表示长矛
1)当 soldier 的年龄大于等于 18 岁时,fire 方法返回 100
2)当 soldier 年龄小于 18 岁时,fire 方法返回 50

13:Bole类

  1. package com.project.gameInterface;
  2. public class Bolo implements Weapon{
  3. //大刀实现类
  4. @Override
  5. public void setSoldier(Soldier s) {
  6. if(s.getAge()>=18){
  7. int a=fire();
  8. System.out.println("大于18返回值为"+a);
  9. }else {
  10. int b=fire1();
  11. System.out.println("小于18返回值为"+b);
  12. }
  13. }
  14. @Override
  15. public int fire() {
  16. return 100;
  17. }
  18. public int fire1() {
  19. return 50;
  20. }
  21. }

Pike:Pike 类有一个属性:name,表示长矛的名字
1)当长矛的名字和战士的名字一致时,fire 方法返回 1000
2)当长矛的名字和战士的名字不一致时,fire 方法返回 25

14:Pick类

  1. package com.project.gameInterface;
  2. public class Pick implements Weapon{
  3. //长矛实现类
  4. private String name;
  5. public Pick() {
  6. }
  7. public Pick(String name) {
  8. this.name = name;
  9. }
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. @Override
  17. public void setSoldier(Soldier s) {
  18. if(s.getName().equals(name)){
  19. int a=fire();
  20. System.out.println("名字相等时为:"+a);
  21. }else{
  22. int b=fire1();
  23. System.out.println("名字不相等时为:"+b);
  24. }
  25. }
  26. @Override
  27. public int fire() {
  28. return 1000;
  29. }
  30. public int fire1() {
  31. return 25;
  32. }
  33. // public int fire() {
  34. // if(soldier.getName().equals(name)){
  35. // System.out.println("名字相等时为:"+1000);
  36. // return 1000;
  37. // }else {
  38. // System.out.println("名字不相等时为:"+25);
  39. // return 25;
  40. // }
  41. //
  42. // }
  43. }

修改 Soldier 类
1)为 Soldier 类增加一个 Weapon 属性,表示战士的武器
2)让其继承自 NamedRole 类,并实现 attack 和 practise 功能。其中

    Soldier 的 attack() 返回值为战士的 hurt 值与武器的 fire()返回值的 和,即:总攻击输出 = 战士的徒手伤害值 + 武器的伤害值
    practise()方法:每调用一次则战士的 hurt 值+10

15:修改Soldirer类

  1. package com.project.gameInterface;
  2. import sun.security.mscapi.SunMSCAPI;
  3. public class Soldier extends NamedRole {
  4. private Weapon weapon;
  5. private String name;
  6. private int age;
  7. private int attackDamage;
  8. public Soldier() {
  9. }
  10. public Soldier(String name) {
  11. this.name = name;
  12. }
  13. public Soldier(int age) {
  14. this.age = age;
  15. }
  16. public Soldier(String name, int age, int attackDamage) {
  17. this.name = name;
  18. this.age = age;
  19. this.attackDamage = attackDamage;
  20. }
  21. public Soldier(Weapon weapon, String name, int age, int attackDamage) {
  22. this.weapon = weapon;
  23. this.name = name;
  24. this.age = age;
  25. this.attackDamage = attackDamage;
  26. }
  27. public Soldier(String name, int age, Weapon weapon, String name1, int age1, int attackDamage, int sum) {
  28. super(name, age);
  29. this.weapon = weapon;
  30. this.name = name1;
  31. this.age = age1;
  32. this.attackDamage = attackDamage;
  33. this.sum = sum;
  34. }
  35. public Weapon getWeapon() {
  36. return weapon;
  37. }
  38. public void setWeapon(Weapon weapon) {
  39. this.weapon = weapon;
  40. }
  41. public String getName() {
  42. return name;
  43. }
  44. public void setName(String name) {
  45. this.name = name;
  46. }
  47. public int getAge() {
  48. return age;
  49. }
  50. public void setAge(int age) {
  51. this.age = age;
  52. }
  53. public int getAttackDamage() {
  54. return attackDamage;
  55. }
  56. public void setAttackDamage(int attackDamage) {
  57. this.attackDamage = attackDamage;
  58. }
  59. @Override
  60. public void practise() {
  61. attackDamage+=10;
  62. }
  63. int sum=0;
  64. public int attack() {
  65. if (weapon instanceof Bolo){
  66. weapon=new Bolo();
  67. if(age>18){
  68. sum = attackDamage + weapon.fire();
  69. System.out.println("战士攻击伤害值为:" + sum);
  70. }else {
  71. sum = attackDamage + ((Bolo) weapon).fire1();
  72. System.out.println("战士攻击伤害值为:" + sum);
  73. }
  74. return sum;
  75. }else {
  76. weapon=new Pick("张三");
  77. Pick p=(Pick)weapon;
  78. if(p.getName().equals(name)){
  79. sum=attackDamage+weapon.fire();
  80. System.out.println("战士攻击伤害值为:" + sum);
  81. }else {
  82. sum=attackDamage+((Pick) weapon).fire1();
  83. System.out.println("战士攻击伤害值为:" + sum);
  84. }
  85. return sum;
  86. }
  87. }
  88. }

16:测试类Test

  1. package com.project.gameInterface;
  2. public class Test {
  3. public static void main(String[]args){
  4. // BlackStick b=new BlackStick();
  5. // GreenStick g=new GreenStick();
  6. // int num=g.fire();
  7. // System.out.println(num);
  8. // System.out.println(b.fire());
  9. Magicer magicer=new Magicer(10,new BlackStick());
  10. magicer.practise();
  11. Magicer m=new Magicer(10,new GreenStick());
  12. m.practise();
  13. // Magicer mg=new Magicer(10,);
  14. // mg.practise();
  15. System.out.println("_______________________________________");
  16. Weapon b=new Bolo();
  17. b.setSoldier(new Soldier(20));
  18. Weapon pick=new Pick("张三");
  19. pick.setSoldier(new Soldier("张三"));
  20. pick.setSoldier(new Soldier("李四"));
  21. System.out.println("-------------------------------------");
  22. Soldier soldier=new Soldier(new Bolo(),"张三",120,10);
  23. new Bolo().setSoldier(new Soldier(17));
  24. soldier.practise();
  25. soldier.practise();
  26. soldier.practise();
  27. soldier.attack();
  28. new Bolo().setSoldier(new Soldier(20));
  29. soldier.attack();
  30. System.out.println("--------------------------------");
  31. Soldier soldier1=new Soldier(new Pick("张三"),"张三",18,10);
  32. new Pick("李四").setSoldier(new Soldier("张三"));
  33. soldier1.practise();
  34. soldier1.practise();
  35. // new Pick("张三").fire();
  36. soldier1.attack();
  37. Soldier soldier2=new Soldier(new Pick("张三"),"张三",18,10);
  38. new Pick("张三").setSoldier(new Soldier("张三"));
  39. soldier1.attack();
  40. }
  41. }

基本功能已经实现,可能会有部分功能可以编译运行,但是运行结果有误,不会报错

下面是原题

谢谢你的观看

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号