创建战斗依赖的数据结构

/**
* 角色属性
*/
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. apicloud上传图片

    //定义api $("#photo").change(function(){ //获取图片 api.getPicture({ sourceType: 'library', enco ...

  2. HttpClient filter中间转发从A tomcat转发至B tomcat

    BackFilter.java 主要解决基于HttpGet/HttpPost以及基于HttpPost的附件流转发import java.io.IOException; import java.io.I ...

  3. Selenium 显示等待和隐式等待

    1. 设置显示等待 Java代码: 1 2 3 4 5 public static WebElement WaitForElement(WebDriver driver, String locator ...

  4. Struts2自定义拦截器Interceptor以及拦截器登录实例

    1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor ...

  5. angularJS之ng-repeat

    <p>使用 ng-repeat 来循环数组</p>   <ul>     <li data-ng-repeat="x in numArray&quo ...

  6. linux 私房菜 CH6 Linux 的档案权限与目录配置

    查看文件属性 ls -al 第一栏:类型与权限 d:目录: -:档案: l:链接档: b:可随机存取装置: c:一次性存取装置: 第二栏:有多少档名连结到此节点 第三栏:拥有者 第四栏:所属群组 第五 ...

  7. 1-PHP基本概念

    PHP 概念:服务器脚本语言 静态网站:不支持交互的网站(html) 动态网站:支持数据交互的网站 实现动态网站的技术 实现技术 网站后缀 ASP .asp PHP .php .NET .aspx J ...

  8. MySQL入门(上)

    1 课程回顾 自定义标签&编码实战 1)自定义标签步骤: 1.1 编写标签处理器类,继承SimpleTagSupport类,覆盖doTag方法 1.2 在WEB-INF目录下建立tld文件,在 ...

  9. linux上执行 xhost unable to open display

    linux下执行xhost命令报错:unable to open display,解决方法,linux 下通过xhost进入图形界面,经常会出现报错"unable to  open disp ...

  10. CSS中清除浮动的方法

    CSS浮动,最早是为了达到文字环绕的效果提出的,也可以用来做布局,但是布局会产生很多问题(高度塌陷,漂浮在普通流上),会使当前标签产生上浮的效果,会影响前后标签,同样的代码在不同的浏览器的兼容性也不一 ...