简  介

人工智能(Artificial Intelligence) ,英文缩写为AI。它是研究、开发用于模拟、延伸和扩展智能的理论、方法、技术及应用系统的一门新的技术科学。本篇从严格意义上说属于人工智能的范畴,但也是基础中的基础。本篇的目的是要赋予小球解散和集合两项基本指令(智商),本篇内容中相关算法适用于子弹追踪等塔防类游戏当中。

基础类

二维向量(2D vector)可谓2D游戏或是动画里最常用型别了。这里二维向量用Vector2类实现,用(x, y)表示。 Vector2亦用来表示空间中的点(point),而不另建类。先看代码:

varVector2=function(x, y) {

this.x= x || 0;

this.y= y || 0;

};

Vector2.prototype= {

set: function(x, y) {

this.x= x;

this.y= y;

return this;

},

sub: function(v) {

return new Vector2(this.x - v.x, this.y - v.y);

},

multiplyScalar: function(s) {

this.x *= s;

this.y *= s;

return this;

},

divideScalar: function(s) {

if (s) {

this.x /= s;

this.y /= s;

} else {

this.set(0, 0);

}

return this;

},

length: function() {

return Math.sqrt(this.lengthSq());

},

normalize: function() {

return this.divideScalar(this.length());

},

lengthSq: function() {

return this.x * this.x + this.y * this.y;

},

distanceToSquared: function(v) {

vardx=this.x - v.x,

dy=this.y - v.y;

return dx * dx + dy * dy;

},

distanceTo: function(v) {

return Math.sqrt(this.distanceToSquared(v));

},

setLength: function(l) {

return this.normalize().multiplyScalar(l);

}

};

window.Vector2= Vector2;

} (window));

使用该类需要特别注意和区分的地方是:

它什么时候代表点、什么时候代表向量。

当其代表向量的时候,它的几何意义是什么?

不能把其当成一个黑盒来调用,需要知其然并知其所以然。

在下面的使用的过程当中,我会特别标注其代表点还是向量;代表向量时,其几何意义是什么?

给小球赋予智商,顾名思义需要小球类:

(function(window) {

varBall=function(r, v, p, cp) {

this.radius= r;

this.velocity= v;

this.position= p;

this.collectionPosition=cp

}

Ball.prototype= {

collection: function(v) {

thisthis.velocity= this.collectionPosition.sub(this.position).setLength(v)

},

disband: function() {

this.velocity=newVector2(MathHelp.getRandomNumber( - 230, 230), MathHelp.getRandomNumber( - 230, 230))

}

}

window.Ball= Ball

} (window));

其中

小球拥有4个属性,分别是:radius半径、velocity速度(Vector2)、position位置(Vector2)、collectionPosition集合点/小球的家(Vector2)。

小球拥有2个方法,分别是:collection集合、disband解散。

小球的集合方法所传递的参数为集合的速度,因为小球都有一个集合点的属性,所以这里不用再传入集合点/家给小球。

这里详细分析一下collection方法,这也是整个demo的关键代码。

collection: function (v) {

thisthis.velocity=this.collectionPosition.sub(this.position).setLength(v);

},

因为setLength设置向量的长度:

setLength: function (l) {

return this.normalize().multiplyScalar(l);

}

所以collection可以改成:

thisthis.velocity= this.collectionPosition.sub(this.position).normalize().multiplyScalar(v);

normalize是获取单位向量,也可以改成:

this.collectionPosition.sub(this.position).divideScalar(this.length()).multiplyScalar(v);

整个Vector2黑盒就全部展现出来,其整个过程都是向量的运算,代表含义如下所示:

this.collectionPosition

.sub(this.position) 获取小球所在位置指向小球集合位置的向量;

.divideScalar(this.length()) 得到该向量的单位向量;

.multiplyScalar(v); 改变该向量的长度。

最后把所得到的向量赋给小球的速度。

上面我们还是用到了解散方法,其过程是帮小球生成一个随机速度,用到了MathHelp类的一个静态方法:

