/**
- 笔记0927
*对象数组起始位置可以初始化几个元素
// 1.功能五 判断队名是否重复2.给队起名;3.队伍建队用flag循环判断是否队伍已满; - 2.功能六 遍历二维数组子元素的方法
*3.Role[] roles = new Role[0];// 建立角色对象数组【只有初始值为0或者初始化元素个数等于数组查高度时采用数组扩容和截取数组;否则用getMax方法获得最大实际长度,增加最后一位赋值给arr[getMax()],删除时顺次移位即可,末位清空,index+1开始
Team teams[] = new Team[0];// 建立队伍对象数组
// 初始化几个角色
public Manager() {//初始化时,可以初始化整个数组若干个元素;
roles = new Role[] { new Magicer("s1", 1), new Magicer("s2", 2), new Magicer("s3", 3), new Magicer("s4", 4),
new Soldier("s5", 50), new Soldier("s6", 60), new Soldier("s7", 70) };
}
4.多态的具体运用
4-1在遍历时,可以父类中用this判断包含关系,进行强转父类this,然后输出,【子类也可以重写父类的方法toString,构成多态输出;】
4-2添加时,类型自动转换,
4-3,修改时判断父类包含子类后,建立子类对象,可以给子类的其他属性进行赋值
4-4查找是否包含子类时,先判断输入种类进行非空判断,然后判断
if (animals[i] instanceof Monkey && role.equals(“猴子”)) {
System.out.println(animals[i].showInfo());
flag= true;
5.用抽象类写父类代码质量会更高些,父类如果用抽象,那么不允许建立对象,实例化对象没有意义;
6.修改子类特有属性,当修改子类属性时,首先instanceof判断属于关系,然后建立对象强转Magicer m=(Magicer)roles[index]; m.setLevel(input.nextInt())最后把修改后的属性重新赋值给数组中元素;roles【index】=m;
7.新名词学习,单一性【在继承关系中,子类只能有一个父类】
8.光标变为十字架取消:alt+shift+a
- */
package cn.kgc.tyl.test0925.game.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
*@author tyl
*@date 2020年9月27日
@version 1.0
* */
/**
*
父类(角色类)
* */
@Setter
@Getter
public class Role {
public Role() {
super();
}
public Role(String name) {
super();
this.name = name;
}
private String name;
public int attack() {return 0;};
public String showInfo() {
return null;
}
// @Override
// public String toString() {//注意是this,不是this.//不可以用Role,Role是类,用this代替当前类的对象;
// String msg="";
// if (this instanceof Magicer) {//在多态条件下存在继承关系,可以在父类中通过强制转换,输出子类信息;
// Magicer m=(Magicer)this;
// msg="魔法师,姓名"+m.getName()+",魔法等级"+m.getLevel()+",攻击值"+m.attack();
// }else if (this instanceof Soldier){
// Soldier s=(Soldier)this;
// msg="战士,姓名"+s.getName()+",体魄"+s.getMul()+",攻击值"+s.attack();
// }
// return msg;
// }
// 单一职责原则,父类创建对象没有意义,在子类中写输出语句;showinfo或者重写toString
}
**********************************************************************
package cn.kgc.tyl.test0925.game.entity;
import lombok.ToString;
/**
*
* 子类(魔法师类)
*/
@ToString
public class Magicer extends Role {
private int level;// 魔法等级(范围为 1 ~ 10)
public int getLevel() {
return level;
}
public void setLevel(int level) {
if (level > 10 || level < 0) {
this.level = 1;
} else {
this.level = level;
}
}
@Override
public int attack() {
return getLevel() * 5;
}
public Magicer() {
super();
}
public Magicer(String name, int level) {
super(name);
this.level = level;
}
public String showInfo() {
return "魔法师,姓名" + getName() + ",魔法等级" + getLevel() + ",攻击值" + attack();
}
}
*************************************************************************************************************************
package cn.kgc.tyl.test0925.game.entity;
import lombok.NoArgsConstructor;
import lombok.ToString;
/**
*
子类(战士类)
* */
@ToString
@NoArgsConstructor
public class Soldier extends Role {
private int mul;//体魄
public int getMul() {
return mul;
}
public void setMul(int mul) {
if (mul>100||mul<0) {
this.mul =10;
}else {
this.mul = mul;
}
}
public Soldier(String name,int mul) {
super(name);
this.mul = mul;
}
@Override//该方法返回战士的攻击对敌人造成的伤害值
public int attack() {
return getMul()*10;
}
public String showInfo() {
return "战士,姓名" + getName() + ",体魄" + getMul() + ",攻击值" + attack();
}
}
***************************************************************************************************8
package cn.kgc.tyl.test0925.game.entity;
import java.util.Arrays;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
*
* 队伍类【每队最多五人;】
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Team {
private String tName;// 队名
private Role[] ms;// 队伍数组含队员
}
******************************************************************************
package cn.kgc.tyl.test0925.game.manager;
import java.util.Arrays;
/**
*1.注意下标越界问题,删除时从index+1开始,因为index=i-1>=0;所以 i=index+1开始
2.审题一定要仔细,比如更改时,题目要求名字修改成功后是否修改等级,体魄;小功能未完全实现;
3.一旦进行封装,用setget方法防止非法传参,在有参构造方法中一定要调用set方法;
* */
import java.util.Scanner;
import cn.kgc.tyl.test0925.game.entity.Magicer;
import cn.kgc.tyl.test0925.game.entity.Role;
import cn.kgc.tyl.test0925.game.entity.Soldier;
import cn.kgc.tyl.test0925.game.entity.Team;
public class Manager {
Role[] r = new Role[100];
Team[] ts = new Team[0];// 建立队伍对象数组;
/**
*
* 初始化方法
*/
public void initial() {
r[0] = new Magicer("玛丽", 5);
r[1] = new Soldier("老唐", 2);
r[2] = new Soldier("李阳", 3);
}
/**
*
* 菜单的操作方法
*/
int choice = 0;// 选项
int result = 0;// 方法返回的结果;
public void menu() {
Scanner input = new Scanner(System.in);
System.out.println("欢迎使用远哥法师和战士组队游戏管理操作系统\n1.添加角色\n2.查询角色\n3.删除角色\n4.修改角色\n5.组队\n6.查询队伍\n0.退出\n请选择>>");
choice = input.nextInt();
switch (choice) {
case 1:
add();
break;
case 2:
query();
break;
case 3:
del();
break;
case 4:
modify();
break;
case 5:
addTeam();
break;
case 6:
queryTeam();
break;
case 0:
System.out.println("输入0确认退出,按其他键继续进行");
String ans = "";
exit(ans);
break;
default:
System.out.println("请选择正确功能编号>>>");
break;
}
menu();
}
/**
*
* 获取最大长度;
*/
public int getMax() {
int max = 0;
for (int i = 0; i < r.length; i++) {
if (r[i] == null) {
max = i;
break;
}
}
return max;
}
/**
*
* 获取下标;
*/
public int getIndex(String name) {
int index = -1;
for (int i = 0; i < r.length; i++) {
if (r[i] != null&&name.equals(r[i].getName())) {
index = i;
break;//找到就停止
}
}
return index;
}
/**
*
* 名字是否重名
*/
public boolean isNameExists(String name) {
boolean flag = true;// 假设名字不存在;
for (int i = 0; i < r.length; i++) {
if (r[i] != null && r[i].getName().equals(name)) {
flag = false;// 名字已存在;
}
}
return flag;
}
/**
* 添加方法
*/
public void add() {
System.out.println("选择类型1.魔法师2战士");
Scanner input = new Scanner(System.in);
int choice = input.nextInt();
if (choice == 1) {
Magicer m = new Magicer();
System.out.println("角色名");
String name = input.next();
boolean flag = isNameExists(name);
if (!flag) {
System.out.println("该角色已存在,添加失败");
} else {
m.setName(name);
System.out.println("魔法等级");
m.setLevel(input.nextInt());
r[getMax()] = m;
System.out.println("添加成功");
query();
}
} else if (choice == 2) {
Soldier s = new Soldier();
System.out.println("角色名");
String name = input.next();
boolean flag = isNameExists(name);
if (!flag) {
System.out.println("该角色已存在,添加失败");
} else {
s.setName(name);
System.out.println("体魄");
s.setMul(input.nextInt());
r[getMax()] = s;
System.out.println("添加成功");
query();
}
} else {
System.out.println("没有您输入添加角色的类型,添加失败");
}
}
/**
* 查询方法
*/
public void query() {
System.out.println("当前队员信息有,");
for (int i = 0; i < r.length; i++) {
if (r[i] != null) {
System.out.println((i + 1) + "," + r[i].showInfo());
}
}
}
/**
* 删除方法
*/
public void del() {
int index = -1;// 不能初始化为0,数组中本身存在,否则每次删除都是把第一位元素删除
System.out.println("删除的名字");
Scanner input = new Scanner(System.in);
String name = input.next();
boolean flag = isNameExists(name);
if (flag) {
System.out.println("名字不存在,删除失败");
} else {
index = getIndex(name);
r[index] = null;
// for (int i = index; i < getMax()-1; i++) {//删除从0开始时就会失败,下标越界;开始从index+1;
// r[i]=r[i+1];
// }
// r[getMax()-1]=null;// 这种是按id删除的方式,按编号删除; 【此种方法针对id形式删除】
System.out.println("删除成功");
query();
}
}
/**
* 修改方法【缺陷,功能实现不完整】
*/
public void modif2() {
System.out.println("请选择角色职业1战士2魔法师");
Scanner input = new Scanner(System.in);
int choice = input.nextInt();
if (choice == 1) {
Soldier s = new Soldier();
System.out.println("请输入要修改的角色名称,");
String name = input.next();
boolean flag = isNameExists(name);
if (flag) {
System.out.println("您输入的名字不存在,修改失败");
} else {
System.out.println("请确认是否修改名称y/n");
String ans = input.next();
if (ans.equals("y")) {
System.out.println("请输入新的昵称");
String name2 = input.next();
boolean flag2 = isNameExists(name2);
if (flag2) {
System.out.println("该昵称可用");
for (int i = 0; i < r.length; i++) {
if (r[i] != null && r[i].getName().equals(name)) {
r[i].setName(name2);// 此时还可以修改魔法值等信息
}
}
System.out.println("修改成功");
query();
} else {
System.out.println("您输入的名字已存在,修改失败");
}
} else {
System.out.println("您已取消修改,修改失败");
}
}
} else if (choice == 2) {
Magicer m = new Magicer();
System.out.println("请输入要修改的角色名称,");
String name = input.next();
boolean flag = isNameExists(name);
if (flag) {
System.out.println("您输入的名字不存在,修改失败");
} else {
System.out.println("请确认是否修改名称y/n");
String ans = input.next();
if (ans.equals("y")) {
System.out.println("请输入新的昵称");
String name2 = input.next();
boolean flag2 = isNameExists(name2);
if (flag2) {
System.out.println("该昵称可用");
for (int i = 0; i < r.length; i++) {
if (r[i] != null && r[i].getName().equals(name)) {
r[i].setName(name2);
}
}
System.out.println("修改成功");
query();
} else {
System.out.println("您输入的名字已存在,修改失败");
}
} else {
System.out.println("您已取消修改,修改失败");
}
}
} else {
System.out.println("没有该游戏类型的角色,修改失败");
}
}
/**
* 修改方法必须用instanceof进行判断否则不能修改子类的属性找到下标后不能给子类的特有属性赋值
*/
public void modify() {// 添加修改都必须先建立对象,
Role role = new Role();
System.out.println("角色名称");
Scanner input = new Scanner(System.in);
String inputName = input.next();
boolean flag1 = isNameExists(inputName);
if (flag1) {
System.out.println("角色名称不存在,修改失败");
return;
}
int index = getIndex(inputName);// 此时名字存在,获得其下标
role = r[index];// 如果存在,获得的下标赋值给该角色;
System.out.println("输入y确定修改角色名字");
String ans = input.next();
if (!ans.equalsIgnoreCase("y")) {
System.out.println("您已取消修改,修改失败");
return;
}
System.out.println("输入修改后的名字");
String name = input.next();
boolean flag = isNameExists(name);
if (!flag) {
System.out.println("当前名字已重复,修改失败");
return;
}
r[index].setName(name);
System.out.println("修改名字成功");
// 名字修改成功后再判断子类类型,修改子类的特殊属性
if (role instanceof Magicer) {// 修改子类特有属性,先判断是否属于,然后强转,最后把修改后的对象赋值给新建的对象
Magicer m =( Magicer)role;
System.out.println("输入y确定修改魔法等级");
String ans2 = input.next();
if (!ans.equalsIgnoreCase("y")) {
System.out.println("您已取消修改,修改失败");
return;
}
System.out.println("输入修改后的魔法等级");
int level=input.nextInt();
m.setLevel(level);
r[index]=m;//这一步必须写,否则没有改变原有数组的值;把修改后的赋值给数组;
System.out.println("修改魔法等级成功");
query();
} else if (role instanceof Soldier) {
Soldier s = (Soldier)role;
System.out.println("输入y确定体魄");
String ans2 = input.next();
if (!ans.equalsIgnoreCase("y")) {
System.out.println("您已取消修改,修改失败");
return;
}
System.out.println("输入修改后的体魄");
s.setMul(input.nextInt());
r[index]=s;//这一步必须写,否则没有改变原有数组的值;把修改后的赋值给数组;
System.out.println("修改体魄成功");
query();
}
}
/**
* 队伍名称判断是否重名
*
*/
public int isTNameExists(String tName) {
int index = -1;
for (int i = 0; i < ts.length; i++) {
if (ts[i] != null & ts[i].getTName().equals(tName)) {
index = i;
}
}
return index;
}
/**
*
* 组队的方法
*/
public void addTeam() {// 添加首先就应该建立对象
Team team=new Team();
System.out.println("请输入队伍名称");//1判断队名是否重复2.给队起名;3.队伍建队用flag循环判断是否队伍已满;
Scanner input = new Scanner(System.in);
String tname = input.next();
int index=isTNameExists(tname);
if (index==-1) {
System.out.println("队伍名已存在,添加失败");
return;
}
team.setTName(tname);//名字不存在,可添加
Role[]ms=new Role[0];
boolean flag=true;
query();//从角色的对象数组中添加人员;
while (flag) {
System.out.println("请选择添加队员的序号");
int num=input.nextInt();
Role role=r[num-1];//相当于数组中的r[index]
for (int i = 0; i < ms.length; i++) {
if (role.getName().equals(ms[i].getName())) {
System.out.println("添加的名字已存在,添加失败");
flag=false;
return;
}
}
ms=Arrays.copyOf(ms, ms.length+1);
ms[ms.length-1]=role;
System.out.println("输入y选择继续添加");
String ans=input.next();
if (ans.equals("y")) {
if (ms.length<=4) {//没满可继续添加
flag=true;
}else {
System.out.println("队员已满,无法继续添加");
flag=false;
}
}else {
System.out.println("取消添加,队伍已建成");
flag=false;
}
team.setMs(ms);
ts = Arrays.copyOf(ts, ts.length + 1);
ts[ts.length - 1] = team;
System.out.println("队伍添加成功,您添加的队名是:" + team.getTName() + "队员信息是:");
for (int i = 0; i < ms.length; i++) {
System.out.println((i + 1) + "." + ms[i]);
}
}
}
/**
*
* 查询所有队伍的方法
*/
public void queryTeam() {
if (ts.length <=0) {
System.out.println("当前没有队伍,查询失败");
return;
}
System.out.println("当前的队伍信息是:");
for (int i = 0; i < ts.length; i++) {
if (ts[i] != null) {
System.out.println("第" + (i + 1) + "个队伍的名字是" + ts[i].getTName() + "\n成员是:");
for (int j = 0; j < ts[i].getMs().length; j++) {
System.out.println((j+1)+ts[i].getMs()[j].showInfo() );
}
}
}
}
/**
* 退出的方法
*
*/
public void exit(String ans) {
Scanner input = new Scanner(System.in);
ans = input.next();
if (ans.equals("0")) {
System.out.println("感谢使用,远哥欢迎你再次到来");
System.exit(0);
} else {
menu();
}
}
}
*************************************************************************************************
package cn.kgc.tyl.test0925.game.test;
import cn.kgc.tyl.test0925.game.manager.Manager;
/**
*
测试类
* */
public class TestManager {
public static void main(String[] args) {
Manager m=new Manager();
m.initial();
m.menu();
}
}