Выбрать главу

Сам код вполне понятен - если наклон платы превышает пороговую величину, мы гасим старый пиксел командой unplot, увеличиваем (или уменьшаем) значение координаты, и зажигаем пиксел снова командой plot. Кстати, в данном случае бывает полезно переключиться в режим прямого редактирования кода - однотипные блоки и логические выражения вводить так гораздо быстрее. Полностью код выглядит так:

let y = 2

let x = 2

led.plot(x, y)

basic.forever(() => {

if (input.acceleration(Dimension.X) < -200 && x > 0) {

led.unplot(x, y)

x = x - 1

led.plot(x, y)

basic.pause(100)

}

if (input.acceleration(Dimension.X) > 200 && x < 4) {

led.unplot(x, y)

x = x + 1

led.plot(x, y)

basic.pause(100)

}

})

Запускаем программу, убеждаемся что можем управлять точкой с помощью наклонов платы:

Самостоятельная работа #1: Добавить обработку второй координаты y, чтобы точка могла двигаться не только по горизонтали, но и по вертикали.

Самостоятельная работа #2: Продумать и реализовать сценарий мини-игры, где сверху будут падать объекты, а с помощью “каретки” их можно будет ловить. “Каретку” можно будет сделать их двух точек, находящихся на нижней плоскости (y-координата всегда будет = 4), наклонами платы ее можно будет двигать вправо-влево. Для хранения информации о падающих объектах нужно будет добавить отдельные переменные.

5.5 Игра “Змейка”

Мы уже умеем двигать точку по экрану. Рассмотрим более сложную задачу - будем двигать “змейку”, состоящую из нескольких точек.

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

Шаг 1. Продумаем структуру данных. В нашем случае, мы будем использовать два массива для хранения координат x и y. Наша “змея”, таким образом, будет представляться в памяти следующим образом:

Важно иметь в виду, что массивы нумеруются с нуля. Соответственно, элемент x[0], y[0] указывает на “хвост” змеи, элемент x[3], y[3] указывает на “голову”. Обозначим количество элементов как N=4, это позволит легко менять длину змеи, изменив всего один параметр. Тогда “головой” будет элемент x[N-1], y[N-1].

К сожалению, создавать массивы в визуальном редакторе не очень удобно. Проще переключиться в режим кода, и добавить следующий текст:

let N = 4

let x: number[] = [0, 1, 2, 3]

let y: number[] = [4, 4, 4, 4]

Мы создали массивы x и y и проинициализировали их начальными значениями. Теперь выведем точки на экран:

for (let p = 0; p < N; p++) {

led.plot(x[p], y[p])

}

Шаг-2. Движение “змеи”. Это пожалуй, самая сложная часть данной задачи.

Чтобы передвинуть змею, мы должны:

- выключить крайний элемент в “хвосте”,

- сдвинуть все остальные элементы массива влево (первый станет нулевым, второй первым и пр),

- изменить значение элемента в “голове” и включить новый светодиод.

Графически для массива X это выглядит так (для Y все аналогично):

Все это несложно по сути, главное не ошибиться с индексами и не перепутать, что куда сдвигается. Новое значение xN будет вычисляться из старого, в зависимости от того, куда движется змея. Напишем универсальную функцию moveSnake, которая сдвигает змею в любую сторону.

function moveSnake(dx: number, dy: number) {

if (x[N - 1] + dx < 0 || x[N - 1] + dx > 4 ||

y[N - 1] + dy < 0 || y[N - 1] + dy > 4) {

return

}

led.unplot(x[0], y[0])

for (let q = 0; q < N - 1; q++) {

x[q] = x[q + 1]

y[q] = y[q + 1]

}

x[N - 1] = x[N - 2] + dx

y[N - 1] = y[N - 2] + dy

led.plot(x[N - 1], y[N - 1])

}

Рассмотрим код подробнее. Параметры dx и dy - приращения координат: если змея движется вправо, то dx=1, если влево, то dx=-1, если вверх то dy=-1, если вниз то dy=1. Т.к. “змея” движется головой вперед, то эти приращения добавляются к координатам “головы”. Но вначале мы проверяем, что “змея” не уйдет за края экрана, и что новые значения не будут меньше 0 или больше 4. Команда led.unplot(x[0], y[0]) выключает последний светодиод в “хвосте” змеи. Затем в цикле for мы сдвигаем все элементы “змеи”, как было показано выше на рисунке. Последним шагом мы формируем новое значение координат “головы”, которое мы определяем как старое значение, плюс новое приращение координат dx, dy. Наконец, нам достаточно включить новый светодиод функцией led.plot(x[N - 1], y[N - 1]).

Шаг-3. Подключение акселерометра. В зависимости от наклона платы, будем двигать “змею” в нужную сторону.

if (input.acceleration(Dimension.X) > 200) {

moveSnake(1, 0)

basic.pause(200)

}

if (input.acceleration(Dimension.X) < -200) {