Подход
Искусственный интеллект для этой игры можно создать разными способами. Один из них – сделать так, чтобы бита всегда следовала за мячом. Однако в этом случае у компьютера просто не будет возможности пропустить мяч.
Лучше, если бита компьютера будет медленно двигаться в направлении мяча. Если мяч будет лететь слишком быстро, компьютер может не успеть переместить биту в правильное положение. Кроме того, бита будет двигаться только тогда, когда мяч летит в искусственного противника.
...
Примечание
Словосочетание "искусственный интеллект" звучит таинственно. Однако для игр не так важно, чтобы противник был умным. Компьютер должен только способствовать захватывающей игре. Конечно, в большинстве игр гораздо проще создать безупречного противника. Однако в таком случае игра для компьютера становится беспроигрышной, что не интересно для игрока. Трудность состоит в том, чтобы создать противника, обладающего некими навыками (это сделает игру непростой), но чтобы имеющихся навыков не хватало для беспроигрышной игры.
Для того чтобы счет игры был сохранен, нужны несколько переменных. Однако создать паузу в игре между подачами мяча довольно сложно, поэтому в игре будет два кадра: в первом программа ждет, когда игрок щелкнет по кнопке «serve», а во втором разворачивается само действие игры. Этот второй кадр начинается с установки произвольного начального положения мяча.
Подготовка ролика
В общих чертах ролик аналогичен предыдущему. Вместо трех кадров вам понадобятся четыре: «start game», «start level», «play» и «game over». Перед каждой подачей мяча будет виден кадр «start level». Кадр же «game over» станет отображаться только тогда, когда будет пропущен последний мяч.
Как и в предыдущей игре, вам нужен один клип под названием "paddle" и еще один с именем "computerPaddle". Поведение второй биты будет запрограммировано с помощью языка ActionScript. Так как бита компьютера будет располагаться справа, необходимо убрать правую стенку. При этом верхняя и нижняя стены останутся.
Создание кода
В сценарий предыдущего ролика необходимо внести некоторые изменения. Изменить существующие функции и добавить одну новую. Приведем сценарий клипа «actions», который вызывает новую функцию moveComputerPaddle:
onClipEvent(load) {
_root.startLevel();
}
onClipEvent(enterFrame) {
_root.moveBall();
_root.movePaddle();
_root.moveComputerPaddle();
}
Вместо функции startGameв этой игре используется функция startLevel,которая обладает всеми возможностями функции startGameи в дополнение к ним указывает, что мяч будет двигаться в произвольном направлении. Достичь этого можно, определив, что мяч в 50 % случаев подается вверх, в 50 % случаев – вниз, также в 50 % случаев – влево и в 50 % случаев – вправо. То есть вы получаете четыре возможных направления движения мяча по диагонали.
function startLevel() {
// Определяем начальное положение мяча.
x = ball._x;
y = ball._y;
// Указываем начальную скорость и одно из четырех
// произвольных направлений по диагонали.
dx = 5;
dy = 5;
if (Math.random() < .5) dx *= -1;
if (Math.random() < .5) dy *= -1;
// Прячем курсор.
Mouse.hide();
// Устанавливаем значения констант.
rightWall = 550;
leftWall = 0;
topWall = 0;
bottomWall = 400;
ballRadius = ball._width/2;
passedPaddle = false;
}
Теперь в функцию moveBallвключен код для определения, пролетел ли мяч мимо биты компьютера или нет (10). Он похож на код, обрабатывающий биту игрока (9), и идентичен соответствующему фрагменту кода предыдущей игры. Когда мяч пролетает с правой (11)или с левой (12) стороны, обычно игра возвращается к кадру «start level». Однако если не осталось больше мячей, программа переходит к кадру завершения игры, game over. В зависимости от того, кто пропустил мяч, очко записывается либо игроку, либо компьютеру (переменной playerScoreили computerScore).
function moveBall() {
// Изменяем координаты x и y.
x += dx;
y += dy;
// Проверяем, попал ли мяч в нижнюю стену.
if (y+ballRadius > bottomWall) {
overshoot = (y+ballRadius) – bottomWall;
y -= overshoot*2;
dy *= -1;
}
// Проверяем, попал ли мяч в верхнюю стену.
if (y-ballRadius < topWall) {
overshoot = topWall – (y-ballRadius);
y += overshoot*2;
dy *= -1;
}
(9) →// Находится ли мяч там, где по нему должна ударить бита?
paddleRight = paddle._x+(paddle._width/2);
if ((x-ballRadius < paddleRight) and !passedPaddle) {
// Находится ли там бита?
paddleTop = paddle._y-(paddle._height/2);
paddleBottom = paddle._y+(paddle._height/2);
if ((y > paddleTop) and (y < paddleBottom)) {
// Удар битой.
overshoot = paddleRight – (x-ballRadius);
x += overshoot*2;
dx += -1;
Читать дальше
Конец ознакомительного отрывка
Купить книгу