不完美的乒乓球AI


19

因此,我开始在使用LWJGL时学习Java和一些OpenGL。首先,我正在编写Atari Pong的副本。我已经正确设置了游戏屏幕,碰撞检测,并且所有游戏大部分都可以正常运行,实际上,如果是2人游戏,我现在就可以完成,但是由于我打算做一个单人游戏,我必须想出一个简单的AI来控制第二位玩家。

知道球将击中何处似乎是微不足道的,并且创建一个总是能将球击中的AI似乎很容易,但是我希望能够赢得比赛,所以我不能总是让IA击中球。

所以这是我的问题,我该如何编写代码以将类似人的缺陷添加到AI中。我是否应该随机决定AI是否会在给定时间失效?还是我在这里缺少一件更聪明(或者也许很明显)的东西?

非常感谢你。


5
那么通常你让AI蝙蝠只移动一定的速度,如果球是深受玩家放置在AI不能达到它..

4
首先,我将限制AI可以移动拨片的速度,和/或在AI开始响应打击之前随机(短)延迟时间内建立。


4
@ byte56我真的不会称其为那个问题的虚伪。感觉就像这里给出的示例blog.stackoverflow.com/2011/01/…在“如果您要关闭用户的问题作为重复项,它必须是真实的重复项”下。该问题是一个很好的资源(鉴于那里的内容,有人可能会使用该问题自己得出答案),但是我认为它并没有真正回答该问题的细节。
Tetrad

1
@Tetrad我认为答案最终非常相似,但是,对的,问题是不同的。我认为这个问题是链接问题的一个更具体的版本。如果OP首先看到了另一个,我不确定是否会问这个问题。当我投票时,我还没有决定权,所以我都对问题和答案进行了投票,并投票了。对我来说,它可能走了任何路。
MichaelHouse

Answers:


20

我最喜欢的不完美的乒乓球AI残酷简单,但让人们做一些相当不错的AI失败。

隐形球AI

AI设置:当球从桨上反射时,您会知道球在哪里以及运动的速度。此时会以更高的速度产生一个看不见的球。它将结束可见球的移动。每帧都使AI移向看不见的球的位置。一旦看不见的球到达AI的一侧,就停止它,因此AI应该在此移动球拍。

结果:AI似乎正在尝试预测球的路径。假设玩家以陡峭的角度反射了球,这样它就会从墙壁上反弹。AI会稍微追踪球,然后-比球慢-不会足够快地追踪球。您欺骗了AI,并且从人的角度来看,它看起来很合理。您可以看到计算机试图预测球的去向,然后-哦,它错过了,速度太慢了,您已经赢得了积分。

这比插入随机性要好得多,因为它使AI显得相对智能。一个值得的对手。它还可以让AI按照与人类完全相同的规则进行游戏,这对玩家而言看起来更好,并且使您的工作变得更轻松。

设置:您还可以调整隐形球的速度,因为这将决定AI计划的前进距离。看不见的球越快,桨将需要移动更多的时间来阻挡,并且球员必须瞄准得越好。


给出的所有答案都提供了非常好的信息,但是由于我必须标记一个为正确的答案,因此我选择了这个答案,因为我真的很喜欢您的方法。结合其他答案中提到的其他内容(例如玩反应时间),可能会得到真正像人的AI,并且难度很容易调整
Setzer22 2013年

这对于我的设置非常有效,因为我可以根据某些特殊动作来改变角度,速度和加速度,因此球可能遍布整个位置。AI已经被拥有了,但是现在变得更好了。我知道为什么这种方法对于锁定速度和45度角不是最佳选择,但这根本不是我的游戏。
jackrugile 2016年

1
虽然我确实喜欢这种方法,但是我的实现确实有问题。问题在于,由于示踪剂球的运动速度快于其所代表的球,因此它可能会错过一些与其所代表的球发生的碰撞。原因当然是示踪剂球将在框架之间移动更大的距离。
Wolfgang Schreurs

如果想要更高的保真度,则可以每帧两次重新计算示踪球的位置,并将每次计算的速度减半。
DDR

22

我玩过的Pong游戏似乎表现如下:AI控制的球拍知道球将击中的位置,但是到达该位置的速度受到限制。所以有时候会错过。我认为这是最明显的方法。


这个。如果球只能移动(例如每帧3像素)并且必须从顶部移动到底部,则无法帮助AI知道球将击中的位置。
KeithS13年

14

当我在TI83上创建一个超棒的几乎吃豆人的克隆时?计算器,我遇到的最大问题是“重影”太快了。我不得不以某种方式放慢他们的速度。因此,我在其中放了一个大的旧罪过(cos(tan(x-coordinate)))。较简单的级别将执行几次该计算,而较难的级别将仅执行其中一项操作。

关键是反应时间。研究典型的人类反应时间,然后加上10毫秒。以此为起点。随着等级变得越来越高,从反应时间中删除时间... Thread.sleep(time);对于AI来说可能很简单。在AI开始移动之前,请等待一段时间。

您还可以控制球拍的移动速度,或者,如果您真的想变得复杂,则可以根据变化的信息程度来确定球的位置……仅说2个像素而不是矢量。在墙上添加角度修改器以增加一定程度的随机性,从而迫使AI重新计算。


