일반 전략
Pong은 간단한 게임이므로 컴퓨터 AI에 간단한 2 단계 전략을 제공 할 수 있습니다.
모델 반응 시간 - 의사 결정을 하기 전에 일정 기간 기다리기
모델 정확도 - 컴퓨터가 볼의 착륙 지점을 정확하게 알고 컴퓨터에 오류가없는 것처럼 보이는 임의의 오류 요인을 추가합니다.
우리는 게임이 느슨해지기 시작하면 컴퓨터 기술을 더 잘 발달 시키거나 컴퓨터가 지배적 일 경우 더 나쁘게 만들어 게임의 균형을 유지하려고 할 수 있습니다.
Levels: [
{aiReaction: 0.2, aiError: 40}, // 0: ai is losing by 8
{aiReaction: 0.3, aiError: 50}, // 1: ai is losing by 7
{aiReaction: 0.4, aiError: 60}, // 2: ai is losing by 6
{aiReaction: 0.5, aiError: 70}, // 3: ai is losing by 5
{aiReaction: 0.6, aiError: 80}, // 4: ai is losing by 4
{aiReaction: 0.7, aiError: 90}, // 5: ai is losing by 3
{aiReaction: 0.8, aiError: 100}, // 6: ai is losing by 2
{aiReaction: 0.9, aiError: 110}, // 7: ai is losing by 1
{aiReaction: 1.0, aiError: 120}, // 8: tie
{aiReaction: 1.1, aiError: 130}, // 9: ai is winning by 1
{aiReaction: 1.2, aiError: 140}, // 10: ai is winning by 2
{aiReaction: 1.3, aiError: 150}, // 11: ai is winning by 3
{aiReaction: 1.4, aiError: 160}, // 12: ai is winning by 4
{aiReaction: 1.5, aiError: 170}, // 13: ai is winning by 5
{aiReaction: 1.6, aiError: 180}, // 14: ai is winning by 6
{aiReaction: 1.7, aiError: 190}, // 15: ai is winning by 7
{aiReaction: 1.8, aiError: 200} // 16: ai is winning by 8
],
패들 예측
패들 AI는이 전략을 따릅니다.
- 공이 떨어져 나가면 아무것도하지 마라.
- 그렇지 않으면 공이 코트의 패들 가장자리와 만나는 지점을 예측하십시오.
- 우리가 예측을 한다면 위아래로 움직여 그것을 만난다.
ai: function(dt, ball) {
if (((ball.x < this.left) && (ball.dx < 0)) ||
((ball.x > this.right) && (ball.dx > 0))) {
this.stopMovingUp();
this.stopMovingDown();
return;
}
this.predict(ball, dt);
if (this.prediction) {
if (this.prediction.y < (this.top + this.height/2 - 5)) {
this.stopMovingDown();
this.moveUp();
}
else if (this.prediction.y > (this.bottom - this.height/2 + 5)) {
this.stopMovingUp();
this.moveDown();
}
else {
this.stopMovingUp();
this.stopMovingDown();
}
}
},
예측 코드는 약간 까다 롭습니다.
첫째, 반응 시간에 도달 할 때까지 아무것도 하지 않습니다.
둘째, 무한히 큰 코트를 가정 한 공의 절편을 계산하십시오.
셋째, 패들쪽에 도달 할 때까지 위쪽 및 아래쪽 벽에서 반복적으로 예측을 바운스합니다.
마지막으로 우리의 오차 요인을 적용하여 이것이 '추측'합니다.
predict: function(ball, dt) {
// only re-predict if the ball changed direction, or its been some amount of time since last prediction
if (this.prediction &&
((this.prediction.dx * ball.dx) > 0) &&
((this.prediction.dy * ball.dy) > 0) &&
(this.prediction.since < this.level.aiReaction)) {
this.prediction.since += dt;
return;
}
var pt = Pong.Helper.ballIntercept(ball, {left: this.left, right: this.right, top: -10000, bottom: 10000}, ball.dx * 10, ball.dy * 10);
if (pt) {
var t = this.minY + ball.radius;
var b = this.maxY + this.height - ball.radius;
while ((pt.y < t) || (pt.y > b)) {
if (pt.y < t) {
pt.y = t + (t - pt.y);
}
else if (pt.y > b) {
pt.y = t + (b - t) - (pt.y - b);
}
}
this.prediction = pt;
}
else {
this.prediction = null;
}
if (this.prediction) {
this.prediction.since = 0;
this.prediction.dx = ball.dx;
this.prediction.dy = ball.dy;
this.prediction.radius = ball.radius;
this.prediction.exactX = this.prediction.x;
this.prediction.exactY = this.prediction.y;
var closeness = (ball.dx < 0 ? ball.x - this.right : this.left - ball.x) / this.pong.width;
var error = this.level.aiError * closeness;
this.prediction.y = this.prediction.y + Game.random(-error, error);
}
},
이 게임은 이제 이 데모가있는 1 인 및 2 인 게임으로 거의 완벽합니다.
'Phaser JS' 카테고리의 다른 글
JavaScript로 Slither.io를 만드는 법 : Part 2 - Snake (0) | 2017.08.18 |
---|---|
JavaScript로 Slither.io를 만드는 법 : Part 1 - 소개 (0) | 2017.08.16 |
자바스크립트로 퐁(Pong) 게임 만들기 Part - 4 (0) | 2017.07.20 |
자바스크립트로 퐁(Pong) 게임 만들기 Part - 3 (0) | 2017.07.20 |
자바스크립트로 퐁(Pong) 게임 만들기 Part - 2 (0) | 2017.07.20 |