• 战斗逻辑


    创建战斗依赖的数据结构

    /**
     * 角色属性
     */
    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阵营胜利
    
    发恳写代码
  • 相关阅读:
    【Shell】Shell介绍及常用shell脚本
    【Redis】Redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等
    检查Mysql主从状态
    三种方式获取随机字符串或数字
    Intellij 编译时报 未结束的字符串字面值
    IDEA 远程调试
    kafka操作命令
    maven idea设置查找依赖优先从指定的本地仓库获取
    详解布隆过滤器的原理、使用场景和注意事项
    IDEA查找接口实现类及快速实现接口
  • 原文地址:https://www.cnblogs.com/Mdh1991/p/5695250.html
Copyright © 2020-2023  润新知