战斗逻辑 - demo
创建战斗依赖的数据结构
/**
* 角色属性
*/
var a_data = {
_id: 101,
attr: {
// 角色战斗属性
},
skill: [],// 技能数组
isAtk: false,
isDeath: false,
slot: 'a',// 角色所处槽位
};
/**
* 技能属性
*/
var atk = {
_id: 1,
val: 100,// 技能额外伤害
mag: 100,// 技能所需魔法值
};
/**
* 创建战斗所需要的常量
*/
var Const = {
ROUND_A: 10,// 回合状态
ROUND_B: 11,
ATK: 1,// 技能id
ATK2: 2,
ATK3: 3,
};
全局变量(存放角色的容器)
var _set = {}
用于装所有战斗中的角色
创建战斗逻辑
/**
* list: [];// A阵营角色
* list2: [];// B阵营角色
*/
function createBattle(list, list2) {
if (!list || !list.length) return;
if (!list2 || !list2.length) return;
var instruct_set = {// 战斗指令集合
A: [],
B: []
};
var round_state = Const.ROUND_A;// 控制战斗
var a_num = list.length;// A阵营存活角色数量
var b_num = list2.length;// B阵营存活角色数量
var a_count = 0;// A阵营角色攻击次数
var b_count = 0;// B阵营角色攻击次数
/**
* 开始战斗
* 战斗顺序按a,b,c,d,e,f顺序双方交叉执行(A阵营先手)
*/
while(!(a_num <= 0 || b_num <= 0)) {
var lst = [],
lst2 = [],
instruct = {
skill: [],
val: null,
attack: [],
attacked: []
};
if (round_state === Const.ROUND_A) {
lst = list;// 处理list列表
lst2 = list2;
} else {
lst = list2;// 处理list2列表
lst2 = list;
}
var allys = getAlly(lst);// 取攻击角色
var enemys = getEnemy(lst2);// 取被攻击角色
var skill = getSkill(allys);// 攻击角色取技能
var value = calcVal(allys,enemys);// 计算攻击伤害
// 战斗逻辑
if (enemys && enemys.length) {
var a = 0;
var b = 0;
var c = 0;
var d = 0;
// 已方阵营(标记为已攻击)
for (var i = 0; i < allys.length; i++) {
_set[allys[i]].isAtk = true;
a = allys[i];
};
// 敌方阵营(扣血)
for (var i = 0; i < enemys.length; i++) {
_set[enemys[i]].attr.hp -= value[enemys[i]];
b = enemys[i];
c = value[enemys[i]];
d = skill[i];
if (_set[enemys[i]].attr.hp <= 0) {
_set[enemys[i]].isDeath = true;
_set[enemys[i]].isAtk = false;
console.log('/////////////////////')
console.log(b + '死了')
console.log('/////////////////////')
}
};
console.log('***************************************')
console.log('攻击方是:',a)
console.log('被攻击方是:',b)
console.log(a + ' 释放 ' + d + ' 技能扣了 ' + b + ' ' + c + '点血')
console.log('***************************************')
} else {
throw '未取到敌人';
}
// 保存指令
instruct.skill = skill;// 技能id
instruct.val = value;// 伤害值numble
instruct.attack = allys;// 角色id
instruct.attacked = enemys;// 角色id
if (round_state === Const.ROUND_A) {
round_state = Const.ROUND_B;
instruct_set.A.push(instruct);
} else {
round_state = Const.ROUND_A;
instruct_set.B.push(instruct);
}
// 统计(判断战斗是否创建完成)
a_num = 0;
b_num = 0;
a_count = 0;
b_count = 0;
for (var i = 0; i < list.length; i++) {
if (!list[i].isDeath) a_num++;
if (list[i].isAtk) a_count++;
};
for (var i = 0; i < list2.length; i++) {
if (!list2[i].isDeath) b_num++;
if (list2[i].isAtk) b_count++;
};
if (a_count === a_num) reset(list);
if (b_count === b_num) reset(list2);
};
if (!a_num) console.log('战斗结果:B阵营胜利')
if (!b_num) console.log('战斗结果:A阵营胜利')
console.log(instruct_set)
return instruct_set;// null说明某一阵营或两阵营没有角色数据
}
按顺序取A阵营角色
function getAlly(list) {
var list2 = [];
if (!list || !list.length) return list2;
for (var i = 0; i < list.length; i++) {
if (!list[i].isAtk && !list[i].isDeath) {
// 此时与其它角色有技能配合将选取多个角色(否则只选取当前角色)
list2.push(list[i]._id);
return list2;
};
};
return list2;
}
按顺序取B阵营角色
function getEnemy(list) {
var list2 = [];
if (!list || !list.length) return list2;
for (var i = 0; i < list.length; i++) {
// 攻击方群攻技能将选取多个角色
if (list[i].isDeath) {
continue;
} else {
list2.push(list[i]._id);
return list2;
}
};
return list2;
}
按规则取技能
function getSkill(list) {
var list2 = [];
if (!list || !list.length) return list2;
for (var i = 0; i < list.length; i++) {
// 角色id取角色数据
var data = _set[list[i]];
// 判断魔法值是否满了
if (data.attr.adp === 100) {
list2.push(data.skill[Math.floor(Math.random()) + 1]);
} else {
list2.push(data.skill[0]);
}
};
return list2;
}
按规则扣血
function calcVal(list, list2) {
/**
* 需要双方角色战斗属性
*/
var val = {};
if (!list || !list.length) return val;
if (!list2 || !list2.length) return val;
for (var i = 0; i < list2.length; i++) {
val[list2[i]] = Math.floor(Math.random() * 3000);
};
return val;
}
角色isAtk属性重置方法
function reset(list) {
if (!list || !list.length) return;
for (var i = 0; i < list.length; i++) {
list[i].isAtk = false;
};
}
调用createBattle方法后的结果
***************************************
攻击方是: 101
被攻击方是: 201
101 释放 3 技能扣了 201 437点血
***************************************
***************************************
攻击方是: 201
被攻击方是: 101
201 释放 3 技能扣了 101 2473点血
***************************************
***************************************
攻击方是: 102
被攻击方是: 201
102 释放 3 技能扣了 201 2096点血
***************************************
/////////////////////
101死了
/////////////////////
***************************************
攻击方是: 202
被攻击方是: 101
202 释放 3 技能扣了 101 2709点血
***************************************
***************************************
攻击方是: 103
被攻击方是: 201
103 释放 2 技能扣了 201 764点血
***************************************
***************************************
攻击方是: 203
被攻击方是: 102
203 释放 2 技能扣了 102 2646点血
***************************************
***************************************
攻击方是: 102
被攻击方是: 201
102 释放 3 技能扣了 201 322点血
***************************************
***************************************
攻击方是: 201
被攻击方是: 102
201 释放 3 技能扣了 102 340点血
***************************************
/////////////////////
201死了
/////////////////////
***************************************
攻击方是: 103
被攻击方是: 201
103 释放 2 技能扣了 201 2547点血
***************************************
/////////////////////
102死了
/////////////////////
***************************************
攻击方是: 202
被攻击方是: 102
202 释放 3 技能扣了 102 964点血
***************************************
***************************************
攻击方是: 103
被攻击方是: 202
103 释放 2 技能扣了 202 1695点血
***************************************
***************************************
攻击方是: 203
被攻击方是: 103
203 释放 2 技能扣了 103 2927点血
***************************************
***************************************
攻击方是: 103
被攻击方是: 202
103 释放 2 技能扣了 202 407点血
***************************************
***************************************
攻击方是: 202
被攻击方是: 103
202 释放 3 技能扣了 103 2967点血
***************************************
/////////////////////
202死了
/////////////////////
***************************************
攻击方是: 103
被攻击方是: 202
103 释放 2 技能扣了 202 2962点血
***************************************
***************************************
攻击方是: 203
被攻击方是: 103
203 释放 2 技能扣了 103 755点血
***************************************
***************************************
攻击方是: 103
被攻击方是: 203
103 释放 2 技能扣了 203 1518点血
***************************************
/////////////////////
103死了
/////////////////////
***************************************
攻击方是: 203
被攻击方是: 103
203 释放 2 技能扣了 103 929点血
***************************************
战斗结果:B阵营胜利
发恳写代码