【Java实例】-王者荣耀RPG-从设计思路到代码实现
前言
嗨!这位看官,欢迎你的到来!本作是一个有关Java知识的小游戏案例,一起来看看吧 ^ _ ^
以下是本篇文章正文内容,下面案例可供参考
一、案例分析
1. 设计理念
学习的目的是为了掌握知识并最终运用到实践中,因此在学习一段时间后便需要对所学知识进行整合。
而对于Java知识来说,最好的整合方式便是用所学知识进行自由设计。
某在平时十分喜欢王者荣耀这款手游,于是便有了这个RPG版本的王者小游戏。
2. 功能设计
(1)登录与注册
某希望在这个程序中实现对进入王者荣耀时登录界面的简单模拟,这里对登录的原理进行简要分析:
首先,因为这只是一个小游戏,不使用申请代理等高级操作,所以要有对应的文档来存储账号信息。
在进入游戏时会弹出输入账号密码的提示操作,在执行完相关操作后,程序根据输入的数据与文档中的数据进行比对,预计出现以下情况:
- 账号密码无误–>登陆成功,进入游戏界面
- 账号错误–>输入账号与文档中数据比对不同,说明该用户未注册,返回“账号有误,请先注册”提示
- 密码错误–>输入账号正确,通过第一次比对,而在比对密码时出现不同,这时返回“密码错误”提示
其次,在登录失败后用户有两个选择,一是退出游戏,二是进行账号注册。
账号注册便是将用户输入的账号与密码以键值对的形式存储进创建的文档中,用以登录时程序执行比对操作。
(2)游戏时间记录
王者荣耀这款手游被玩家广为吐槽的一点便是它的健康时间限制,其功能是在后台记录自玩家登陆账号之后的时间,在其到达限制时间后对该账号进行强制下线的操作。
某在设计这款小游戏时,也对该功能进行了模拟。
实现该功能的方法非常简单:
- 在完成登录操作之后,获取当前的时间,将其转化为毫秒值存储入文档中
- 新建一个方法,用来读取实时时间,转化为毫秒值之后与初始毫秒值作差,最后转换格式将时间输出
(3)选择游戏模式
原版手游有着丰富的游戏模式,而在此练习之作中只需要模拟训练营模式作单机游戏即可。
在此模块之后,本作将会频繁用到switch-case的多分支选择结构,在某看来,该结构简直是RPG类游戏制作必备程序运行的不二之选。
在这里的“实战对抗”只是一个空壳,连同在下面的英雄技能攻击,伤害计算模块,装备商店模块都将留作以后进行续作。
而关于“实战对抗”的构想如下:
- 在下面会设有专门的英雄模块,而每个英雄会有其技能,实战对抗便是随机一名英雄做对手,其技能也是随机释放,这里预计会使用到Random类。
- 初始金钱固定,必须经过刷野或者击败小兵获得金钱收益,用来在装备商店购买装备。
- 装备为技能提供属性加成,英雄技能可升级,升级需要获得经验值,经验值由击败野怪或者小兵产出。
本作的主要模式便是“训练营模式”,有关设计如下:
- 攻击对象仅有小兵和野怪。
- 初始金钱随机。
(4)游戏地图
在此某模拟三类场景,并分别设置场景通道和触发对象
- 泉水–>通向野区
- 野区–>通向泉水和交战区,场景特有对象为野怪
- 交战区–>交战或返回泉水,场景特有对象为小兵
(5)生物属性
为了使小游戏更加还原手游,生物的属性面板的展示是必不可少的。
在此只需要为每个生物定义属性项目,并将其封装成标准类即可。
- 小兵(攻击,防御,血量,敏捷)
- 野怪(攻击,防御,血量,敏捷)
还有必不可少的英雄类,在这里某选择了“鲁班七号”和“吕布”两个英雄,你也可以根据你的喜好修改其他英雄。
- 鲁班七号(攻击,防御,血量,敏捷)
- 吕布(攻击,防御,血量,敏捷)
当然,这里的数据数值是可以根据个人喜好自行修改的。
二、程序实现
这是某的程序列表,这里用的环境是IDEA
1.生物属性模块
首先来构造最简单的生物属性模块。这里用到了封装的相关知识。
- 小兵的标准描述类
package Role;
public class littleSoldier {
private int attack;//攻击
private int defense;//防御
private int HP;//血量
private int agile;//敏捷
public littleSoldier(int attack, int defense, int HP, int agile) {
this.attack = attack;
this.defense = defense;
this.HP = HP;
this.agile = agile;
}
public littleSoldier() {
}
public int getAttack() {
return attack;
}
public void setAttack(int attack) {
this.attack = attack;
}
public int getDefense() {
return defense;
}
public void setDefense(int defense) {
this.defense = defense;
}
public int getHP() {
return HP;
}
public void setHP(int HP) {
this.HP = HP;
}
public int getAgile() {
return agile;
}
public void setAgile(int agile) {
this.agile = agile;
}
}
- 野怪的标准描述类
package Role;
public class wildMonster {
private int attack;//攻击
private int defense;//防御
private int HP;//血量
private int agile;//敏捷
public wildMonster(int attack, int defense, int HP, int agile) {
this.attack = attack;
this.defense = defense;
this.HP = HP;
this.agile = agile;
}
public wildMonster() {
}
public int getAttack() {
return attack;
}
public void setAttack(int attack) {
this.attack = attack;
}
public int getDefense() {
return defense;
}
public void setDefense(int defense) {
this.defense = defense;
}
public int getHP() {
return HP;
}
public void setHP(int HP) {
this.HP = HP;
}
public int getAgile() {
return agile;
}
public void setAgile(int agile) {
this.agile = agile;
}
}
- 鲁班七号的标准描述类
package Role;
public class LuBanQiHao {
private int attack;//攻击
private int defense;//防御
private int HP;//血量
private int agile;//敏捷
public LuBanQiHao() {
}
public LuBanQiHao(int attack, int defense, int HP, int agile) {
this.attack = attack;
this.defense = defense;
this.HP = HP;
this.agile = agile;
}
public int getAttack() {
return attack;
}
public void setAttack(int attack) {
this.attack = attack;
}
public int getDefense() {
return defense;
}
public void setDefense(int defense) {
this.defense = defense;
}
public int getHP() {
return HP;
}
public void setHP(int HP) {
this.HP = HP;
}
public int getAgile() {
return agile;
}
public void setAgile(int agile) {
this.agile = agile;
}
}
- 吕布的标准描述类
package Role;
public class LvBu {
private int attack;//攻击
private int defense;//防御
private int HP;//血量
private int agile;//敏捷
private int LEVEL;//等级
public LvBu() {
}
public LvBu(int attack, int defense, int HP, int agile) {
this.attack = attack;
this.defense = defense;
this.HP = HP;
this.agile = agile;
}
public int getAttack() {
return attack;
}
public void setAttack(int attack) {
this.attack = attack;
}
public int getDefense() {
return defense;
}
public void setDefense(int defense) {
this.defense = defense