불완전한 탁구 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

답변:


20

내가 가장 좋아하는 불완전한 퐁 AI는 잔인하게 단순하지만, 다소 좋은 AI 실패를 할 수 있습니다.

보이지 않는 볼 AI

AI 설정 : 공이 패들에서 반사 될 때 공의 위치와 속도를 알 수 있습니다. 그 시점에서 보이지 않는 볼을 스폰하지만 더 빠른 속도로 스폰하십시오. 보이는 공이가는 곳에서 감겨 질 것입니다. 각 프레임마다 AI가 보이지 않는 볼의 위치를 ​​향해 움직 이도록합니다. 보이지 않는 볼이 AI쪽에 닿으면 멈추십시오. AI가 노를 움직여야하는 곳입니다.

결과 : AI가 공의 경로를 예측하려는 것처럼 보입니다. 플레이어가 공을 가파른 각도로 반사하여 벽에서 튀어 오릅니다. AI는 공을 약간 아래로 추적 한 다음 공보다 느린 속도로 공을 충분히 빨리 추적하지 못합니다. AI를 속였으며 인간의 관점에서 볼 때 상당히 논리적으로 보입니다. 공이 어디로 갈지 컴퓨터가 예측하려고하는 것을 볼 수 있습니다. 아, 너무 느려서 점수를 얻었습니다.

AI가 비교적 지능적으로 보이기 때문에 무작위 삽입보다 훨씬 낫습니다. 합당한 상대. 또한 AI가 인간과 똑같은 규칙으로 플레이 할 수있게 해주므로 플레이어에게 더 좋아 보이고 작업이 쉬워집니다.

설정 : 보이지 않는 볼의 속도를 조정할 수도 있습니다. AI의 계획 속도를 결정하기 때문입니다. 보이지 않는 볼이 빠를수록 패들이 블록으로 이동하는 데 더 많은 시간이 걸리고 플레이어가 더 잘 조준해야합니다.


주어진 모든 답변은 실제로 좋은 정보를 제공했지만 하나는 정답으로 표시해야하므로 귀하의 접근 방식을 정말로 좋아 하므로이 답변을 선택했습니다. 이것은 다른 답변에서 언급 된 다른 것들과 함께 (반응 시간을 가지고 노는 것과 같이) 실제로 인간과 같은 AI를 얻을 수 있고, 조절하기 어려운 어려움을 겪을 수 있습니다
Setzer22

특정 특수 동작을 기반으로 가변 각도, 속도 및 가속도를 가지므로 공이 모든 곳에 퍼질 수 있기 때문에 설정에 완벽하게 작동했습니다. AI가 소유되었지만 지금은 훨씬 나아졌습니다. 이 방법이 고정 속도와 45도 각도에 가장 적합한 이유를 알 수 있지만 이것이 내 게임이 아닙니다.
jackrugile

1
이 접근 방식이 마음에 들지만 구현에 문제가있었습니다. 문제는 트레이서 볼이 나타내는 볼보다 빠르게 움직이므로 볼에서 발생할 수있는 충돌을 놓칠 수 있다는 것입니다. 물론, 트레이서 볼이 프레임 사이에서 더 먼 거리를 이동할 것이기 때문입니다.
Wolfgang Schreurs

충실도를 높이려면 프레임 당 두 번 트레이서 볼 위치를 다시 계산하고 각 계산의 속도를 절반으로 줄일 수 있습니다.
DDR

22

내가 플레이 한 탁구 게임은 다음과 같은 방식으로 작동합니다. AI 제어 패들은 공이 어디에 닿을 지 알지만 그 위치에 얼마나 빨리 도달 할 수 있는지에 제한이 있습니다. 그래서 때때로 그리워합니다. 이것이 가장 확실한 방법이라고 생각합니다.


이. AI가 프레임 당 3px 만 움직일 수 있고 위에서 아래로 움직여야 만하는 경우 볼이 어디로 닿을지를 알 수 없습니다.
KeithS

14

TI83에서 아주 멋진 팩맨 복제본을 만들었을 때? 계산기, 내가 만난 가장 큰 문제는 "유령"이 너무 빠르다는 것입니다. 어떻게 든 속도를 늦춰야했습니다. 그래서 나는 거기에 큰 오래된 죄 (cos (tan (x-coordinate)))를 넣었습니다. 레벨이 쉬울수록 계산이 몇 번 수행되고 레벨이 높아지면 작업 중 하나만 수행됩니다.

