老澳门葡京娱乐官网台球游戏的骨干算法和AI(1)

前言:
  08年的时候, 写过一个台球游戏, 用的是java,
不过代码真的是用传说中的神器notepad写的(你信吗?
其实是用GVIM写的, ^_^), 很多类都在同一java文件中编写.
可见当时的JAVA水平确实不咋地, 时过进迁, 依旧一样的不咋地.
  这边是当下的CSDN下载链接: java(台球游戏),
实现比较简单. 后来写过一个本子, 比那么些要强大许多, 可惜源码丢失了. 
  效果浮现入下图所示:
  老澳门葡京娱乐官网 1
  本文想讲述下台球游戏中挑大梁算法的实现, 以及打闹AI的规划技巧.
当然自己也有个小愿望, 希望能落实一个html5版的弹子游戏.

2018年,有个娃娃来自己这时做网络拓宽。勤劳勇敢、智慧、任劳任怨,特出的一塌糊涂。没事儿,我都夸他将来的马云、乔布斯。他只是憨厚地笑笑!

基本功物理知识:
  • 摩擦阻力
  其满足牛顿(牛顿)第二定律:
  f = m * a
  速度与加速度关系公式:
  vt = v0 + a * t
  地面摩擦力与运动物体的样子相反, 阻碍物体的向前运动.
  • 动量守恒
  假若物体A质量为m1, 速度为v1, 物体B质地为m2, 速度为v2,
碰撞后速度分别为v1′, v2′.
  则满意动量守恒定律:
  m1 * v1 + m2 * v2 = m1 * v1′ + m2 * v2′
  老澳门葡京娱乐官网 2

只是他在我这儿干了半年,提成辞职。说做网络放大薪水是高。只是工作时间太长了,有点儿受不了,想去工厂上班,每一日能睡个踏实觉。我就给他讲道理:“在咱们这时候上班,前期是苦点儿,只是苦几年,车房都有了,虽然是自己出去创业,成功率也特别高的。”

  • 碰撞类型和能量守恒定律
  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). 检测球与球碰撞
  大家只要球A(x1, y1, r), 球B(x2, y2, r). 则满意条件:
  (x1 – x2) ^ 2 + (y1 – y2) ^ 2 <= (2*r) ^ 2
  则发出冲击, 否则尚未发出相撞
  2). 检测球与球台边框碰撞
  相对相比较简单. 求球心到边框的垂直距离即可, 若小于等于则发出相撞,
若大于则没有.
  • 碰撞反应 
  1). 球与球的撞击反应
  老澳门葡京娱乐官网 3
  动量是向量, 其在正交的五个样子上, 相互守恒.
大家采取两球圆心的直线为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). 球与边框的碰撞反应 
  把台球边框视为质地无穷大, 则简单把移动的球,
其在笔直边框的分方向反向即可.
  老澳门葡京娱乐官网 4
  假定碰撞碰撞平面为x轴
  Vx’ = Vx;
  Vy’ = -Vy;
  终极速度公式为:
  V’ = Vx’ + Vy’ = Vx – Vy;

前几天她到底过上了”幸福“的生活。

撞倒执行算法:
  游戏的主循环往往按照如下代码结构:

每日九点上班,上午六点收工(在此以前在大家这时候是8点上班,夜里12点下班)。下班了,他去干嘛?看电视、喝酒可能在街上打台球。由于他的时光相比宽松,他又起初泡二姐。他在果壳网上说:“离开自寅舍得分享工作室后,我才知晓世界上还有另一种生存:轻松,随意,自然。赚钱不多,快乐无限。”

while ( true ) {
    game.update(time_interval);
    game.render();
}

一晃一年多病逝了。某天,我收下她一条短信:“舍得哥,我想来您那儿上班。姑丈病了,需要钱;订婚也需要钱。我在工厂上班,月薪才3000多,日常压根就不够花的。“

本条时间距离(time_interval), 由游戏的FPS来确定. 以24帧为例,
每40阿秒刷新四次.
  对于台球本身而言, 若以该time_interval为改进周期,
使得移动的球体满足:
  Vt = V0 + a * t
  运行距离为:
  S = V0 * t + 1/2 * a * t^2.
  然后来检测球体是否暴发了冲击, 然后拓展碰撞反应处理. 看似没有问题.
  不过当球体初速度迅猛时, 在time_interval中有可能,
暴发越过现象.
  如下图所展现的现象:
  老澳门葡京娱乐官网 5
  红色球在t2时刻, 和蓝球检测到冲击, 但实际上,
在紫球在t1~t2以内的某时刻和蓝球暴发了碰撞.
  为了缓解该问题, 在具体的算法中, 需要引入更细的时光分片slice,
该过程在切实可行的update中展开模拟.
  整个台训练场景的翻新函数:

自我没过来。以前在自己此刻上班,底薪(1200元)+50%提成,他每个月可以得到1W到2W。一开端他有感觉,后来就没觉得了。老是说人赚那么多钱干什么,够吃够喝就行了。我说人有了钱,可以有更高的神气追求。他听了之后,依旧憨厚地笑笑。

