目标:战斗系统完善,只需录入战斗的俩个角色即可开始战斗:
- 1.对战时血量清零战斗结束,公布获胜角色。
- 2.角色为单独模板,有自己的技能,与技能消耗。有自己的属性
- 3.战斗系统只需录入双方角色即可
- 4.玩家对战时,如果蓝量不足,系统自动转换为普通攻击
一.角色通用模板设计
父类:属性为:角色姓名,血量与蓝量。设立攻击抽象方法与技能抽象方法。
/**
* @Title: FightingGame
* @Author itmei
* @Package com.mumu.dome712
* @Date 2024/7/12 15:43
* @description: 格斗游戏里的人物类
*/
public abstract class Role {
//游戏人物名
private String name;
//血量
private int hp = 100;
//蓝条
private int blueDose =100;
public int getBlueDose() {
return blueDose;
}
public void setBlueDose(int blueDose) {
this.blueDose = blueDose;
}
public Role(String name, int hp, int blueDose) {
this.name = name;
this.hp = hp;
this.blueDose = blueDose;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHp() {
return hp;
}
public void setHp(int hp) {
this.hp = hp;
}
public abstract int attack(int nmb);
public abstract int skill(int hp,int a);
}
1.乔峰 角色设计
继承角色模板,设置自己的攻击属性,重写父类攻击方法,与技能方法。
由于游戏有几率暴击,所以设置了普通攻击能产生暴击,产生暴击的方式可以通过随机数的放入随机产生暴击。
通过传入蓝量从而可以使用技能 、
/**
* @Title: QiaoFeng
* @Author itmei
* @Package com.mumu.dome712.zuoye1
* @Date 2024/7/12 15:52
* @description: 游戏人物之一乔峰
*/
public class QiaoFeng extends Role {
int atk =6;
public QiaoFeng(String name, int hp, int blueDose) {
super(name, hp, blueDose);
}
/**
*
* @param maht 随机数放入,如果是1则可以暴击
* @return
*/
@Override
public int attack(int maht) {
int atk1 = this.atk;
if (maht==1){
System.out.println("乔峰开始攻击了");
System.out.println("乔峰攻击出现了暴击,给予对手造成了"+atk1*2+"点伤害。");
return (atk1*2);
}else {
System.out.println("乔峰开始攻击了,给予对手造成了"+atk1+"点伤害。");
return atk1;
}
}
@Override
public int skill(int mp,int a) {
int atk1=this.atk;
System.out.println("乔峰消耗了50点内力。使用了自己的技能:降龙十八掌,给对手造成了"+atk1*3+"的伤害。");
return atk1*3;
}
}
2.鸠摩智 角色设计
继承角色模板,设置自己的攻击属性,重写父类攻击方法,与技能方法。
由于游戏有几率暴击,所以设置了普通攻击能产生暴击,产生暴击的方式可以通过随机数的放入随机产生暴击。
通过传入蓝量从而可以使用技能
/**
* @Title: JiuMoZhi
* @Author itmei
* @Package com.mumu.dome712.zuoye1
* @Date 2024/7/12 16:17
* @description: 游戏人物2-鸠摩智
*/
public class JiuMoZhi extends Role {
int atk = 4;
public JiuMoZhi(String name, int hp, int blueDose) {
super(name, hp, blueDose);
this.atk = atk;
}
/**
*
* @param math 随机数放入,如果是1或2则可以暴击
* @return
*/
@Override
public int attack(int math) {
int atk1 = this.atk;
if (math == 1 || math == 2) {
System.out.println("鸠摩智开始攻击了");
System.out.println("鸠摩智攻击出现了暴击,给予对手造成了" + atk1 * 2 + "点伤害。");
return atk1 * 2;
} else {
System.out.println("鸠摩智开始攻击了,给予对手造成了" + atk1 + "点伤害。");
return atk1;
}
}
@Override
public int skill(int mp, int a) {
int atk1 = this.atk;
System.out.println("鸠摩智消耗了50点内力。使用了自己的技能:火焰刀,给对手造成了" + atk1 * 3 + "的伤害。");
return atk1 * 3;
}
}
二.战斗系统设计
1.攻击方式的选择
/**
*
* @param character 输入对象,判断名字
* 选择攻击方式的方法
*/
public void say(Role character) {
System.out.println("请选择" + character.getName() + "的攻击方式。");
System.out.println("1.普通攻击。");
System.out.println("2.使用技能。");
}
2.战斗系统综合性设计
战斗判断逻辑:
攻击逻辑为回合制: 当一方攻击完毕后,另一方开始攻击,不断循环:一方血量归零则游戏结 束,即循环结束
血量是否为0:
血量为0或小于0:宣布获胜角色,结束此程序
血量大于0:选择攻击方式:普通攻击或放技能
蓝量与回蓝判断:
当使用普通攻击时,判断角色此刻回蓝有没有超过回蓝上限,如果超过则自动回复到最大蓝量
如果没有超过,则正常回蓝。
使用技能时:先判断蓝量是否足够,如果足够则正常放技能。且回蓝正常
如果不足够:则调用普工攻击方法,正常回蓝。
/**
*
* @param character1 角色1
* @param character2 角色2
*/
public void Battle(Role character1, Role character2) {
Random random = new Random();
Scanner input = new Scanner(System.in);
//乔峰的血量和蓝量
int hp1 = character1.getHp();
int mp1 = character1.getBlueDose();
//鸠摩智的血量和蓝量
int hp2 = character2.getHp();
int mp2 = character2.getBlueDose();
//乔峰每回合能增加的蓝量
int addmp1 = 15;
//鸠摩智每回合能增加的蓝量
int addmp2 = 20;
while (hp1 > 0 && hp2 > 0) {
//定义俩个随机数,为随机暴击的数
int math = random.nextInt(10);
int math2 = random.nextInt(10);
//乔峰开始攻击,选择攻击方式
this.say(character1);
//输入1.2来选择攻击方式
int nmb = input.nextInt();
System.out.println("乔峰开始攻击了");
//用if判断是使用普通攻击还是技能
if (nmb == 1) {
//攻击到鸠摩智,鸠摩智血量下降
hp2 = hp2 - character1.attack(math);
//每回合自动回蓝,判断乔峰的蓝量有没有超过蓝量上限。
if (mp1 > 0 && mp1 < 85) {
mp1 = mp1 + 15;
} else {
mp1 = character1.getBlueDose();
}
System.out.println("此时" + character2.getName() + "还剩" + hp2 + "的血量");
System.out.println("此时" + character1.getName() + "还剩" + mp1 + "的蓝量");
System.out.println("");
//判断对手血量是否小于等于0
if (hp2 <= 0) {
System.out.println(character1.getName() + "ko了" + character2.getName());
System.out.println("恭喜乔峰获得了胜利。");
System.exit(0);
}
} else if (nmb == 2) {
//先判断乔峰此时蓝量是否够使用技能
if (mp1 < 50) {
//乔峰蓝量不足,无法发动技能,自动普通攻击
System.out.println("对不起,内力不足,乔峰无法发动技能。");
character1.attack(math);
mp1 = mp1 + 15;
System.out.println("此时" + character2.getName() + "还剩" + hp2 + "的血量");
System.out.println("此时" + character1.getName() + "还剩" + mp1 + "的蓝量");
System.out.println("");
//判断对手血量是否小于等于0
if (hp2 <= 0) {
System.out.println(character1.getName() + "ko了" + character2.getName());
System.out.println("恭喜乔峰获得了胜利。");
break;
}
} else {
//乔峰蓝量足以发动技能
//攻击到鸠摩智,鸠摩智血量下降
hp2 = hp2 - character1.skill(mp1, math);
//乔峰开始回蓝
mp1 = mp1 - 50 + 15;
System.out.println("此时" + character2.getName() + "还剩" + hp2 + "的血量");
System.out.println("此时" + character1.getName() + "还剩" + mp1 + "的蓝量");
System.out.println("");
//判断对手血量是否小于等于0
if (hp2 <= 0) {
System.out.println(character1.getName() + "ko了" + character2.getName());
System.out.println("恭喜乔峰获得了胜利。");
break;
}
}
}
//鸠摩智开始攻击,选择攻击方式
this.say(character2);
//输入1.2来选择攻击方式
int nmb2 = input.nextInt();
System.out.println("鸠摩智开始攻击了");
//用if判断是使用普通攻击还是技能
if (nmb2 == 1) {
//攻击到乔峰,乔峰智血量下降
hp1 = hp1 - character1.attack(math2);
//每回合自动回蓝,判断乔峰的蓝量有没有超过蓝量上限。
if (mp1 > 0 && mp2 < 80) {
mp2 = mp2 + 20;
} else {
mp2 = character2.getBlueDose();
}
System.out.println("此时" + character1.getName() + "还剩" + hp1 + "的血量");
System.out.println("此时" + character2.getName() + "还剩" + mp2 + "的蓝量");
System.out.println("");
//判断对手血量是否小于等于0
if (hp1 <= 0) {
System.out.println(character2.getName() + "ko了" + character1.getName());
System.out.println("恭喜鸠摩智获得了胜利。");
break;
}
} else if (nmb2 == 2) {
//先判断鸠摩智此时蓝量是否够使用技能
if (mp2 < 50) {
//鸠摩智蓝量不足,无法发动技能,自动普通攻击
System.out.println("对不起,内力不足,鸠摩智无法发动技能。");
character2.attack(math2);
mp2 = mp2 + 20;
System.out.println("此时" + character1.getName() + "还剩" + hp1 + "的血量");
System.out.println("此时" + character2.getName() + "还剩" + mp2 + "的蓝量");
System.out.println("");
//判断对手血量是否小于等于0
if (hp1 <= 0) {
System.out.println(character2.getName() + "ko了" + character1.getName());
System.out.println("恭喜鸠摩智获得了胜利。");
break;
}
} else {
//鸠摩智蓝量足以发动技能
//攻击到乔峰,乔峰血量下降
hp1 = hp1 - character2.skill(mp1, math2);
//鸠摩智开始回蓝
mp2 = mp2 - 50 + 25;
System.out.println("此时" + character1.getName() + "还剩" + hp1 + "的血量");
System.out.println("此时" + character2.getName() + "还剩" + mp2 + "的蓝量");
System.out.println("");
//判断对手血量是否小于等于0
if (hp1 <= 0) {
System.out.println(character2.getName() + "ko了" + character1.getName());
System.out.println("恭喜鸠摩智获得了胜利。");
break;
}
}
}
}
}
三.测试
创建角色对象,调用战斗系统开始游玩。
import java.util.Random;
/**
* @Title: Test
* @Author itmei
* @Package com.mumu.dome712.zuoye1
* @Date 2024/7/12 16:44
* @description: 测试类
*/
public class Test {
public static void main(String[] args) {
Random random =new Random();
Role qiaofeng =new QiaoFeng("乔峰",100,100);
Role jiumozhi =new JiuMoZhi("鸠摩智",100,100);
CombatSystem combatSystem =new CombatSystem();
System.out.println("游戏即将开始。");
combatSystem.Battle(qiaofeng,jiumozhi);
}
}