요점은 반응 시간입니다. 전형적인 인간 반응 시간이 무엇인지 연구하고 10ms를 더하십시오. 시작점으로 사용하십시오. 레벨이 어려워 질수록 반응 시간에서 시간을 제거하십시오 Thread.sleep(time);. AI 에게는 간단 할 수 있습니다 . AI가 움직이기 전에 그 시간을 기다리십시오.

패들이 얼마나 빨리 움직이는 지 제어 할 수도 있고, 정말로 복잡해지기를 원한다면 다양한 정도의 정보를 기반으로 볼의 위치를 ​​결정하십시오 (벡터가 아닌 2 픽셀 만). 벽에 각도 수정자를 추가하여 임의의 정도를 추가하여 AI를 다시 계산하십시오.


2
왜 정확히 사용했는지 설명해 주 sin(cos(tan(x)))시겠습니까?
nullpotent 2016 년

5
내가 젊고 어리석은 원인이었고 TI83에서 sin (cos (tan (x)))은 AI에서 좋은 지연 단위를 만들었습니다. 또한 내가 아는 한, 계산기에는 밀리 초를 사용할 수있는 대기 명령이 없었기 때문에. 아마도 약간의 명확성 : 어셈블리 또는 마이크로 스크립트 또는 컴파일 할 수있는 언어를 사용하지 않았습니다. 펌웨어 내 프로그래밍 코드 (prgm 버튼)를 사용했습니다. 주어진 순간에 화면에 최대 8 줄의 코드가있었습니다. 지연 시간으로 인해 더 복잡한 것을 기억할 수 없었습니다.
Russell Uhl

2
TI83의 펌웨어 내 코드를 프로그래밍하는 법을 배웠습니다. 그런 다음 C ++에서 구조화 된 프로그래밍을 다시 배워야했습니다. TI83이 스파게티 문자열 코드가 무엇인지, 왜 나쁜지 가르쳐주었습니다. 그 이후로 goto 문을 사용하지 않았습니다. 그래도 좋은 시간입니다.
ContextSwitch

2
오 주여, 고 토스 나는 때때로 코드를 다시 방문하고 .... 그리고 빨리 포기합니다. 수학 수업 중에 몇 주에 걸쳐 어떻게 이것을 프로그래밍했는지 알 수 없습니다.
Russell Uhl

1
트리거 지연에 대해 방어 할 필요가 없습니다. 루프에서 부동 소수점 연산은 수십 년 전에 작성된 프로그램에서 일시 중지하는 일반적인 방법이며 계산기 성능 / 기능은 80 년대 초반 컴퓨터와 일치합니다.
Dan Neely 2016 년

6

패들을 천천히 늦추면, 예각으로 공을 때릴 때마다 (즉, 다른 쪽을 향해 직선이 아닌 많이 위아래로 움직이는 경우) 공이 위 / 아래로 움직이므로 컴퓨터가 거의 항상 그리워집니다. 패들이 보상 할 수있는 것보다 더 빠릅니다.

대신 내가 할 일은 패들의 속도와 AI가 반응하는 지점을 가지고 노는 것입니다. 예를 들면 다음과 같습니다.

  • 사용자가 공을 칠 때
    • AI는 즉시 반응하여 공이있는 곳으로 갈 수 있습니다. 충분히 빠르면 제 시간에 도착합니다
  • 공이 필드의 중앙을 가로 지르는 경우
    • AI는 반응하기 전에 필드의 중간을 통과 할 때까지 기다려야합니다.

변화에 대한 또 다른 한가지는 어떻게 인공 지능이 반응한다. 패들이 항상 공이있는 위치로 이동하는 전략을 강조했습니다. 사람이 항상 그렇게 할 수는 없습니다. 모든 바운스로 인해 볼이 정확히 어디에 있는지 알지 못하는 채 공을 위아래로 따라갈 가능성이 높습니다.

따라서보다 인간적인 반응 방법은 항상 공을 향해 움직이는 것입니다. 예를 들어, 공이 위로 움직이면 패들이 위로 움직입니다. 패들이 충분히 빠르면 상단과 하단의 바운스에 반응 할 수 있습니다. 패들이 충분히 빠르지 않으면 공이 위로 올라올 때 위로 움직여 과도하게 보상하지만, 튀어 오르면 패들이 충분히 빨리 내려 가지 못할 수 있습니다.