(function (window) {

varMathHelp= {};

MathHelp.getRandomNumber=function(min, max) {

return (min + Math.floor(Math.random() * (max - min + 1)));

}

window.MathHelp= MathHelp;

} (window));

粒子生成

写了Vector2、Ball、MathHeper三个类之后,终于可以开始实现一点东西出来!

varps= [],

balls= [];

function init(tex) {

balls.length=0;

ps.length=0;

cxt.clearRect(0, 0, canvas.width, canvas.height);

cxt.fillStyle="rgba(0,0,0,1)";

cxt.fillRect(0, 0, canvas.width, canvas.height);

cxt.fillStyle="rgba(255,255,255,1)";

cxt.font="bolder 160px 宋体";

cxt.textBaseline='top';

cxt.fillText(tex, 20, 20);

//收集所有像素

for (y=1; y

for (x=1; x

imageData=cxt.getImageData(20 + x, 20 + y, 1, 1);

mageData.data[0]>170) {

ps.push({

px: 20 + x,

py: 20 + y

})

}

}

};

cxt.fillStyle="rgba(0,0,0,1)";

cxt.fillRect(20, 20, canvas.width, canvas.height);

//像素点和小球转换

for (var i in ps) {

varball=newBall(2, new Vector2(0, 0), new Vector2(ps[i].px, ps[i].py), new Vector2(ps[i].px, ps[i].py));

balls.push(ball);

};

cxt.fillStyle="#fff";

for (i in balls) {

cxt.beginPath();

cxt.arc(balls[i].position.x, balls[i].position.y, balls[i].radius, 0, Math.PI * 2, true);

cxt.closePath();

cxt.fill();

}

//解散:生成随机速度

