《小冰游戏战斗逻辑详解》原来你也玩。。。
源码
战斗算法
function battleWithMinster(userInfo, monster) {
return new Promise((resolve, reject) => {
let uatk = (userInfo.lv * 10 + (userInfo.equip.arms ? userInfo.equip.arms.atk : 0)) * (userInfo.equip.fire ? userInfo.equip.fire.atk + 1 : 1);
if (userInfo.sect == "云岚宗" && userInfo.bigMap == "魔兽山脉") {
uatk = parseInt(uatk * 1.2);
}
if (checkUserBag(userInfo, "轩辕剑", 1) && monster.lv - userInfo.lv < 20) {
uatk = 99999;
SendMsgToUser(userInfo.name, "触发神器[轩辕剑],本次战斗必定胜利!");
}
let udef = userInfo.lv * 10 + (userInfo.equip.armor ? userInfo.equip.armor.def : 0);
let uhp = userInfo.hp;
let matk = monster.atk;
let mdef = monster.def;
let mhp = monster.hp;
let round = 0;
let isWin = false;
let battleMsg = `一一一${userInfo.name} PK ${monster.name}一一一`;
do {
round++;
let hxyj = Math.random() * 100 > 70;
uhp = uhp - (matk > udef ? matk - udef : 0);
if (hxyj) {
mhp = mhp - (uatk > mdef ? uatk * 2 - mdef : 0);
} else {
mhp = mhp - (uatk > mdef ? uatk - mdef : 0);
}
battleMsg += `<br>round${round}:${userInfo.name}发动攻击,造成${hxyj ? uatk * 2 : uatk}点伤害!${monster.name}HP:${mhp}`;
battleMsg += `<br>${monster.name}发动攻击,造成${matk}点伤害!${userInfo.name}HP:${uhp}`;
} while (uhp > 0 && mhp > 0);
isWin = uhp > 0 ? true : false;
// console.log(battleMsg)
let cb = {
isWin: isWin,
battleMsg: battleMsg,
};
resolve(cb);
});
}
怪物的攻击力算法
if (this.lv - userInfo.lv > 20) {
this.atk = 9999999;
} else if (this.lv - userInfo.lv > 15) {
this.atk = parseInt(this.lv * 20 + 100 * Math.random() * 28 + 4);
} else if (this.lv - userInfo.lv > 10) {
this.atk = parseInt(this.lv * 12 + 50 * Math.random() * 21 + 3);
} else if (this.lv - userInfo.lv > 7) {
this.atk = parseInt(this.lv * 8 + 20 * Math.random() * 14 + 2);
} else if (this.lv - userInfo.lv > 3) {
this.atk = parseInt(this.lv * 7 + 10 * Math.random() * 7 + 1);
} else {
this.atk = parseInt(this.lv * 7);
}
战斗代码分析
以下是小冰战斗代码的详细分析,该函数接受两个参数:
userInfo
:包含用户信息的对象,如等级(lv
)、装备(equip
)、宗门(sect
)、所在地图(bigMap
)等。monster
:包含怪物信息的对象,如攻击力(atk
)、防御力(def
)、生命值(hp
)等。
用户攻击力计算
let uatk = (userInfo.lv * 10 + (userInfo.equip.arms ? userInfo.equip.arms.atk : 0)) * (userInfo.equip.fire ? userInfo.equip.fire.atk + 1 : 1);
这里计算了用户的攻击力(uatk
),它基于用户等级、所持武器的攻击力以及火器的加成。如果用户所属宗门为“云岚宗”且所在地图为“魔兽山脉”,攻击力还会额外提升20%。
轩辕剑效果检查
if (checkUserBag(userInfo, "轩辕剑", 1)) {
uatk = 99999;
SendMsgToUser(userInfo.name, "触发神器[轩辕剑],本次战斗(20级内)必定胜利!");
}
如果用户背包中有“轩辕剑”,并且数量至少为1,则攻击力设定为99999,确保战斗胜利。SendMsgToUser
函数用于向用户发送消息。
防御力和生命值初始化
let udef = userInfo.lv * 10 + (userInfo.equip.armor ? userInfo.equip.armor.def : 0);
let uhp = userInfo.hp;
let matk = monster.atk;
let mdef = monster.def;
let mhp = monster.hp;
初始化用户的防御力(udef
)、生命值(uhp
),以及怪物的攻击力(matk
)、防御力(mdef
)、生命值(mhp
)。
战斗循环逻辑分析
变量初始化
round
:初始化回合数为0。isWin
:初始化胜负标志为false
。battleMsg
:初始化战斗信息字符串,包含用户和怪物的名字。
主循环
do {
round++;
let hxyj = Math.random() * 100 > 70;
uhp = uhp - (matk > udef ? matk - udef : 0);
if (hxyj) {
mhp = mhp - (uatk > mdef ? uatk * 2 - mdef : 0);
} else {
mhp = mhp - (uatk > mdef ? uatk - mdef : 0);
}
// 更新战斗信息
} while (uhp > 0 && mhp > 0);
单轮战斗流程
- 回合递增:
round++
,记录当前战斗回合数。 - 会心一击判定:
hxyj = Math.random() * 100 > 70
,这是一个随机数生成,若生成的随机数大于70,则认为是会心一击,会心一击有30%的概率发生。 - 用户受伤害:用户的生命值
uhp
根据怪物的攻击力matk
和用户的防御力udef
减少。如果matk
大于udef
,则实际受到的伤害为两者之差;否则,伤害为0。 - 怪物受伤害:根据
hxyj
的真假决定怪物是否遭受双倍伤害。如果hxyj
为真(会心一击),则伤害为uatk * 2
减去怪物的防御力mdef
;否则,伤害为uatk
减去mdef
。同样,如果用户攻击力超过怪物防御力,则实际伤害为差值;否则,伤害为0。
总结
从战斗流程中看出,
用户的攻击力(uatk
)、防御力(udef
)、生命值(uhp
),
怪物的攻击力(matk
)、防御力(mdef
)、生命值(mhp
),
这六个值都关乎到你是否能打败怪物历练成功,而不是我们原先设想的简单的攻击力比较;
暂时我还没有怪物的防御力、生命值算法(此处艾特天道 @Yui ),后续拿到了继续更新!
最后的总结就是,大家都是一群高攻低防的脆皮刺客,就不用想着越15级了,老老实实去炼药打工吧!!
最后说一句,轩辕剑真香啊!
新增数值计算
看此贴 《小冰游戏战斗数值计算》
-
游戏
桥豆麻袋,,我不是来摸鱼的?😮 还是说只有我是来摸鱼的。
因为之前缺少数据,没办法看具体情况,现在已经拿到所有数据了,我去算一下
这是为了更好地摸鱼(认真点头)