前不久,崩坏:星穹铁道刚刚上线公测了,我也第一时间体验了这款游戏。在游戏的过程中,我偶然注意到,对局界面的左上角角色行动顺序,似乎和队列的模型比较类似(相同于队列的地方在于从队首选取下一个行动的单位,角色动作完成后重新插入队尾进行排队。不同于队列的地方在于,游戏中拥有拉取我方角色行动优先级和击退敌方角色行动优先级的机制,我们知道,java中的队列是不能插队的)。

于是,我尝试使用list集合,来实现角色行动顺序的维护。 基于此,实现了一个简单的回合制游戏逻辑。

首先,我们把场上所有的角色,设定为统一的Role类的对象,Role类的对象拥有名字、立场、职业、速度、生命值、攻击力等属性。

/*** 己方或敌方的个体对象*/
public class Role {/*** 名字*/private String name;/*** 立场(己方 - self;敌方 - enemy)*/private String standpoint;/*** 职业(不同的职业拥有不同的属性和技能)* 1、丰饶:为最低百分比生命值的友方单位回复30%的血量* 2、同谐:随机指定友方单位在自身行动结束后紧随行动* 3、毁灭:单体伤害,150%自身攻击力的输出* 4、智识:群体伤害,70%自身攻击力的输出*/private String profession;/*** 速度(决定了开局的攻击顺序)*/private BigDecimal speed;/*** 攻击力*/private int attack;/*** 生命值*/private int HP;/*** 生命值上限*/private int HpMax;...get/set方法
}

根据立场不同,场上角色分为己方和敌方两种,我们创建己方角色类Self和敌方角色类Enemy,均继承Role类。己方角色拥有自己的属性“血量百分比”,计算方式为(当前剩余血量/生命值上限)x100,这是为了在回血时寻找血量最低的角色而使用的;己方全体角色共享战技点,每个单位释放技能需要消耗一点,发动普通攻击恢复一点;同时,己方角色根据职业的不同,释放技能产生不同的效果,我们根据职业,创建对应的技能方法:

1、丰饶:为最低百分比生命值的友方单位回复30%的血量

2、同谐:随机指定友方单位在自身行动结束后紧随行动

3、毁灭:单体伤害,150%自身攻击力的输出

4、智识:群体伤害,70%自身攻击力的输出

/*** 己方的个体对象*/
public class Self extends Role {/*** 战技点:友方单位释放技能需要消耗一点,普通攻击恢复一点*/public static int skillPoint = 5;/*** 当前生命值百分比 ((当前剩余血量/生命值上限)x100)*/private int percentageHP;/*** 普通攻击:单体伤害,100%自身攻击力的输出*/public int normalAttack(Self self, Enemy enemy) {System.out.println(this.getName() + "使用了普通攻击");int residueHP = enemy.getHP() - self.getAttack();return residueHP;}/*** 丰饶职业的技能:为最低百分比生命值的友方单位回复30%的血量** @param self* @param selfList* @param attQueue*/public void fr(Self self, List<Self> selfList, List<Role> attQueue) {List<Self> collect = selfList.stream().sorted((p1, p2) -> p1.getPercentageHP() - p2.getPercentageHP()).limit(1).collect(Collectors.toList());Self selfOne = collect.get(0);selfOne.setHP((int) (selfOne.getHpMax() * 0.3 + selfOne.getHP()));selfOne.setPercentageHP((selfOne.getHP() / self.getHpMax()) * 100);System.out.println("[" + self.getName() + "." + self.getProfession() + "]:" + "释放了技能,为"+ selfOne.getName() + "回复了血量");attQueue.remove(self);attQueue.add(self);}/*** 同谐职业的技能:随机指定友方单位在自身行动结束后紧随行动** @param self* @param selfList* @param attQueue*/public void tx(Self self, List<Self> selfList, List<Role> attQueue) {Random rand = new Random();int nextInt = rand.nextInt(selfList.size());Self selfOne = selfList.get(nextInt);attQueue.remove(self);attQueue.remove(selfOne);attQueue.add(0, selfOne);System.out.println("[" + self.getName() + "." + self.getProfession() + "]:" + "释放了技能,拉取了"+ selfOne.getName() + "的行动条");attQueue.add(self);}/*** 毁灭职业的技能:单体伤害,150%自身攻击力的输出** @param self* @param enemyList* @param attQueue*/public void hm(Self self, List<Enemy> enemyList, List<Role> attQueue) {Enemy enemy = enemyList.get(0);int residueHP = (int) (enemy.getHP() - self.getAttack() * 1.5);enemy.setHP(residueHP);System.out.println("[" + self.getName() + "." + self.getProfession() + "]:" + "释放了技能,对"+ enemy.getName() + "造成了" + self.getAttack() * 1.5 + "的伤害");if (residueHP <= 0) {enemyList.remove(enemy);}attQueue.remove(self);attQueue.add(self);}/*** 智识职业的技能:群体伤害,70%自身攻击力的输出** @param self* @param enemyList* @param attQueue*/public void zs(Self self, List<Enemy> enemyList, List<Role> attQueue) {for (Enemy enemyOne : enemyList) {int residueHP = (int) (enemyOne.getHP() - self.getAttack() * 0.7);enemyOne.setHP(residueHP);}System.out.println("[" + self.getName() + "." + self.getProfession() + "]:" + "释放了技能,对敌方全体造成了"+ self.getAttack() * 0.7 + "的伤害");ListIterator<Enemy> iterator = enemyList.listIterator();while (iterator.hasNext()) {if (iterator.next().getHP() <=0) {iterator.remove();}}attQueue.remove(self);attQueue.add(self);}...get/set方法
}