2
您能解释一下为什么要使用sin(cos(tan(x)))吗?
nullpotent 2013年

5
因为我年轻,愚蠢,并且在TI83上,sin(cos(tan(x)))在AI中创造了一个很好的滞后单位。同样,据我所知,计算器没有等待命令,该等待命令可能会使用毫秒。也许有些清晰:我没有使用汇编或微脚本或可以编译的任何语言来在这些东西上运行。我使用了固件内编程代码(prgm按钮)。在任何给定的时刻,我的屏幕上最多有8行代码。我不记得有什么更复杂的延迟时间了。
罗素Uhl 2013年

2
我学会了使用TI83的固件代码进行编程。然后,我不得不重新学习C ++中的结构化编程。我会说TI83告诉我什么是意大利面条字符串代码,以及为什么它不好。从那以后我再也没有使用goto语句。好时光。
ContextSwitch

2
哦,天哪,gotos。我时不时地重新检查代码...。然后迅速放弃。我不知道我在数学课程中如何在数周的时间内完成编程工作。
罗素·乌尔

1
无需为您的触发延迟辩护。循环中的浮点数学运算是在几十年前编写的程序中进行暂停的一种常用方法,并且您的计算器的性能/功能与80年代早期的计算机相符。
Dan Neely 2013年

6

如果您只是放慢球拍的速度,那么只要您以锐角击球(即上下移动很多,而不是直接向另一侧移动),由于球上下移动,计算机几乎总是会错过快于桨片可以补偿的速度。

取而代之的是,我要做的是利用操纵杆的速度以及AI的反应速度。例如:

  • 当用户击球时
    • AI可以立即做出反应并到达球的位置。如果足够快,它将及时到达
  • 当球越过场地中央时
    • AI必须等到越过田野中间后才能做出反应

另一件事变化是怎样的AI反应。您已经强调了一种策略,其中桨始终移动到球将要到达的位置。一个人不能总是那样做。他们更有可能上下跟随球,但由于所有的反弹,都不知道当球到达他们的确切位置。

因此,一种更人性化的反应方法是始终朝球移动。例如,如果球向上移动,则球拍向​​上移动。如果桨足够快,它会对顶部和底部的弹跳产生反应。如果球拍不够快,则球上升时它将向上移动,从而过度补偿,但是当球反弹时,球拍可能无法迅速下降。

最后,您还可以使用桨的大小来增加/减少难度。


2

要考虑的一个因素是随机性-人类玩家的游戏总是会有一定程度的变化,因此,如果您希望AI看起来像人类,那么您也将希望游戏中具有一些变化。

您可以设置范围:

  • 反应时间(AI开始移动的速度)
  • 速度(AI移动拨片的速度)
  • 准确性(AI距离其实际想要移动桨板的距离有多近,从而有可能在期望位置下冲或过冲)

然后,在对手的每次打击中,AI都可以在这些范围内选择一个值,并据此做出决策(和移动)。对于更轻松的AI对手,您可以使这些范围都相当差,但也要具有较宽的范围,以便给AI一些“幸运的射击”。对于更困难的对手,您可以收紧那些范围并将它们全部置于“良好”范围内。


2

我将提出一个更通用的解决方案,该解决方案不仅限于乒乓球。我相信这可以应用于任何游戏-不只是乒乓球。你想要人类的行为,对不对?这样一来,人们就可以感觉自己就像在扮演一个人...因此,从一开始,人们就有希望获胜。所以你会怎么做?

观察人类!玩家如何在乒乓球上输球?好吧,如果我们看两个乒乓球运动员,那就很明显了。通常,损失是因为球太快而球员的反应时间被延迟了。这是两个参数,其中之一是可调的。另一个是玩家按正确方向的能力。因此,您有一个错误频率和一个反应频率-都可以根据难度进行调整。

简单的AI将具有更高的输入滞后和更多的随机错误倾向-作为更难的AI将被调整为使这些参数适应困难。

这几乎可以应用于任何游戏-包括井字游戏甚至更复杂的模型。这种方法在更复杂的情况下会失效,但在参数和范围数量狭窄的游戏中就足够了。


1

以下是一些选项的列表,其中一些已经介绍过:

  • 使更聪明的计算机玩家将球对准目标,这样,玩家很难获得很多反弹,反之亦然。
  • 一个聪明的球员会在球传到对手的路上将球拍向中间移动,他们不知道球会回到哪里。
  • 在最终反弹之前,人们很难预测球的最终位置。使AI具有类似的误差。
  • 限制桨的速度,使其比球慢。要想完美发挥,就需要小于垂直速度的一半。
  • 根据难度,比赛持续时间等提高球的速度。
  • 人类不会立即做出反应。AI玩家也不应该。
  • 给AI一个随机的机会犯错并丢球。

0

我也做了一个小的Pong克隆(在LUA中)。

我的AI很简单,但是还算不错,恕我直言。

我只是检查球的y位置,如果调低球杆,则将其向下移动,如果调高球杆,则将其向上移动。

然后,为了微调难度,我增加或减少了距球拍的距离,从球拍开始移动计算机板。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.