前言:

08年的时候, 写过一个台球游戏, 用的是java, 不过代码真的是用传说中的神器notepad写的(你信吗? 其实是用GVIM写的, ^_^), 很多类都在同一java文件中编写。 可见当时的JAVA水平真的不咋地, 时过进迁, 还是一样的不咋地。

这边是当时的CSDN下载链接实现比较简单。 后来写过一个版本, 比这个要强大许多, 可惜源码丢失了。

效果展示入下图所示:

本文想讲述下台球游戏中核心算法的实现, 以及游戏AI的设计技巧。 当然自己也有个小愿望, 希望能实现一个html5版的台球游戏。

基础物理知识:

1、摩擦阻力

其满足牛顿第二定律:

f = m * a

速度与加速度关系公式:

vt = v0 + a * t

地面摩擦力与运动物体的方向相反, 阻碍物体的向前运动。

2、动量守恒

假设物体A质量为m1, 速度为v1, 物体B质量为m2, 速度为v2, 碰撞后速度分别为v1', v2'。

则满足动量守恒定律:

m1 * v1 + m2 * v2 = m1 * v1' + m2 * v2'

碰撞类型和能量守恒定律

1)完全弹性碰撞

动能没有损失, 则满足如下公式:

1/2 * m1 * v1^2 + 1/2 * m2 * v2^2 = 1/2 * m1 * v1'^2 + 1/2 * m2 * v2'^2

注: 前后物体的动能保持均衡, 没有其他能量的转化。

结合之前的动量守恒定律, 我们可以进一步得到:

v1' = [(m1-m2) * v1 + 2 * m2 * v2] / (m1 + m2)

v2' = [(m2-m1) * v2 + 2 * m1 * v1] / (m1 + m2)

2)完全非弹性碰撞

则存在其他能量的转化, 动能不守恒。

且此时两物体粘连, 速度一致, 即v1'=v2', 此时动能损失最大。

3)弹性碰撞

介于完全弹性碰撞和完全非弹性碰撞两者之间。 动能有损失的。

物理模型:

台球游戏中, 最核心的就是其物理模型的抽象及其碰撞算法的执行过程了。

鉴于是2D版的台球游戏, 因此我们对物理模型做下简化, 球运动的方向必然穿越球的中心。

把每个台球抽象为圆(x, y, radius), 而台球桌边框抽象为线段((x1, y1), (x2, y2))。

1、碰撞检测

1)检测球与球碰撞

我们假定球A(x1, y1, r), 球B(x2, y2, r)。 则满足条件:

(x1 - x2) ^ 2 + (y1 - y2) ^ 2 <= (2*r) ^ 2

则发生碰撞, 否则没有发生碰撞

2) 检测球与球台边框碰撞

相对比较简单。 求球心到边框的垂直距离即可, 若小于等于则发生碰撞, 若大于则没有。

2、碰撞反应

1)球与球的碰撞反应

动量是向量, 其在正交的两个方向上, 互相守恒。 我们选取两球圆心的直线为x轴, 垂直于圆心直线的为y轴。 如上图所述。

x轴上满足动量守恒:

m1 * Vx + m2 * Ux = m1 * Vx' + m2 * Ux';

并假定两球碰撞是完全弹性碰撞, 两球质量相等m1=m2, 依据基础物理知识篇的结论。

Vx' = [(m1-m2) * Vx + 2 * m2 * Ux] / (m1 + m2) = Ux;

Ux' = [(m2-m1) * Ux + 2 * m1 * Vx] / (m1 + m2) = Vx;

在X轴方向, 两球交换速度, 而在Y轴方向, 两球分速度不变。

Vy' = Vy;

Uy' = Uy;

最终碰撞后的速度公式为:

V' = Vx' + Vy' = Ux + Vy;

U' = Ux' + Uy' = Vx + Uy;

2)球与边框的碰撞反应

把台球边框视为质量无穷大, 则简单把运动的球, 其在垂直边框的分方向反向即可。

假定碰撞碰撞平面为x轴

Vx' = Vx;

Vy' = -Vy;

最终速度公式为:

V' = Vx' + Vy' = Vx - Vy;

碰撞执行算法:

游戏的主循环往往遵循如下代码结构:

  1. while ( true ) {
  2. game.update(time_interval);
  3. game.render();
  4. }

复制代码

这个时间间隔(time_interval), 由游戏的FPS来确定。 以24帧为例, 每40毫秒刷新一次。