而敌方的Enemy类,我们简单创建一下:

/*** 敌方的个体对象*/
public class Enemy extends Role {/*** 普通攻击:单体伤害,100%自身攻击力的输出*/public void normalAttack() {System.out.println(this.getName() + "使用了普通攻击");}public void releaseSkill() {System.out.println("[" + this.getName() + "." + this.getProfession() + "]:" + "释放了技能");}}

随后,我们在main方法中创建一个List<Role>代表战场,创建一个List<Self>代表己方所有角色,创建一个List<Enemy>代表敌方所有角色,在List<Role>中将所有角色按照速度降序排列,确定开场攻击顺序。创建whlie循环,每次取集合中的第一个元素发动进攻,对局结束条件为:己方单位或敌方单位全部阵亡。

public static void main(String[] args) {// 创建一个战场环境List<Role> attQueue = new LinkedList<>();List<Self> selfList = createdSelf(attQueue);List<Enemy> enemyList = createdEnemy(attQueue);// 将所有角色按照速度降序排列,确定攻击顺序attQueue.sort((a, b) -> b.getSpeed().compareTo(a.getSpeed()));// 对局结束条件:己方单位或敌方单位全部阵亡while (selfList.size() != 0 && enemyList.size() != 0) {Role role = attQueue.get(0);// 判断当前角色是否死亡if (role.getHP() <= 0) {continue;}// 判断当前角色是己方还是敌方if ("self".equals(role.getStandpoint())) {// 己方角色,先判断战技点是否大于0Self self = (Self) role;if (Self.skillPoint > 0) {// todo 战技点大于0,根据职业的不同,释放技能,并消耗一点战技点Self.skillPoint--;if ("丰饶".equals(self.getProfession())) {self.fr(self, selfList, attQueue);} else if ("同谐".equals(self.getProfession())) {self.tx(self, selfList, attQueue);} else if ("毁灭".equals(self.getProfession())) {self.hm(self, enemyList, attQueue);} else {self.zs(self, enemyList, attQueue);}} else {// 战技点等于0,只能发动普通攻击,并回复一点战技点Enemy enemy = enemyList.get(0);int residueHP = self.normalAttack(self, enemy);enemy.setHP(residueHP);Self.skillPoint++;if (residueHP <= 0) {enemyList.remove(enemy);}}} else {// 敌方角色Enemy enemy = (Enemy) role;if ("毁灭".equals(enemy.getProfession())) {Random rand = new Random();int nextInt = rand.nextInt(selfList.size());Self selfOne = selfList.get(nextInt);int residueHP = (int) (selfOne.getHP() - enemy.getAttack() * 1.3);selfOne.setHP(residueHP);System.out.println("[" + enemy.getName() + "]:发动攻击,对"+ selfOne.getName() + "造成了" + enemy.getAttack() * 1.3 + "的伤害");if (residueHP <= 0) {selfList.remove(selfOne);}attQueue.remove(enemy);attQueue.add(enemy);} else {for (Self selfOne : selfList) {int residueHP = (int) (selfOne.getHP() - enemy.getAttack() * 0.7);selfOne.setHP(residueHP);}System.out.println("[" + enemy.getName() + "]:释放了技能,对己方全体造成了"+ enemy.getAttack() * 0.7 + "的伤害");ListIterator<Self> iterator = selfList.listIterator();while (iterator.hasNext()) {if (iterator.next().getHP() <= 0) {iterator.remove();}}attQueue.remove(enemy);attQueue.add(enemy);}}if (selfList.size() == 0) {System.out.println("己方所有角色全部阵亡,对局结束。");break;} else if (enemyList.size() == 0) {System.out.println("敌方所有角色全部阵亡,对局结束。");break;}}}

基本功能完成后,我们创建出己方和敌方的参战角色,并加入战斗:

/*** 派出己方角色加入到战斗中** @param queue*/private static List<Self> createdSelf(List<Role> queue) {// 己方角色1,白露,丰饶Self self1 = new Self();self1.setName("白露");self1.setStandpoint("self");self1.setProfession("丰饶");self1.setSpeed(BigDecimal.valueOf(3));self1.setAttack(1);self1.setHP(100);self1.setHpMax(100);self1.setPercentageHP(100);self1.setPercentageHP(1);// 己方角色2,布洛妮娅,同谐Self self2 = new Self();self2.setName("布洛妮娅");self2.setStandpoint("self");self2.setProfession("同谐");self2.setSpeed(BigDecimal.valueOf(10));self2.setAttack(10);self2.setHP(75);self2.setHpMax(75);self2.setPercentageHP(100);// 己方角色3,毁灭,爷Self self3 = new Self();self3.setName("爷");self3.setStandpoint("self");self3.setProfession("毁灭");self3.setSpeed(BigDecimal.valueOf(6));self3.setAttack(25);self3.setHP(90);self3.setHpMax(90);self3.setPercentageHP(100);// 己方角色4,智识,姬子Self self4 = new Self();self4.setName("姬子");self4.setStandpoint("self");self4.setProfession("智识");self4.setSpeed(BigDecimal.valueOf(7));self4.setAttack(18);self4.setHP(80);self4.setHpMax(80);self4.setPercentageHP(100);// 创建己方小队List<Self> selfList = new ArrayList<>();selfList.add(self1);selfList.add(self2);selfList.add(self2);selfList.add(self2);// 加入战斗queue.add(self1);queue.add(self2);queue.add(self3);queue.add(self4);return selfList;}/*** 派出敌方角色加入到战斗中** @param queue*/private static List<Enemy> createdEnemy(List<Role> queue) {// 敌方角色1,毁灭,敌人1Enemy enemy1 = new Enemy();enemy1.setName("敌人1");enemy1.setStandpoint("enemy");enemy1.setProfession("毁灭");enemy1.setSpeed(BigDecimal.valueOf(4));enemy1.setAttack(20);enemy1.setHP(85);// 敌方角色2,智识,敌人2Enemy enemy2 = new Enemy();enemy2.setName("敌人2");enemy2.setStandpoint("enemy");enemy2.setProfession("智识");enemy2.setSpeed(BigDecimal.valueOf(5));enemy2.setAttack(14);enemy2.setHP(70);// 创建敌方小队List<Enemy> enemyList = new ArrayList<>();enemyList.add(enemy1);enemyList.add(enemy2);// 加入战斗queue.add(enemy1);queue.add(enemy2);return enemyList;}

开始运行main方法(开始对局):

满是bug的代码居然能运行成功,还是挺开心的。之后有时间了慢慢优化代码,如果各位读者有更好的见解,也欢迎提出来,我们一起提高。

用java搭建一个类似「崩坏:星穹铁道」的简单回合制游戏相关推荐

  1. 崩坏星穹铁道PC、安卓、iOS三端配置要求

    ​崩坏星穹铁道这款游戏已于4月26日上线,但是很多的玩家不知道这个游戏有什么配置要求,今天给大家带来的配置要求一览,想知道有什么配置要求的玩家看看下面给大家带来的具体的介绍吧. 崩坏星穹铁道配置要求 ...

  2. 崩坏星穹铁道电脑版 如何用模拟器在PC上玩崩坏星穹铁道手游教程

    米哈游崩坏系列最新作,大地图箱庭迷宫探索RPG游戏<崩坏:星穹铁道>1.0版本「通往群星的轨道」官宣将于4月23日开启预下载,并于4月26日上午10点正式上线,敬请期待! <崩坏星穹 ...

  3. 【崩坏星穹铁道】仙舟引航罗盘解密c++

    依次输入夹角.星位数和组合 #include <iostream> #include <cmath> using namespace std; int main() {int ...

  4. 数说热点|米哈游新作《崩坏:星穹铁道》今日公测,能否再现原神奇迹?

    游戏玩家们心心念念的米哈游新作<崩坏:星穹铁道>终于问世啦,游戏已于上周日上线PC.安卓.iOS平台开启预下载,今日正式公测."崩坏"系列本就是米哈游的起家游戏,收获了 ...

  5. 使用C++完成一个小型双人对战回合制游戏

    #include<iostream> using namespace std; class hero {public:hero();//基础属性hero(int w = 80, int f ...

  6. 崩坏:星穹铁道私人服务器搭建教程

    准备工具: 一台 Windows 系统服务器 <崩坏:星穹铁道>启动器 <崩坏:星穹铁道>客户端 如果以上各项你都准备好了的话,现在就开始吧! 首先完全解压你的<崩坏:星 ...

  7. 5分钟搭建一个粗粒度「视频去重」系统

    Jupyter Notebook 教程: How to Build a Video Deduplication System 「视频去重」可以在海量的视频数据中实现侵权片段或者删除掉重复冗余的内容 . ...

  8. 【SwiftUI模块】0018、SwiftUI搭建一个类似支付宝中的余额宝余额数字动画效果

    SwiftUI模块系列 - 已更新18篇 SwiftUI项目 - 已更新1个项目 往期Demo源码下载 技术:SwiftUI.SwiftUI3.0.支付宝.余额宝.数字动画 运行环境: SwiftUI ...

  9. 【SwiftUI模块】0032、SwiftUI搭建一个类似抖音评论模块的半页模式 - 底部抽屉

    SwiftUI模块系列 - 已更新32篇 SwiftUI项目 - 已更新3个项目 往期Demo源码下载 技术:SwiftUI.SwiftUI4.0.抖音评论.半页模式.底部抽屉 运行环境: Swift ...

最新文章

  1. Learn OpenGL (五):向量
  2. 勒索病毒一周记:它让我们得到了什么经验教训?
  3. 【量化投资】策略九(聚宽)
  4. 物联网带着诚意扑面而来
  5. 天天象棋 残局闯关 第19关
  6. Got minus one from a read call异常
  7. ArcGIS实验教程——实验十四:空间数据库的建立
  8. java cookie安全_cookie的安全性问题
  9. 【Java Netty】Java NIO position limit capacity 以及 BufferUnderflowException
  10. 与afreez一起学习DSP中浮点转定点运算--浮点数的存储格式
  11. ubuntu安装chrome及firefox
  12. Linux系统下载谷歌浏览器
  13. 80386汇编_进入32位保护模式
  14. C语言实现lagrange theorem拉格朗日定理的算法(附完整源码)
  15. 《拆掉思维里的墙》简评和部分摘录
  16. 选址|如何开一家咖啡店?店铺租金多少合适?
  17. PB 数据窗口数据导入Excel, 如果存在则追加,不存在则创建。
  18. 矩阵的基本性质【转置/求逆/伴随等】
  19. java 线程执行结束_java中怎么判断线程执行完毕
  20. 啊哈添柴挑战Java1826. 顺序输出(简单)

热门文章

  1. 判断语句if以及逻辑运算符
  2. 多个label在view中居中显示
  3. 解决Win10修改hosts文件无法保存问题
  4. C语言typedef详解
  5. 单一职责模式之装饰器模式
  6. 小米9能刷鸿蒙系统吗,超大乌龙之后,网友:小米真的不可能会使用鸿蒙系统吗?...
  7. 狗狗的年龄的python编程_最新的狗狗年龄和人类年龄换算,算算你的爱犬几岁了...
  8. 高层次人才综合服务平台建设方案,人才平台一站式系统开发
  9. mysql全文检索优化_mysql全文检索 实现搜索优化
  10. vue前端常用的三种方式模拟获取数据