Понг: Откуда весло узнает, куда попадет мяч? - PullRequest
24 голосов
/ 02 января 2011

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

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

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

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

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

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

Ответы [ 7 ]

29 голосов
/ 02 января 2011

Цитата из очень приятной книги «Гонки по лучу» (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 пропускает свою настройку каждые восемь кадров. Получающееся поведение заметно незаметно, но оно позволяет цели компьютерного игрока перемещаться настолько, что иногда пропускает мяч. Это также технически тривиально для реализации, требуя только одну маску и двоичный файлОперация AND, для которой существует соответствующая инструкция 6502. Программист может проверить, равен ли результат нулю, с помощью другого одиночного кода операции, если необходимо выполнить ветвление, чтобы пропустить инструкции, которые перемещают весло.

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

20 голосов
/ 02 января 2011

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

5 голосов
/ 02 января 2011

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

4 голосов
/ 02 января 2011

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

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

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

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

/* 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();
};
4 голосов
/ 02 января 2011

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

4 голосов
/ 02 января 2011

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

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

2 голосов
/ 02 января 2011

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

В качестве альтернативы вы можете сбросить ИИ в центр после каждого удара или двигаться к центру, пока мяч удаляется (то есть в сторону противника)

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

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

...