Подтвердить что ты не робот

Понг: Как весло знает, куда попадет мяч?

После внедрения Pacman и Snake я реализую следующую очень очень классическую игру: Pong.

Реализация на самом деле проста, но у меня остается одна небольшая проблема. Когда один из весла (я не уверен, называется ли это веслом) управляется компьютером, у меня есть проблема с позицией в правильном положении.

Мяч имеет текущее положение, скорость (которая сейчас постоянна) и угол направления. Поэтому я мог бы рассчитать положение, где он попадет в сторону управляемого компьютером весла. И поэтому я могу расположить весло прямо там. Но, однако, в реальной игре есть вероятность того, что компьютерное весло пропустит мяч. Как я могу реализовать эту вероятность?

Если я использую только вероятность сказать 0.5, что компьютерное весло ударит по мячу, проблема решена, но я думаю, что это не так просто.

Из исходной игры я думаю, что вероятность зависит от расстояния между текущей позицией весла и положением шара, попадающего в рамку.

Есть ли у кого-нибудь намеки, как именно это рассчитывается?

4b9b3361

Ответ 1

Мы создали (псевдо-3D) игру для пинг-понга для нашего класса CS в средней школе. Мы сделали это, мы заставили компьютер всегда перемещать весло к мячу, но с максимальной скоростью - таким образом, он мог пропустить мяч, если он слишком далеко, но он все еще умный. Помогает ли это?

Ответ 2

Цитата из очень приятной книги "Гонки на лучах" (Google Books: http://books.google.co.uk/books?id=DqePfdz_x6gC&lpg=PP1&dq=racing%20the%20beam&pg=PA40#v=onepage&q&f=false) оригинальная техника была:

Чтобы помочь имитировать человеческую ошибку, присущую точному позиционированию весла, палочка AI пропускает свою настройку каждые восемь кадров. Получающееся поведение явно незаметно, но это позволяет игроку компьютера стремиться к дрейфу настолько, что он иногда пропускает мяч. Это также технически тривиально реализовать, требуя только одну маску и двоичную операцию И, для которой существует соответствующая инструкция 6502. Программист может проверить, равен ли результат нулю один другой код операции, при необходимости разветвляясь, чтобы пропустить инструкции, которые перемещают весло.

Даже это поведение должно быть слегка изменено, чтобы игра работала вообще. Если игрок AI просто прекратил отслеживать мяч каждые восемь кадров, он был бы безнадежно не синхронизирован в течение нескольких секунд. Чтобы предотвратить это, ИИ следует за вторичной схемой отслеживания шара вблизи верхней и нижней части игрового поля. Если мяч сталкивается с одной из этих стен, в то время как лопатка также выровнена с ним, лопасть корректируется, восстанавливаясь от любого дрейфа, который накапливался с момента последнего удара шара по стене. Результатом является стохастическое несоосность и перестройка компьютерного весла и шара.

Ответ 3

Я думаю, вам нужно, чтобы весло всегда перемещалось из его текущего положения в определенную точку, и именно там, где мяч должен выравниваться по вертикали с веслом. Тогда у вас может быть 50% -ный шанс, что весло переместится в эту точную точку и отклонит мяч, вероятность 25% будет превышать, возможно, на некоторые пиксели X и вероятность 25%, что он будет недосчитан. Еще лучший способ сделать это может заключаться в том, чтобы он переместился в эту позицию на кривую колокола, чтобы каждый раз промахиваться на разные суммы.

Ответ 4

Я не уверен, что "официальный" способ сделать это, но я всегда использовал (псевдокод)

if (ball is above paddle) {
    move paddle up
}
if (ball is below paddle) {
    move paddle down
}

Затем я дал весло немного изменяющуюся скорость, которая была достаточно медленной, чтобы она не всегда могла идти в ногу с мячом. Вид сырой, но он работает.

В этой теме также есть интересные идеи, которые вы можете посмотреть: http://www.gamedev.net/community/forums/topic.asp?topic_id=439576

Ответ 5

В других ответах обсуждается, как выбрать правильное направление для перехода в разных обстоятельствах. Вы также можете добавить время задержки до того, как компьютерный плеер "отреагирует", начиная двигаться в этом направлении, что отражает типичный ответ человеческих игроков.

Ответ 6

Так получилось, что на днях я написал клон-клон просто для удовольствия.

Вы можете воспроизвести здесь и просмотреть исходный код здесь.

ИИ принимает текущую скорость шара и умножает расстояние х от стены. Затем он перемещается к этой расчетной позиции с ограниченной скоростью. Он не учитывает вертикальные отскоки, но это предназначение (чтобы сделать ИИ битым).

Вот соответствующий фрагмент:

/* Update enemy based on simple AI */
enemy.update = function (delta) {
    var impactDistance, impactTime, targetY, speed;
    speed = .25; // a little slower than the human player

    if (ball.vx < 0) {
        // Ball is moving away, AI takes a nap ..
        return;
    }

    // Figure out linear trajectory ..
    impactDistance = width - ball.width - ball.x;
    impactTime = impactDistance / (ball.vx * .25 * 1000);
    targetY = ball.y + (ball.vy * .25 * 1000) * impactTime;

    if (Math.abs(targetY - (this.y + this.height/2)) < 10) {
        // AI doesn't need to move
        return;
    }

    if (targetY < this.y + (this.height / 2)) {
        // Move up if ball is going above paddle
        speed = -speed;
    }

    this.y += speed * delta;
    this.keepInBounds();
};

Ответ 7

после нескольких итераций, если ваш весло (то есть ваш или AI в зависимости от вашей перспективы) слишком близко к верхней или нижней части экрана, просто невозможно покрыть требуемое расстояние. Весло может легко просто следовать за y-значением мяча. Если вы слишком далеко, вы пропустите.

В качестве альтернативы вы можете иметь AI reset в центр после каждого удара или перемещаться в центр до тех пор, пока мяч отходит (т.е. к противнику)

Или более кратко:
 - двигаться в направлении центра, пока мяч отходит  - имитировать y-координату шара, когда он приближается.

отсюда вы можете изменить сложность, сделав механизм имитации y-cop более медленным, чем мяч (более последовательный и, вероятно, то, чем была оригинальная реализация, поскольку трудности абстрагированы от простых коэффициентов скорости) или добавление случайной ошибки в каждое движение или иначе.