战斗逻辑 - 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阵营胜利
posted @ 2016-07-22 15:07  小旋风小王爷  阅读(218)  评论(0编辑  收藏  举报