创建战斗依赖的数据结构

/**
* 角色属性
*/
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阵营胜利

战斗逻辑 - demo的更多相关文章

  1. HTML5 网页 漂浮窗广告 JavaScript逻辑 - demo

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. iOS 为何使用runtime方法交换多次后却能按照交换顺序依次执行代码逻辑?

    题目: 假设我们有一个ViewController, Category A(ViewController), Category B(ViewController), Category C(ViewCo ...

  3. 初步配置基于Struts的maven的Web项目demo

    1.创建mavenweb项目 eclipse | Idea 中创建maven项目,具体步骤PASS. 2.导入Struts2核心架包 Idea中在maven项目上,选择ADD FRAMEWORK ec ...

  4. 安卓电量优化之AlarmManager使用全部解析

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.AlarmManager概述 AlarmManager是安卓系统中一种系统级别的提示服务,可以在我们设定时间或者周期性的执行一个intent,这 ...

  5. 银联在线支付B2C UnionPay.NET

    新春即将来临,首先给大家拜个早年,祝攻城狮们新年快乐.万事如意.合家欢乐.团团圆圆.幸福健康.来年更能大展宏图 实现各自的梦想! 同时预祝各大科技公司大佬们事业蒸蒸日上.公司转型突破创新.冲出突围带领 ...

  6. django模型中, 外键字段使用to_filed属性 指定到所关联主表的某个字段

    在django项目的开发过程中,在设计模型时一开始将主键设置成了一个自定义的字段,但是在创建搜索索引时却发现必须要存在一个id的字段,并且为主键(不知道是否是项目一开始就这样配置的原因), 但此时表结 ...

  7. MVC之一、预备知识储备

    自动属性 隐式类型 对象初始化器与集合初始化器 匿名类 扩展方法 Lambda表达式 (1).自动属性(Auto-Implemented Properties) C#自动属性可以避免原来这样我们手工声 ...

  8. 使用Magicodes.SwaggerUI快速配置SwaggerUI以及设置API分组

    Magicodes.SwaggerUI 快速配置和集成SwaggerUI 特点 通过配置文件简单配置即可完成SwaggerUI的API格式JSON生成和集成 支持API分组和隐藏 支持自定义页面和验证 ...

  9. Java注解【四、自定义注解】

    语法要求.元注解 元注解: Target-适用范围: Retention-类型:源码注解.编译时注解.运行时注解 Inherited-可继承(只能继承类上的注解,接口.类中的方法都不行) Docume ...

随机推荐

  1. Cocos2d-x shader学习1: 灰度shader

    灰度shader 最近在学习shader,就把cocos2d-x 3.x版本中的很简单也很常用的灰度shader拿出来学习一下. #ifdef GL_ES precision mediump floa ...

  2. mysql中的一些操作语句,留存

    CREATE TABLE `poision` ( `username` varchar(20) NOT NULL , `nowtime` varchar(50) NOT NULL , `poision ...

  3. 在Ubuntu Linux下制作Windows 启动安装 USB盘

    最近想 ,在Ubuntu上刻录个windows的安装U盘,在网上看了些资料,不过好多都说的很模糊,于是乎,我走了不少弯路.这里记录下来,希望了帮到大家. 首先你的有个USB吧,这里我们假定USB在ub ...

  4. Visual Studio 2017十五项新功能体验

    Visual Studio 2017正式已经于2017.3.7号正式发布,选在这一天发布也是为了纪念Visual Studio 二十周年.MVP 2017技术峰会将于这个周末(3.17)在北京举办,由 ...

  5. PHP数据访问基础知识(20161028)

    数据访问 动态页面的特征:能够读取数据库,网页的内容都是从数据库读出来的,而不是写死的 所有的程序归根结底都是对数据的增删改查 如何用服务器的PHP来操作服务器的MySQL,Apache则是用来管理, ...

  6. c#进程之间对象传递方法

    1. 起源 KV项目下载底层重构升级决定采用独立进程进行Media下载处理,以能做到模块复用之目的,因此涉及到了独立进程间的数据传递问题. 目前进程间数据传递,多用WM_COPYDATA.共享dll. ...

  7. 重磅消息:微信小程序支持长按二维码进入

    之前微信小程序一般通过以下入口进入: 而用户经常使用“长按二维码”识别应用的功能一直未开放,据酷客多了解,微信安卓6.5.6内测版已经支持长按二维码识别和进入小程序,意味着把小程序二维码分享给朋友,或 ...

  8. warning: in-class initialization of non-static data member is a C++11 extension [-Wc++11-extensions]

    struct test{int a=1111111; }test; vincentdeMacBook-Air:datasturte vincent$ g++ struct.cpp -o structp ...

  9. fis-plus 学习笔记

    学习了一些fls-plus前端集成的东西:学的很皮毛,很多都是对官网的解释希望与大家分享,并能得到大家的指正. 参考文档:http://oak.baidu.com/fis-plus/document. ...

  10. centos6.7搭建DHCP服务器

    centos6.7搭建DHCP服务 2017-03-24 09:47:16 系统环境: centos6.7 安装之前首先使用rpm –qa | grep dhcp查看系统中是否已安装了dhcp软件包. ...