탁구게임용 AI 제작 + 속도알고리즘의 기본이해
-
13-12-2019 - |
문제
나는 소프트웨어 개발 수업을 위해 탁구 게임을 만들고 있는데 아마도 이것이 숙제라고 말해야 하므로 이해가 제한적입니다.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를 어떻게 만들 수 있는지 전혀 모릅니다.나는 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)):
아마도 X로 10픽셀, Y로 0픽셀을 이동하여 할당한다는 뜻일 것입니다. 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)
이와 관련하여 다음과 같이 가정하는 것이 안전합니까?그게 공이 움직이는 속도인가요?즉.10픽셀 x와 0y, 1/300초마다?1/20 정도로 바꾸면 훨씬 느려지는데...그래서 나는 그렇게 가정할 것이다.
이제 AI를 담을 함수를 만들어야 하는데...아마도
def AI(self):
self.AI_Speed = self.ball.velocity - 10
self.player1.
내 패를 가리킨다.
그리고 응..이제 나는 막혔습니다.패들의 움직임을 제어하기 위해 이 속도를 어떻게 사용할 수 있는지 전혀 모르겠습니다.누구든지 아이디어가 있나요?그리고 내 질문은 매우 모호할 가능성이 높으므로 더 나은 이해가 필요할 경우를 대비해 게임 소스를 제공하겠습니다.감사합니다.
추신.나는 이것이 큰 질문이고 물어볼 것이 많다는 것을 알고 있지만 누군가 대답할 수 있기를 바랍니다.감사해요.
해결책
이것은 너무 큰 질문이기 때문에 이것저것 테스트해보지는 않았지만 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
이 작업을 수행하려면 AI 속도를 더 조정해야 할 수도 있지만 이것이 올바른 일반적인 아이디어라고 생각합니다.생각해 보면 무적의 AI는 기본적으로 무한히 빠릅니다.
그게 당신을 풀어주는 데 도움이 되나요?
다른 팁
seaseaotternerd 덕분에 저는 이길 수 있는 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 위치)가 정의되고 더 어려운 모드의 난이도를 높일 수 있습니다.
감사해요!