마지막으로, 패들 크기를 가지고 놀면서 어려움을 증가 / 감소시킬 수 있습니다.


2

고려해야 할 한 가지 요소는 무작위성입니다. 인간 플레이어는 항상 약간의 변동이 있으므로 인공 지능을 인간처럼 보이게하려면 약간의 변화를 원할 것입니다.

다음에 대한 범위를 설정할 수 있습니다.

  • 반응 시간 (AI가 얼마나 빨리 움직이기 시작하는지)
  • 속도 (AI가 패들을 얼마나 빨리 움직이는 지)
  • 정확도 (AI가 실제 패들을 이동하려는 위치에 얼마나 근접해 있는지, 원하는 위치에서 언더 슈트하거나 오버 슈트 할 수있는 기회)

그런 다음 상대방이 적중 할 때마다 AI는 해당 범위 내의 값을 선택하고이를 기반으로 결정 (및 움직임)을 할 수 있습니다. 보다 쉬운 AI 상대의 경우 이러한 범위를 모두 열악하게 만들 수 있지만 AI에 "럭키 샷"을 줄 수있는 넓은 범위를 가질 수도 있습니다. 더 어려운 상대의 경우 해당 범위를 강화하고 모두 "좋은"범위에 둘 수 있습니다.


2

나는 단지 탁구에만 국한되지 않는보다 일반적인 해결책을 제안 할 것입니다. 나는 이것이 탁구뿐만 아니라 모든 게임에 적용될 수 있다고 생각합니다. 인간과 같은 행동을 원하십니까? 그래서 인간은 인간처럼 행동하는 것처럼 느낄 수 있습니다. 그래서, 당신은 무엇을합니까?

인간을 관찰하십시오! 선수는 어떻게 탁구에서 패할 수 있습니까? 음, 우리가 두 명의 탁구 선수를 본다면 그것은 분명합니다. 일반적으로 손실은 공이 너무 빠르며 플레이어의 반응 시간이 지연 되었기 때문입니다. 그것은 두 가지 매개 변수입니다. 그중 하나는 조정 가능합니다. 다른 하나는 플레이어가 올바른 방향을 누를 수있는 능력입니다. 따라서 오류 빈도와 반응 빈도가 있습니다. 난이도에 따라 둘 다 조정할 수 있습니다.

쉬운 AI는 입력 지연이 높고 임의의 실수를 저지르는 경향이 있습니다. AI가 더 어려워 질수록 이러한 매개 변수가 어려워 지도록 조정됩니다.

이것은 거의 모든 게임에 적용 할 수 있으며, 심지어 틱택 토 또는 더 복잡한 모델과 같은 게임에도 적용 할 수 있습니다. 이 방법은보다 복잡한 시나리오에서 세분화되지만 매개 변수와 범위의 수가 좁은 게임에서는 충분합니다.


1

다음은 몇 가지 옵션 목록이며 일부는 이미 다루었습니다.

  • 똑똑한 컴퓨터 플레이어가 공을 겨냥하여 플레이어가 많은 바운스로 도달하기가 어려워지고 상대방이 쉽게 상대 할 수 있도록 반대 방향으로 행동하십시오.
  • 공이 상대에게가는 길에있는 동안 똑똑한 선수는 패들을 중간쪽으로 움직일 것이며, 어디로 돌아올 지 모릅니다.
  • 최종 바운스 전에는 사람이 공이 어디로 향하게 될지를 예측하기가 어렵습니다. AI도 이와 유사한 부정확성을 갖습니다.
  • 패들 속도를 제한하여 공보다 느리게하십시오. 완벽한 플레이에서 놓치려면 수직 속도의 절반 미만이어야합니다.
  • 난이도, 경기 시간 등에 따라 공의 속도를 높이십시오.
  • 인간은 즉각적으로 반응하지 않습니다. AI 플레이어도 마찬가지입니다.
  • AI에게 실수를하거나 공을 놓칠 수있는 확률을 무작위로 부여하십시오.

0

나는 작은 탁구 복제 도했다 (LUA에서).

내 AI는 매우 단순하지만 그렇게 나쁘지는 않습니다.

나는 단지 공의 y 위치를 확인하고 더 낮 으면 패들을 아래로 움직이고, 높으면 패들을 위로 움직입니다.

그런 다음 난이도를 미세 조정하기 위해 컴퓨터 패들이 움직이기 시작하는 공과의 거리를 늘리거나 줄입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.