创建战斗依赖的数据结构

/**
* 角色属性
*/
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. mac环境,搭建python+selenium遇到的问题

    安装过程: 1.下载安装pip,下载并且解压文件(默认路径即可),打开终端,执行sudo python setup.py install,系统自带python,也可以不安装 2.执行 sudo eas ...

  2. how to use Prolog in C#? SWI-Prolog

    上个月突然看到Prolog这门语言,它特殊的语法吸引了我,但是经过我一段时间的学习,发现它也不像网络上传说的那样神奇,不过我依然对它很感兴趣,有前辈说Prolog本身并不强大,但是用来作为一门辅助语言 ...

  3. React+webpack开发环境的搭建

    首先创建项目,确保该项目已经安装了webpack和webpack-dev-server具体安装方法请参考上章所述. 在上一章说过babel是一个javascript编辑器,在react项目中使用bab ...

  4. TensorBoard:Visualizing Learning 学习笔记

    为了更方便的理解.调试和优化TF程序,我们可以使用TensorBoard(可视化工具).可以使用TensorBoard查看graph,绘制图表执行过程中的定量指标.TensorBoard是完全可配置的 ...

  5. Web API框架学习——路由(一)

    HttpConfiguration(ASP.NET Web API管道的配置是通过HttpConfiguration来完成) : 包括路由注册在内的对整个ASP.NET Web API管道的配置是通过 ...

  6. 《Machine Learning》系列学习笔记之第一周

    <Machine Learning>系列学习笔记 第一周 第一部分 Introduction The definition of machine learning (1)older, in ...

  7. Cannot use ImageField because Pillow is not installed.

    现象描述: 使用 ImageField ,创建数据库表时,提示如下: Cannot use ImageField because Pillow is not installed. HINT: Get ...

  8. java学习笔记 --- 面向对象2

    一.匿名对象 (1)没有名字的对象 (2)应用场景   A:调用方法,仅仅只调用一次的时候. class Car { //描述属性.颜色,轮胎数. String color; int number; ...

  9. iOS开发之UIDevice通知

    UIDevice类提供了一个单例对象,它代表着设备,通过它可以获得一些设备相关的信息,比如电池电量值(batteryLevel).电池状态(batteryState).设备的类型(model,比如iP ...

  10. 开始学习yii2第一天

    今天在朋友圈看到一条转发,内容是根据招聘网站的要求,列举了需要一个php工程师具体需要哪些技能 框架要求是yii2 出现的最多 已经出来工作了快半个月了,感觉工资还是少的可怜,而且我也好想去张江, 所 ...