对于台球本身而言, 若以该time_interval为更新周期, 使得运动的球体满足:

Vt = V0 + a * t

运行距离为:

S = V0 * t + 1/2 * a * t^2。

然后来检测球体是否发生了碰撞, 然后进行碰撞反应处理。 看似没有问题。

但是当球体初速度很快时, 在time_interval中有可能, 发生穿越现象。

如下图所展示的现象:

紫色球在t2时刻, 和蓝球检测到碰撞, 但实际上, 在紫球在t1~t2之间的某时刻和蓝球发生了碰撞。

为了解决该问题, 在具体的算法中, 手游账号转让需要引入更细的时间分片slice, 该过程在具体的update中进行模拟。

整个台球场景的更新函数:

  1. void update(time_interval) {
  2. while time_interval > 0:
  3. // 碰撞检测
  4. if detectionCollide(time_interval, least_time, ball_pairs):
  5. // 游戏更新least_time
  6. billiards.update(least_time)
  7. // 对碰撞的两球进行碰撞反应
  8. collideReaction(ball_pairs=>(ball, other))
  9. // time_interval 减少 least_time
  10. time_interval -= least_time
  11. else:
  12. // 游戏更新least_time
  13. billiards.update(time_interval)
  14. time_interval = 0
  15. }

复制代码

注: 碰撞反应, 按物理模型篇讲述的来。

而具体的碰撞检测算法为:

  1. /*
  2. @brief
  3. 在time_interval 时间内, 返回最先碰撞的球或台球边, 以及时间点
  4. */
  5. bool detectionCollide(time_interval, least_time, ball_pairs) {
  6. res = false;
  7. least_time = time_interval;
  8. foreach ball in billiards:
  9. foreach otherBall in billiards:
  10. // 求出两球的距离
  11. S = distance(ball, otherBall)
  12. // 以某一球作为参考坐标系, 则令一球速度向量变为 U’=U-V
  13. // 在圆心的直线作为x轴
  14. Ux(relative) = Ux(other ball) - Vx(ball)
  15. //  若该方向使得两球远离, 则直接忽略
  16. if Ux(relative) < 0:
  17. continue
  18. //  某该方向使得两球接近, 则可求其碰撞的预期时间点
  19. A' = 2 * A; // 加速度为原来的两倍
  20. // 取两者最小的时间点
  21. delta_time = min(time_interval, Ux(relative) / Ax’)
  22. // 预期距离 小于 两球距离,则在time_interval中不会发生碰撞
  23. if 1/2 * Ax’ * delta_time ^ 2 + Ux(relative) * delta_time < S - 2*r:
  24. continue
  25. // 解一元二次方程, 使用二分搜索逼近求解
  26. res_time <= slove(1/2 * Ax’ * x ^ 2 + Ux(relative) * x = S - 2 * r)
  27. if res_time < least_time:
  28. ball_pairs <= (ball, otherBall)
  29. least_time = res_time
  30. res = true
  31. foreach wall in billiards:
  32. S = distance(ball, wall)
  33. // 设垂直于平面的方向为x轴
  34. if Vx < 0:
  35. continue
  36. // 取两者最小的时间点
  37. delta_time = min(time_interval, Vx / Ax)
  38. // 预期距离 小于 两球距离,则在time_interval中不会发生碰撞
  39. if 1/2 * Ax * delta_time ^ 2 + Vx * delta_time < S - r:
  40. continue
  41. // 解一元二次方程, 使用二分搜索逼近求解
  42. res_time <= slove(1/2 * A * x ^ 2 + Vx * x = S - r)
  43. if res_time < least_time:
  44. ball_pairs <= (ball, walll)
  45. least_time = res_time
  46. res = true
  47. return res
  48. }

复制代码

注: 对于一元二次方程, 也可以借助分1000个细粒度时间片, 然后计算逼近求解。

台球模拟碰撞算法过程, 大致就是如上所述。

计算最复杂的时刻, 其实就是开球, 打散一堆球的时候。

