两个阵营互打的回合制游戏
两个阵营互打的回合制游戏
- 定义一个游戏生物基类(Sprite)
- 下面有4种继承:英雄(Hero),远程-弓箭手(Archer),哥布林(Goblin),远程-哥布林投矛手(GoblinHunter)
- 共有的属性:名字(name),等级(lv),生命(hp),攻击力(atk),防御力(defense),攻速(speed),暴击(cri率),立场(Stand)对应(红方=Red,蓝方Blue),远程、近程(range)对应(近战=Near,远程=Far)
- 把4个角色都定义接口叫IFighter
- 加入角色可以进行自动战斗,攻速为每多少回合攻击一次,每回合都有机会产生暴击(暴击=伤害*2),战斗采用回合制,每个回合角色都有一次攻击机会,对打优先打对方近战类,当近战类死了再打远程
- 设定X回合,战斗过程输出文字战报
1.写一个基类也就是父类Sprite
public abstract class Sprite {protected String name;protected int lv;protected int hp;protected int maxhp;protected int atk;protected int defense;protected int speed;protected double cri;protected StandEnum stand;protected RangeEnum range;protected StatusEnum status;protected int count = 0;public Sprite(String name, int lv, int maxhp, int atk, int defense, int speed, double cri, StandEnum stand, RangeEnum range) {this.name = name;this.lv = lv;this.maxhp = maxhp;this.hp = this.maxhp;this.atk = atk;this.defense = defense;this.speed = speed;this.cri = cri;this.stand = stand;this.range = range;this.status = StatusEnum.NORMAL;}/***战斗的处理函数*/public void fighting(IFighter enemy) {int damage = this.atk;//伤害值boolean isCritical = Math.random() < cri;//比随机数大,说明暴击生效。比随机数小,说明暴击没生效enemy.damage(damage, isCritical);//将伤害值和暴击率传入伤害计算函数内this.status = StatusEnum.CD;//攻击完后,进入CD状态,无法攻击}/***计算伤害值*/public int damage(int damage, boolean isCritical) {//讲伤害值和暴击传入damage = damage - defense;//伤害值减去防御值得到最终伤害damage = damage > 0 ? damage : 0;//伤害值大于0时,等于伤害值,伤害值不大于0时,等于0if (isCritical) {//暴击生效damage *= 2;//暴击值System.out.println(name + "被暴击");}hp = hp - damage;//被攻击后,剩余生命值if (hp <= 0) {hp = 0;this.status = StatusEnum.DIE;//当血量小于0时,属于死亡状态System.out.println(name + "阵亡");}System.out.println("[" + name + "]受到伤害:" + damage + " (" + hp + "/" + maxhp + ")");return hp;//返回角色血量}/*** 每回合更新一次角色状态*/public void update() {count++;//每回合自增一次,用来和CD时间做比较if (this.status == StatusEnum.DIE)return;//当角色死亡时,直接返回if (count >= speed) {//判断CD时间好了没this.status = StatusEnum.NORMAL;//正常状态,可以攻击count = 0;//初始值为0}}public StatusEnum getStatus() {return status;}public void setStatus(StatusEnum status) {this.status = status;}public StandEnum getStand() {return stand;}public void setStand(StandEnum stand) {this.stand = stand;}public RangeEnum getRange() {return range;}public void setRange(RangeEnum range) {this.range = range;}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 =Math.max(0, hp);}public int getLv() {return lv;}public void setLv(int lv) {this.lv = lv;}public int getAtk() {return atk;}public void setAtk(int atk) {this.atk = atk;}public int getMaxhp() {return maxhp;}public void setMaxhp(int maxhp) {this.maxhp = maxhp;}public int getDefense() {return defense;}public void setDefense(int defense) {this.defense = defense;}public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;}public double getCri() {return cri;}public void setCri(double cri) {this.cri = cri;}
}
写四个子类,也就是要参加战斗的角色
1.Hero子类
public class Hero extends Sprite implements IFighter {public Hero(String name, StandEnum stand, RangeEnum range, int lv) {super(name, lv, 250, 20, 10, 2, 0.4, stand, range);}
}
2.Archer子类
public class Archer extends Sprite implements IFighter {public Archer(String name, StandEnum stand, RangeEnum range, int lv) {super(name, lv, 150, 15, 5, 1, 0.6, stand, range);}
}
3.Goblin子类
public class Goblin extends Sprite implements IFighter {public Goblin(String name, StandEnum stand, RangeEnum range, int lv) {super(name, lv, 250, 20, 10, 2, 0.3, stand, range);}
}
4.GoblinHunter子类
public class GoblinHunter extends Sprite implements IFighter {public GoblinHunter(String name, StandEnum stand, RangeEnum range, int lv) {super(name, lv, 100, 15, 5, 1, 0.7, stand, range);}
}
角色的阵营、近远程、角色状态可以通过枚举列出
5.阵营枚举类
enum StandEnum {RED, BLUE;
}
6.近程、远程枚举类
enum RangeEnum {NEAR,FAR;
}
7.角色状态枚举类----看角色是什么状态
enum StatusEnum {/*** 正常状态,什么都能做*/NORMAL,/*** 蓄力状态*/CD,/*** 已经死亡,不能攻击,不能被攻击*/DIE,
}
8.把角色属性定义接口
public interface IFighter {public String getName();public StandEnum getStand();public StatusEnum getStatus();public RangeEnum getRange();void fighting(IFighter fighter);public void update();
}
9.写一个战场类
import java.util.ArrayList;
import java.util.List;public class BattleField {//定义一个存放角色的list表List<IFighter> fighters;public BattleField() {fighters = new ArrayList<IFighter>();}//向表中添加角色public void add(IFighter fighter) {fighters.add(fighter);}寻找敌人public IFighter searchEnemy(StandEnum enemyStand) {//先寻找近战型的角色for (IFighter fighter : fighters) {//遍历list表if (fighter.getStand() == enemyStand) {//判断传入的enemyStand是否一致if (fighter.getRange() == RangeEnum.NEAR) {//判断是否为近战return fighter;}}}//寻找剩下的角色for (IFighter fighter : fighters) {//遍历list表if (fighter.getStand() == enemyStand) {//判断传入的enemyStand是否一致return fighter;}}return null;}//战斗部分public void startBattle() {int redcounts = 1;//定义红方人数-----1是为了保证能进入循环int bulecounts = 1;//定义蓝方人数int round = 0;//定义回合数while ((redcounts > 0) && (bulecounts > 0)) {//到某一方人数round++;redcounts = 0;bulecounts = 0;System.out.println("\n--[第" + round + "回合]");//寻找敌人进行攻击for (IFighter fighter : fighters) {IFighter enemy;//定义一个IFighter类型的敌人fighter.update();//判断角色是否为攻击状态if (fighter.getStatus() != StatusEnum.NORMAL)//不是正常状态不给攻击continue;if (fighter.getStand() == com.testgame.StandEnum.RED) {//判断传入的角色属于哪一个阵营enemy = searchEnemy(StandEnum.BLUE);//敌人属于另一个阵营} else {enemy = searchEnemy(StandEnum.RED);}if (enemy != null) {//当敌方阵营不为空时System.out.println("[" + fighter.getName() + "]发起攻击!");fighter.fighting(enemy);//开始战斗} else {System.out.println("分出胜负");}}//移除死亡的角色for (int i = fighters.size() - 1; i >= 0; i--) {//倒序移除if (fighters.get(i).getStatus() == StatusEnum.DIE) {fighters.remove(i);}}//计算场上两队状况for (IFighter fighter : fighters) {//寻找红色方if (fighter.getStand() == com.testgame.StandEnum.RED) {//判断角色属于哪方阵营redcounts++;//判断红色方有几人} else if (fighter.getStand() == StandEnum.BLUE) {bulecounts++;//判断蓝色方有几人}}System.out.println("--[第" + round + "回合]红色方还有" + redcounts + "人 " + "蓝色方还有" + bulecounts + "人");}if (redcounts == 0) {//当某一方阵营人数变为0,也就是全部死亡,另一方获胜System.out.println("蓝方胜!!!");} else if (bulecounts == 0) {System.out.println("红方胜!!!");}}
}
10.测试部分
public class testGame {public static void main(String[] args) {Hero hero = new Hero("战士", StandEnum.RED, RangeEnum.NEAR, 1);Archer archer = new Archer("弓箭手", StandEnum.RED, RangeEnum.FAR, 1);Goblin goblin = new Goblin("刺客", StandEnum.BLUE, RangeEnum.NEAR, 1);GoblinHunter goblinHunter = new GoblinHunter("火枪手", StandEnum.BLUE, RangeEnum.FAR, 1);BattleField bf = new BattleField();bf.add(hero);bf.add(goblin);bf.add(archer);bf.add(goblinHunter);bf.startBattle();}
}
.
.
.
运行结果有点长,就不全贴出来了,感兴趣的话,动一下你的小手直接Ctrl + c/v自己Run一下
第一次写博客,有哪里有错误或者可以改进请提出来
谢谢!!!
两个阵营互打的回合制游戏相关推荐
- 今天开始做战斗,回合制战斗代码实现第一篇补充,从头开始,简单的2d回合制游戏一些文档方面的知识
上一篇代码贴完了,总是感觉缺少些东西,因为光看代码用时候不是很直观,我们还是需要些文档来辅助理解.好了,所以补充些内容. 2009 年 8 月,<梦幻西游>同时最高在线人数达到 256 万 ...
- 回合制游戏对战AI制作请重视这两个难点
游戏中的人机对战,"机"这一部分是由两个部分组成的:数值(比如bot数目.血量.命中率.技能cd.攻击力.防御力等等)和AI(人工智能,控制bot行为).很多没入行的朋友经常把这两 ...
- C#实现回合制游戏模拟
文章开始把我喜欢的这句话送个大家:这个世界上还有什么比自己写的代码运行在一亿人的电脑上更酷的事情吗,如果有那就是让这个数字再扩大十倍!!! 底部有下载链接:附带代码.答辩PPT.数据.音乐等素材. 规 ...
- C#大作业——回合制游戏模拟
1>创建一个Hero类特征name(英雄名字),hp(血量),mp(魔法值), physicsAttack(物理攻击力),magicAttack(魔法攻击力) 2>创建一个BattleCo ...
- Unity3D游戏开发之回合制游戏原型的实现
http://blog.csdn.net/qinyuanpei/article/details/28125171 大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是blog.csdn.net/q ...
- C语言模拟回合制游戏 源码
源码下载地址: http://download.csdn.net/detail/monkey_uan/5115921 刚学C的作品,略带稚气,仅供参考学习,版权所有. #include<stdi ...
- 回合制游戏中的活动需要注意的
回合制游戏中的活动 了解一个活动需要以下流程,下面分点阐述. 1. 活动的背景是什么? 游戏中的活动一定要有合理的背景剧情,而且这些背景剧情要和游戏的联系紧密,这样玩家在接触游戏的时候才不会 ...
- 今天开始做战斗,回合制战斗代码实现第一篇,从头开始,简单的2d回合制游戏
拖了这么久,终于弄到战斗系统了,不过仙剑demo的回合制战斗比较复杂,所以我们从最简单的2d回合制游戏战斗开始讨论,看看游戏战斗系统代码什么样子. 还记得回合制战斗的流程图吗,UI的时候我曾经贴过,, ...
- 【Visual C++】游戏开发笔记十六 讲解一个完整的回合制游戏demo
本系列文章由zhmxy555编写,转载请注明出处. 文章链接 http://blog.csdn.net/zhmxy555/article/details/7447864 作者:毛星云 邮箱: ...
最新文章
- 九大网络安全失误,需要注意
- 从hook007学习dll劫持自启动方式
- request和response的setCharacterEncoding()方法
- 一个udp用户数据报的数据字段为8192_基于FPGA的千兆网UDP通信分析
- WPF ComboBox 使用 ResourceBinding 动态绑定资源键并支持语言切换
- java程序员学习路线以及我的学习经验
- java中operationBox_Java使用PDFBox开发包实现对PDF文档内容编辑与保存
- 利用Octave解线性方程组
- 远程桌面连接_Win10 系统远程桌面连接怎么打开
- linux3.10.53编译,根据官方文档在Linux下编译安装Apache
- PHP动态生成select标签
- 【课本】【No.3】随机向量定义、联合分布函数、边缘分布、统计特征的分布函数的差分,独立性、离散型条件分布列,连续型分布函数与密度函数、随机向量的函数分布
- android 中使用svg
- 电脑qq语音连不到服务器,电脑问题:qq语音正常?
- 基于matlab的汉明码信道编码,信道编码仿真.doc
- 康佳电视android,康佳电视怎么连接手机 康佳电视连接手机步骤【图文介绍】
- 【随笔】一个可爱的圆函数模型
- Pytorch:lr_schedule恢复训练的注意事项
- 衡水二中2021清华北大高考成绩查询,衡水二中成为“清华大学2020年优质生源中学”...
- 【计算机基础04】Excel习题