战斗逻辑 - 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阵营胜利
战斗逻辑 - demo的更多相关文章
- HTML5 网页 漂浮窗广告 JavaScript逻辑 - demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- iOS 为何使用runtime方法交换多次后却能按照交换顺序依次执行代码逻辑?
题目: 假设我们有一个ViewController, Category A(ViewController), Category B(ViewController), Category C(ViewCo ...
- 初步配置基于Struts的maven的Web项目demo
1.创建mavenweb项目 eclipse | Idea 中创建maven项目,具体步骤PASS. 2.导入Struts2核心架包 Idea中在maven项目上,选择ADD FRAMEWORK ec ...
- 安卓电量优化之AlarmManager使用全部解析
版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.AlarmManager概述 AlarmManager是安卓系统中一种系统级别的提示服务,可以在我们设定时间或者周期性的执行一个intent,这 ...
- 银联在线支付B2C UnionPay.NET
新春即将来临,首先给大家拜个早年,祝攻城狮们新年快乐.万事如意.合家欢乐.团团圆圆.幸福健康.来年更能大展宏图 实现各自的梦想! 同时预祝各大科技公司大佬们事业蒸蒸日上.公司转型突破创新.冲出突围带领 ...
- django模型中, 外键字段使用to_filed属性 指定到所关联主表的某个字段
在django项目的开发过程中,在设计模型时一开始将主键设置成了一个自定义的字段,但是在创建搜索索引时却发现必须要存在一个id的字段,并且为主键(不知道是否是项目一开始就这样配置的原因), 但此时表结 ...
- MVC之一、预备知识储备
自动属性 隐式类型 对象初始化器与集合初始化器 匿名类 扩展方法 Lambda表达式 (1).自动属性(Auto-Implemented Properties) C#自动属性可以避免原来这样我们手工声 ...
- 使用Magicodes.SwaggerUI快速配置SwaggerUI以及设置API分组
Magicodes.SwaggerUI 快速配置和集成SwaggerUI 特点 通过配置文件简单配置即可完成SwaggerUI的API格式JSON生成和集成 支持API分组和隐藏 支持自定义页面和验证 ...
- Java注解【四、自定义注解】
语法要求.元注解 元注解: Target-适用范围: Retention-类型:源码注解.编译时注解.运行时注解 Inherited-可继承(只能继承类上的注解,接口.类中的方法都不行) Docume ...
随机推荐
- mysql数据库开始——增删改
注释语法:#注释语 一.T-SQL语句注意:1.语句写完后用“分号:”代表这一句结束2.列结束用逗号,最后一列写完不用写逗号3.符号一定是英文的 关键字:主键:primary key外键:foreig ...
- wemall app商城源码Android 获取XML网络数据并绑定到ListView
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享Android 获取XML网络数据并绑定到Li ...
- 3389: [Usaco2004 Dec]Cleaning Shifts安排值班
3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 102 Solved: ...
- SEO-百度推出新算法如何应对
> 如何知道百度推出新算法百度推出算法的趋势> 学SEO目的做排名,长流量,赚钱> 最近一年百度搜索变动1> 2012年6月:6/22, 6/28事件,百度地震,4.5%网站被 ...
- AndroidTest工程的自定义gradle task
由于需要将assets目录的资源拷贝到设备sdcard中,然而我的工程是一个android test工程,而android test工程在编译阶段,不会把assets目录的资源打包成对应apk,而为了 ...
- Octave Tutorial(《Machine Learning》)之第五课《控制语句和方程及向量化》
第五课 控制语句和方程 For,while,if statements and functions (1)For loop v=zeros(10,1) %initial vectors for i=1 ...
- 介绍Office 365 中文用户社区 4.0
本文于2017年3月18日首发于LinkedIn,原文链接在这里 为了给广大用户提供一个可以自由交流.切磋技术的平台,微软和其他一些国际知名的大型软件公司一样,都有创建用户社区(Community,或 ...
- mybatis对java自定义注解的使用——入门篇
最近在学习spring和ibatis框架. 以前在天猫实习时做过的一个小项目用到的mybatis,在其使用过程中,不加思索的用了比较原始的一种持久化方式: 在一个包中写一个DAO的接口,在另一个包里面 ...
- SQL AlawaysOn 之一:安装域控制器
一.准备阶段 1. 计算机名称命名 2.IP地址修改.DNS修改 IP地址和DNS不一定要和图上的一致,只要固定就行了 二.安装阶段 1.服务器管理器,仪表盘,点击“添加角色和功能” 2.添加角色和 ...
- Android 5.0(棒棒糖))十大新特性
Android 5.0(棒棒糖))十大新特性 1. 全新Material Design设计风格 Android Lollipop全新的设计语言是受到了多种因素影响,是一种大胆的平面化创新.换句话说,谷 ...