战斗逻辑 - 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阵营胜利

转载于:https://www.cnblogs.com/Mdh1991/p/5695250.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值