for (var i in balls) {

balls[i].disband();

其中分三个步骤:收集所有像素、 像素点和小球转换、生成随机速度。整个demo我们需要一个loop:

vartime=0;

varcyc=15;

vara=80;

varcollectionCMD=false;

setInterval(function() {

cxt.fillStyle="rgba(0, 0, 0, .3)";

cxt.fillRect(0, 0, canvas.width, canvas.height);

cxt.fillStyle="#fff";

time += cyc;

for (var i in balls) {

if (collectionCMD=== true && balls[i].position.distanceTo(balls[i].collectionPosition)<

{

balls[i].velocity.y=0;

balls[i].velocity.x=0;

CMD=true;

for (var i in balls) {

balls[i].collection(230);

}

}

if (time=== 7500) {

time=0;

collectionCMD=false;

or (var i in balls) {

balls[i].velocity.y * cyc / 1000;

balls[i].position.x += balls[i].velocity.x * cyc / 1000;

}

},

cyc);

这里使用time整体控制,使其无限loop。ps:这里还有一点不够OO的地方就是应当为ball提供一个draw方法。

其中的balls[i].position.distanceTo(balls[i].collectionPosition) 代表了点与点之间的距离,这里判断小球是否到了集合点或家。这里其几何意义就不再向量了。

在线演示

请移步原文

人工智能html5背景,HTML5人工智能基础及实践相关推荐

  1. html5实践开发教程,HTML5基础与实践教程

    HTML5基础与实践教程 语音 编辑 锁定 讨论 上传视频 <HTML5基础与实践教程>是2010年4月机械工业出版社出版的图书,作者是云翔,刘猛猛,欧阳植昊. 书    名 HTML5基 ...

  2. html5游戏开发-零基础开发《圣诞老人送礼物》小游戏

    开言: 以前lufy前辈写过叫"html5游戏开发-零基础开发RPG游戏"的系列文章,在那里面我学习了他的引擎以及了解了游戏脚本.自从看了那几篇文章,我便对游戏开发有了基本的认识. ...

  3. 用html5做一个介绍自己家乡的页面_(近万字)一篇文章带你了解HTML5和CSS3开发基础与应用-适合前端面试必备...

    作者 | Jeskson来源 | 达达前端小酒馆 HTML5和CSS3开发基础与应用,详细说明HTML5的新特性和新增加元素,CSS3的新特性,新增加的选择器,新的布局,盒子模型,文本,边框,渐变,变 ...

  4. 人工智能python自学教程-人工智能基础教程:Python篇(青少版)

    人工智能基础教程:Python篇(青少版) 编辑推荐 源代码及PPT下载:https://pan.baidu.com/s/1mWa2fy457fhUXKxT-FgyPw 哈工智诚在线编程云平台:htt ...

  5. 人工智能之数学基础篇—线性代数基础(上)

    人工智能之数学基础篇-线性代数基础(上) 1 向量 1.1 标量 1.2 向量 1.3 向量的两个基本运算 1.3.1 向量的加法 1.3.2 向量的数乘 1.4 向量与数据 2 矩阵 2.1 矩阵的 ...

  6. html5游戏开发-零基础开发RPG游戏-开源讲座(三)-卷轴对话实现

    前两篇,RPG的开发已经实现了添加地图和添加游戏人物,本篇来实现地图的卷轴滚动和人物对话的实现,效果如下 想要了解前两篇内容,请电击下面的链接 html5游戏开发-零基础开发RPG游戏-开源讲座(一) ...

  7. html 5音乐界面控制,使用按钮控制HTML5背景音乐开关

    演示:使用按钮控制HTML5背景音乐开关 你的浏览器不支持audio标签. $("#audio_btn").click(function() { var music = docum ...

  8. 人工智能在饿了么的应用实践

    人工智能在饿了么的应用实践 2017-11-08  张浩  AI前线  作者 | 张浩编辑 | Vincent AI 前线导语:大部分人都点过外卖,外卖也逐渐成为了另一种中国特色.每天面对着巨大量级的 ...

  9. 使用按钮控制HTML5背景音乐开关

    <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <meta name ...

最新文章

  1. php按条件修改xml,php如何修改xml内容
  2. Selenium之Android使用学习
  3. 笔记-高项案例题-2015年下-整体管理
  4. linux deepin换源:换成国内镜像源(上海交大镜像源)
  5. 【Linux部署】第一次部署ZooKeeper启动两次报错问题解决 Could not find or load main class+Failed to bind to /0.0.0.0:8080
  6. Python代码加密混淆
  7. stm32程序中的assert_param()的说明
  8. java实验的总结_java实验总结
  9. Atitit.搜索引擎内容来源解决之道
  10. 2019.04.14_16.1 - 17.5
  11. 谭浩强c语言程序设计作业,谭浩强《C语言程序设计》第7章习题解答(13、14题)...
  12. PLSQL导出表结构SQL
  13. Dreammail 下载与安装
  14. 在虚拟机上搭建中标麒麟Neokylin6桌面版开发环境
  15. 苹果将30天无条件退还iPhone改为14天
  16. Base64的编码与解码的实现方法(超详细,每一行代码都含注释)
  17. 背包客旅行札记-html
  18. 360路由器的虚拟服务器设置,360路由器无线万能中继设置教程图解
  19. FFMpeg编译之路
  20. colorUI框架使用教程

热门文章

  1. (OpenCV+Python)--目标跟踪,卡尔曼滤波+鼠标轨迹跟踪
  2. 小程序不用服务器可以上线吗?
  3. nested exception is com.google.gson.JsonSyntaxException: com.google.gson.stream-异常解决!!!
  4. origin ‘http://localhost:8080‘ has been blocked by CORS policy: Request header field platform is not
  5. 令克软件再推OpenAPI与MAS系统服务,强大引擎赋能券商多元化发展
  6. 仿bilibili微信小程序3
  7. 知网提供的“导出与分析”功能来确定论文主题
  8. 【实用工具箱】将CSDN文章内容转成PDF文件实用教程(程序员小技巧)—— 禅与计算机程序设计艺术
  9. Golang中用到的的Websocket库
  10. Quasi_Newton