2012-02-03 2 views
0

나는 내 탁구 경기를 위해 인공 지능을 만들려고 노력하고 있지만 인공 지능 제어 패들은 공을 치려고 할 때 많이 불안합니다. 당신은 여기에 전체 코드의 .ZIP 찾을 수내 탁구 인공 지능이 왜 지터 롭지?

function calculateAI() { 
if (paddleA.AI) { 
    if (ball.x + (ball.width/2) <= ctx.canvas.width * 0.4 && ball.directionX == -1) { 
     if (ball.y + (ball.height/2) >= paddleA.y + (paddleA.height + paddleA.heightModifier * 0.75) && paddleA.y + paddleA.height + paddleA.heightModifier < ctx.canvas.height) { 
      paddleA.y += paddleA.speed + paddleA.speedModifier; 
     } 
     else if (ball.y + (ball.height/2) <= paddleA.y + (paddleA.height + paddleA.heightModifier * 0.25) && paddleA.y > 0) { 
      paddleA.y -= paddleA.speed + paddleA.speedModifier; 
     } 
    } 
    else { 
     if (paddleA.y + ((paddleA.height + paddleA.heightModifier)/2) <= (ctx.canvas.height/2) - 50 && paddleA.y + paddleA.height + paddleA.heightModifier < ctx.canvas.height) { 
      paddleA.y += paddleA.speed + paddleA.speedModifier; 
     } 
     else if (paddleA.y + ((paddleA.height + paddleA.heightModifier)/2) >= (ctx.canvas.height/2) + 50 && paddleA.y > 0) { 
      paddleA.y -= paddleA.speed + paddleA.speedModifier; 
     } 
    } 
} 
} 

: 여기

내 코드의 AI 부분입니다 http://dl.dropbox.com/u/23225581/Pong.zip

내 질문에, 나는이 때문에 AI 구조 조정을 수있는 방법입니다 너무 지터하지 않니? 누구든지 인공 지능에 대한 다른 제안이 있다면 일반적으로 듣고 싶습니다.

+0

는 HTML5의 의사 더블 버퍼링에서보세요. http://stackoverflow.com/questions/2795269/does-html5-canvas-support-double-buffering – xbonez

+1

@xbonez AI가 지터 핑하는 이유와 관련이 없습니다. 나는 그것이 움직이는 동안 캔버스가 깜박이지 않고 패들이 빠르게 움직이는 것과 관련이 있다는 것을 압니다. –

답변

3

AI가 공을 더 부드럽게 쫓아 내고 싶다고 가정합니다. 다음은 몇 가지 제안 사항입니다 : 패들 공 근처

이동 천천히 때

는 AI의 속도가 볼 2의 속도로 이동하는 경우 8입니다 말해, 패들 8 아래로 뛰어 안, 그런 다음 다시 뛰어 오십시오. 대신 y 위치를 공과 같게 설정하십시오.

그것이 정말

당신은 이미 구현 한 수를 필요로 할 때 패들는 공을 쫓아 확인하고 난 그냥 통지를하지 않았다. 기본적으로 공이 패들 가장자리에 부딪치게되면 움직이지 않아도됩니다.

내가이 일을하기 위해 코드를 조금 수정했습니다

function calculateAI() { 
if (paddleA.AI) { 

    //ball's x position 
    var bx = ball.x + (ball.width/2); 

    //Get half he paddle's height and its y position 
    var hD2 = (paddleA.height + paddleA.heightModifier)/2; 
    var py = paddleA.y; 

    //speed 
    var speed = paddleA.speed + paddleA.speedModifier; 

    //by is either the center of the screen or the ball's y position, 
    //depending on what the paddle wants to do. 
    var by = ctx.canvas.height/2; 
    if (bx <= ctx.canvas.width * 0.4 && ball.directionX == -1) { 
     by = ball.y + (ball.height/2) - hD2; 
    } 

    //Attempt to move toward 'by' (if I 'have' to) 
    if (by > py+hD2) { 

     //Jump to position if close enough 
     //(Commented out to retain speed) 
     /* 
     if(by - speed < py) 
      py = by; 
     else 
     */ 
      py += speed; 

    } 
    else if (by < py-hD2) { 

     //Jump to position if close enough 
     //(Commented out to retain speed) 
     /* 
     if(by + speed > py) 
      py = by; 
     else 
     */ 
      py -= speed; 
    } 

    //Border range check goes here 


    paddleA.y = py; 
} 
} 

그것은 불완전하지만 모든 것이 작동합니다.

더 탁구 AI 아이디어를 들어, 당신은 내 탁구 게임에 소스를 확인하실 수 있습니다 : http://jsweeneydev.net84.net/apps.php

http://jsweeneydev.net84.net/apps/pong/game/script.js

+0

이것은 정확히 내가 원했던 것처럼 보입니다! 일단 코드를 테스트하면 답을 받아 들일 것입니다. –

+1

문제가 있으면 알려주세요 (여기에는 2 가지 가능성이 있습니다 : 패들이 가운데로 바로 가지 않고 상단/하단 경계를 넘을 수 있습니다). 코드는 실제로 예제 일 뿐이며 코딩 스타일이 다르므로 원하는대로 다시 프로그래밍해야 할 수 있습니다.) –

+0

이 코드는 완벽하게 작동하지만 추가가 2 건 있습니다. 1. 패들은 패들의 속도를 수정하는 파워 업이 있기 때문에 속도를 변경하지 않고 패들이 이것을 할 수있게합니다. 플레이어가 할 수 없으므로 AI가 정상적으로 느려지지 않을 것입니다. 2. 인공 지능을 파워 업을 두 번째 우선 순위로 삼으십시오 (공이 캔버스의 40 % 범위 내에 있지 않은 경우). 내가 그 일을 성취하기 위해 할 수있는 일에 대한 아이디어가 있습니까? –