Делаем Тетрис на Arduino

,
0 комментариев    1 892 просмотров    Версия для печати



Собственно, теперь осталось случайно выбирать номер фигуры и отрисовывать ее вокруг падающего блока. Здесь мы для всех 3-ех оставшихся блоков берем из флеш-памяти координаты, переводим их в глобальные координаты матрицы и включаем светодиоды. Кстати, цвет тоже выбирается случайно из 6-ти самых простых и ярких цветов пространства rgb. Угол поворота фигуры при начале раунда тоже задается случайно, а при нажатии кнопки вверх, просто берем для отрисовки следующий набор координат и вращаем по часовой стрелке. Перемещение фигуры работает все также. Сначала стираем фигуру на предыдущем положении, то есть рисуем ее черным цветом, затем в новом положении рисуем уже текущим цветом фигуры. При повороте, опять же, стираем старое положение и просто рисуем новое.
Прошивку можно скачать на странице проекта. Разберем только самую суть. Начнем с проверки левой и правой стенки и днища. С днищем все очень просто, каждый шаг падения смотрим, не достиг ли базовый блок отметки 0 по высоте, это несложно, а вот каждое нажатие на кнопку управления нам нужно смотреть не коснулась ли крайняя точка фигуры боковых стенок матрицы.


Если коснулась, то фигуру не двигать. То же самое касается вращения фигур. Например, если новое положение фигуры будет выходить за стенки, то поворот запретить, а так как все фигуры у нас разной формы, то и крайние блоки у них у всех разные. Можно было бы для каждой фигуры расписать отдельные крайние блоки, чтобы упростить работу микроконтроллеру, но пусть считает, его для этого и придумали.


Все очень просто. А вот следующая задача гораздо более интересная. Нам нужно проверять столкновение с уже лежащими снизу блоками. Если бы у нас был массив, в котором содержится состояние всех клеток поля, то было бы проще, но мы будем использовать массив цветов пикселей ленты, поэтому нас ждет самый крутой «костыль». В чем собственно проблема. Вроде бы все просто, падает у нас скажем зеленая фигура и мы каждый шаг падения, каждое смещение в бок и каждую попытку поворота, должны проверять, не упирается ли фигура в новом положении в уже лежащие фигуры. Если для всех блоков окружающей цвет равен черному или равен цвету фигуры, то разрешаем перемещение в нужном направлении. Это будет работать до тех пор, пока фигура под нами не будет того же цвета, что и падающая фигура. Вот собственно и «костыль»: упавшую фигуру будем перекрашивать в другой цвет. Перекрашивать незаметно для глаз, но заметно для программы. Все, что нужно сделать, это чуть-чуть увеличить яркость текущего цвета фигуры и все.





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


Остался нашему тетрису последний штрих, а именно проверка и очистка заполненных уровней по горизонтали. Тут все просто. После фиксации фигуры в текущем раунде, мы продвигаемся по строкам и сравниваем цвета пикселей с черным. Если во всей строке нет ни одного черного пикселя, то всю строку будем очищать.




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


Счет выводится цифрами, которые хранятся в памяти как набор единиц и нулей, по которым далее включаются или не включаются светодиоды. Собственного так выглядит тетрис, написанный под адресную матрицу. Благодарю за внимание. До новых встреч!

Видео:


Источник

Этот пост может содержать партнерские ссылки. Это означает, что я зарабатываю небольшую комиссию за ссылки, используемые без каких-либо дополнительных затрат для вас. Дополнительную информацию смотрите в моей политике конфиденциальности.

0
Идея
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
0
Описание
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
0
Исполнение
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
0
Полезность
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
Итоговая оценка: 0.0 из 10 (голосов: 0 / История оценок)

0

Читайте также:

Коментарии:

Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.

Вверх