void update(time_interval) {

    while time_interval > 0:
        // 碰撞检测
        if detectionCollide(time_interval, least_time, ball_pairs):
            // 游戏更新least_time
            billiards.update(least_time)
            // 对碰撞的两球进行碰撞反应
            collideReaction(ball_pairs=>(ball, other))
            // time_interval 减少 least_time
            time_interval -= least_time
        else:
            // 游戏更新least_time
            billiards.update(time_interval)
            time_interval = 0

}

在大家这儿离职后,他也去过其余网络店铺做推广,只是她的学历不高(初中未念完),人家都休想她。没办法,只好去工地打工,一个月6000多的薪饷,每一日累得喘不过来气。而且这活又毫无主题竞争力。

注: 碰撞反应, 按物理模型篇讲述的来.
  而具体的碰撞检测算法为:

她也没办法,想拿高薪,没啥技术,只好干工地。自己想创业,手里的钱不多,压根就没勇气往前冲。他中途也找过几家网络店铺,想来做推广,人家嫌他学历低(初中),或是嫌弃他的正规高:底薪1200+50%提成,管吃住!

/*
    @brief
        在time_interval 时间内, 返回最先碰撞的球或台球边, 以及时间点
*/
bool detectionCollide(time_interval, least_time, ball_pairs) {

    res = false;
    least_time = time_interval;

    foreach ball in billiards:
        foreach otherBall in billiards:
            // 求出两球的距离
            S = distance(ball, otherBall)
            // 以某一球作为参考坐标系, 则令一球速度向量变为 U’=U-V
            // 在圆心的直线作为x轴
            Ux(relative) = Ux(other ball) - Vx(ball)
            //  若该方向使得两球远离, 则直接忽略
            if Ux(relative) < 0:
                continue
            //  某该方向使得两球接近, 则可求其碰撞的预期时间点
            A' = 2 * A; // 加速度为原来的两倍

            // 取两者最小的时间点
            delta_time = min(time_interval, Ux(relative) / Ax’)
            // 预期距离 小于 两球距离,则在time_interval中不会发生碰撞
            if 1/2 * Ax’ * delta_time ^ 2 + Ux(relative) * delta_time < S - 2*r:
                continue

            // 解一元二次方程, 使用二分搜索逼近求解
            res_time <= slove(1/2 * Ax’ * x ^ 2 + Ux(relative) * x = S - 2 * r)

            if res_time < least_time:
                ball_pairs <= (ball, otherBall)
                least_time = res_time
                res = true

        foreach wall in billiards:
            S = distance(ball, wall)
            // 设垂直于平面的方向为x轴
            if Vx < 0:
                continue

            // 取两者最小的时间点
            delta_time = min(time_interval, Vx / Ax)
            // 预期距离 小于 两球距离,则在time_interval中不会发生碰撞
            if 1/2 * Ax * delta_time ^ 2 + Vx * delta_time < S - r:
                continue

            // 解一元二次方程, 使用二分搜索逼近求解 
            res_time <= slove(1/2 * A * x ^ 2 + Vx * x = S - r)

            if res_time < least_time:
                ball_pairs <= (ball, walll)
                least_time = res_time
                res = true

    return res

}

明亮了这件事后,我也不知晓说什么样。我只是说是男人,必须在常青时疯狂赚钱,除了挣钱,什么都不用想。人在江湖,是有钱了,什么都好说;没有钱,说吗都不行。等有天了解了这么些道理,回过味来,或许属于我们的时期已过去了。

注: 对于一元二次方程, 也可以凭借分1000个细粒度时间片,
然后总括逼近求解
.
  台球模拟碰撞算法过程, 大致就是如上所述. 
  总结最复杂的每天, 其实就是开球, 打散一堆球的时候.

切切实实就是那么残酷。有些资源是少数的,那一个资源,只好供有钱人自由控制和分享,没钱只好意淫!现在我们疯狂赚钱图啥?有尊严地活着。一贯到现行,还有不少人给我较劲儿。说年轻时没必要吃苦,没必要死磕。该钓鱼就钓鱼,该吃烧烤就吃烧烤。OK,我们看看那么些时刻钓鱼或吃烧烤的人,他们的大人在干嘛?是不是90%的老人都是在干工地可能在工厂打工。假若他们有出息的话,父母还用出去干工地或打工?他们的父二姑都50多岁了,为了生活还要背井离乡。说白了,还不是二老没本事儿,儿女没本事儿。我见到那多少个没追求、没野心、没霸气的人,就以为无话可说。

总结:
  本文参考了”NEHE的OPENGL粤语教程 第30课
碰撞检测与模型运动
“. 当然实现台球游戏,
未必真的需要该算法, 很多开发者直接利用box2d就能健全并轻松的实现.
参考”使用 cocos2d-x Box2d
的实现
“. 后续的篇章,
想讲述下台球游戏的AI如何设计和实现. 望一同努力.

老公的毕生,要么为了事业,要么为了爱情。又爱情,没事业,婚姻不一定会幸福。贫贱夫妻百事哀。事业平稳了,婚姻就稳定。浪漫的根底是创制在强硬的物质基础上。即使没有钱,穷人眼中的妖媚,就是祸害钱。

穷人会喝88元一杯的咖啡呢?穷人会坐飞机到时尚之都喂白鸽吗?

赚钱吗,想要什么就有怎样;没有钱,看到再多的繁华也是浮云!……

是先生就对自己狠一点儿!……

有事没事百度时而《自寅舍得分享》《自寅日记》