台球类html5游戏的AI设计与核心算法的实现相关推荐

  1. html5 游戏 算法,台球类html5游戏的AI设计与核心算法的实现

    一.前言: 08年的时候, 写过一个台球游戏, 用的是java, 不过代码真的是用传说中的神器notepad写的(你信吗? 其实是用GVIM写的, ^_^), 很多类都在同一java文件中编写. 可见 ...

  2. 阐述游戏AI设计的两个禁忌及解决方法

    此文转自游戏帮,勉励下自己 作者:Jon Shafer 我在过去年几负责了多款游戏的AI设计工作,我从中收获的一个最基本,可能也是最令人沮丧的经验就是:创建一个出色的AI真是出奇地困难.不但制作一个符 ...

  3. 游戏编程技术贴:AI设计的若干规则阐述

    一般来讲,网络游戏的AI历来就是很简单的AI.相比之下,很多单机游戏的AI就要得复杂一些.而笔者并未从事过大型单机游戏的AI设计,所以也就不班门弄斧了.但至于网游的AI,还是略知一二. 目前游戏中的A ...

  4. java台球游戏设计原理_台球游戏的核心算法和AI(1)

    前言: 08年的时候, 写过一个台球游戏, 用的是java, 不过代码真的是用传说中的神器notepad写的(你信吗? 其实是用GVIM写的, ^_^), 很多类都在同一java文件中编写. 可见当时 ...

  5. 游戏编程新手教程:怪物AI设计简述

    怪物AI应该说是这是一个程序问题,如果从策划的角度来说,作为设计者,则需要了解怪物AI整体的设计流程,这样才能提出自己的需求,从而让游戏战斗的整体体验符合设计预期,毕竟怪物AI也是属于战斗和体验的重要 ...

  6. HTML5期末大作业:游戏网页网站设计——CCG-游戏网页介绍(6页)高质量 HTML+CSS+JavaScript

    HTML5期末大作业:游戏网页网站设计--CCG-游戏网页介绍(6页)高质量 HTML+CSS+JavaScript 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电 ...

  7. html5 游戏 动画设计,11款效果惊艳的HTML5动画应用

    11款效果惊艳的HTML5动画应用 来源:极客头条 HTML5真的很棒,我们这个网站也每天在为大家分享很多炫酷而实用的HTML5和CSS3应用.今天要分享的有很多效果惊艳而且好玩的HTML5动画应用, ...

  8. 浅谈AI设计:理解玩家们对游戏的感知方式

    对于绝大多数的游戏来说,AI都是不可或缺的一部分,优秀的AI设计可以增加游戏深度,提高游戏的挑战性,增加游戏的幽默感,甚至可以让游戏视觉效果.动画以及更多方面更加突出.不过,游戏AI的设计并不是月困难 ...

  9. 游戏中的人工智能AI设计

    因为在现在的项目中花了很大精力设计和制作怪物AI和技能,所以在这里也做个小总结. 什么叫做游戏中的AI        游戏中的AI可以简单的理解为计算机控制的智能角色,这些智能角色能够通过周遭环境或者 ...

最新文章

  1. vue导入excel进度条_Vue 前端开发——导入Excel/Csv
  2. uefi和legacy的区别
  3. Selenium Grid Node 安装配置(CentOS 7 版)
  4. Redis五种数据结构
  5. 初始化_Linux的内存初始化
  6. https://www.usb.org/
  7. 今天的几个财务词汇--待查
  8. python程序开发入门_程序设计入门—Python
  9. appstore ip地址
  10. sqli-labs 第八关盲注脚本
  11. 提示fxp不是一个目标文件
  12. TortoiseSVN 如何去掉文件夹左下角的绿色对勾的方法
  13. MySQL数据库的存储引擎
  14. AES算法中S盒的FPGA实现 II
  15. hadoop,spark,Zookeeper,,, 这些名字都是怎么来的呢?
  16. Windows批处理 - 小程序大作用
  17. 【转】让电脑更高效的魔法 – 浅谈高效率PC工作环境的简化、净化与建立方法...
  18. 一道100个飞机乘客随机坐座位的趣味概率问题
  19. post表单时的html报文的header信息
  20. 【c++王桂林】命名空间

热门文章

  1. 【评测】胎牛血清/血清怎么选?
  2. 唤醒数据价值,惟客数据打造客户经营数字化闭环 | 爱分析调研
  3. 惟客云升级 |如何快速抓住每个客户成交转化机会?
  4. 计算机主板纽扣电池缺电,主板上的纽扣电池没电了,影响电脑开机吗?
  5. wps表格——条件格式功能笔记
  6. 【真实案例】高中辍学后的我,转行做了程序员,月薪达10K+,可笑的是醒悟的太晚
  7. 六招教你准确揣摩他人心理
  8. 那些思念_元曦血狼_新浪博客
  9. 申宝投资-互联网等大幅下挫
  10. ubuntu下文件复制