我正在为我的软件开发类制作一个乒乓游戏,我可能应该声明这是家庭作业,因此我的理解有限。我在为我的NPC球拍创建AI时遇到了一些问题。我正在使用Kivy和Python。
目前,我可以通过以下操作创建无法击败AI:
#ai
self.player2.center_y = self.ball.y
其中self.player2.center_y
是NPC的y坐标(它只在y轴上移动),self.ball.y
是球的y坐标。我按照Kivy网站上的教程创建了游戏的基础。
现在我不知道如何创造出可以打败的人工智能。我知道我需要限制AI的速度,所以当球变得如此之快时,它将无法抓住它。但问题是,我实际上并没有速度函数。
我遵循的教程的问题是它没有解释所有。我相信我可以通过说"Every x seconds, the paddle will move x pixels in the y axis."
这就是按照kivy教程发球的方式:
def serve_ball(self, vel=(10,0)):
self.ball.center = self.center
self.ball.velocity = vel
好吧,现在我试着去理解这个。。。vel=(10,0)):
可能意味着,移动10个像素X和0个像素Y,将其分配给ball.velocity
,显然这控制了速度。。。
class PongApp(App):
def build(self):
game = PongGame()
game.serve_ball()
Clock.schedule_interval(game.update, 1.0/300.0)
return game
Clock.schedule_interval(game.update, 1.0/300.0)
关于这一点,可以安全地假设。。。这就是球移动的速度?即每1/300秒10个像素x和0个像素y?如果我把它改成1/20,它的移动速度会慢得多。。。所以我想是的。
现在我需要创建一个函数来保存AI…也许是
def AI(self):
self.AI_Speed = self.ball.velocity - 10
self.player1.
指的是我的球拍。
是的。。现在我被卡住了。我不知道如何使用这个速度来控制划桨的移动。有人有什么想法吗?由于我的问题很可能非常模糊,如果你需要更好的理解,我会提供游戏的来源。非常感谢。
http://pastebin.com/8wTLbH21
附言:我意识到这是一个大问题,有很多问题要问,但我希望有人能回答。谢谢
多亏了seasotternerd,我成功地写了一些东西,使AI变得无与伦比。
if self.ball.y < self.player2.center_y:
self.player2.center_y = self.player2.center_y - 3
if self.ball.y > self.player2.center_y:
self.player2.center_y = self.player2.center_y + 3
我把球放在y的位置,如果它小于NPC球拍的中心,我会每次把NPC向下移动3y,直到它相同或更大。如果它超过NPC球拍的中心,我只会增加它。
这就定义了划桨的速度(每1/300秒3个y位置),并将允许我增加更难的模式的难度。
谢谢!
由于这是一个很大的问题,我还没有测试过,但似乎你想拥有某种移动AI的函数(我称之为self.player2.move())。如果你在game.update()中调用这个函数,那么你应该能够逐渐将AI球拍移动到击球所需的位置。
self.player2.move()的一些基本伪代码:
figure out if ball is above or below paddle
move self.AI_Speed units in the direction of the ball
你可能需要更多地调整人工智能的速度来实现这一点,但我认为这应该是正确的总体思路。如果你仔细想想,无与伦比的人工智能基本上只是无限快。
这有助于你摆脱困境吗?