===== Эксперимент 52. Игровое поле =====
Создадим игру "Сокобан". Sokoban — логическая игра-головоломка, в которой игрок передвигает ящики по лабиринту, показанному в виде плана, с целью поставить все ящики на заданные конечные позиции. Только один ящик может быть передвинут за раз, причём герой игры — «кладовщик» — может только толкать ящики, но не тянуть их.
[[https://ru.wikipedia.org/wiki/Sokoban|Подробнее об игре Sokoban]]
Отображать игру будем на TFT дисплее, управлять кладовщиком будем с помощью кнопок. Игровое поле разобьем на клетки 16 на 16 пикселей. Разрешение дисплея 128 на 160 пикселей. Получается 8 на 10 клеток.
Отображать графику будем с помощью //спрайтов// — маленьких картинок. Мы уже подготовили набор спрайтов, в который входят картинка для стены, ящика, цели и кладовщика. Их нужно загрузить во внутреннюю память микроконтроллера.
{{ :products:esp-iot:sokoban_sprites.zip |}}
Начнем с построения игрового поля — лабиринта. Нужно описать в каких клетках есть стена, а в каких нет. Проще всего это сделать с помощью двумерного массива. Число 1 будет обозначать наличие стены, а 0 — ее отсутствие.
==== Схема эксперимента ====
{{ :products:esp-iot:exp25_mont.png?direct&600 |}}
//Рисунок 1. Монтажная схема эксперимента для дисплея с 8 выводами//
{{ :products:esp-iot:exp25_mont_11pin.png?direct&600 |}}
//Рисунок 2. Монтажная схема эксперимента для дисплея с 11 выводами//
==== Программный код эксперимента ====
from machine import Pin, SPI
from tft import TFT_GREEN
_init()
machine.freq(160000000)
dc = Pin(4, Pin.OUT)
cs = Pin(2, Pin.OUT)
rst = Pin(5, Pin.OUT)
spi = SPI(1, baudrate=40000000, polarity=0, phase=0)
tft = TFT_GREEN(128, 160, spi, dc, cs, rst, rotate=0)
Map = [
[1,1,0,1,1,1,0,1],
[0,1,1,1,1,1,1,0],
[1,1,0,0,0,1,1,1],
[0,1,0,1,0,1,0,1],
[0,1,0,0,0,1,0,1],
[1,1,1,1,0,0,0,1],
[1,0,0,0,0,0,0,1],
[1,0,0,0,1,0,0,1],
[1,0,0,0,1,1,1,1],
[1,1,1,1,1,0,0,0]
]
tft.initr(tft.BGR) # tft.initr(tft.RGB) #Если вместо синего цвета отображается красный, а вместо красного синий
tft.clear(tft.COLOR_BLACK)
x = 0
y = 0
for row in Map:
for col in row:
if col:
tft.draw_bmp(x * 16, y * 16,'brick.bmp')
x+=1
x=0
y+=1
Мы объявили двумерный массив ''Map'' с описанием игровой карты. И в цикле перебираем все ее элементы. Те элементы, где присутствует 1 мы рисуем изображение стены (картинка brick.bmp).