Эксперимент 52. Игровое поле

Создадим игру «Сокобан». Sokoban — логическая игра-головоломка, в которой игрок передвигает ящики по лабиринту, показанному в виде плана, с целью поставить все ящики на заданные конечные позиции. Только один ящик может быть передвинут за раз, причём герой игры — «кладовщик» — может только толкать ящики, но не тянуть их.

Отображать игру будем на TFT дисплее, управлять кладовщиком будем с помощью кнопок. Игровое поле разобьем на клетки 16 на 16 пикселей. Разрешение дисплея 128 на 160 пикселей. Получается 8 на 10 клеток. Отображать графику будем с помощью спрайтов — маленьких картинок. Мы уже подготовили набор спрайтов, в который входят картинка для стены, ящика, цели и кладовщика. Их нужно загрузить во внутреннюю память микроконтроллера.

Начнем с построения игрового поля — лабиринта. Нужно описать в каких клетках есть стена, а в каких нет. Проще всего это сделать с помощью двумерного массива. Число 1 будет обозначать наличие стены, а 0 — ее отсутствие.

Схема эксперимента

Рисунок 1. Монтажная схема эксперимента для дисплея с 8 выводами

Рисунок 2. Монтажная схема эксперимента для дисплея с 11 выводами

Программный код эксперимента

Exp52.py
  1. from machine import Pin, SPI
  2. from tft import TFT_GREEN
  3. _init()
  4. machine.freq(160000000)
  5.  
  6.  
  7. dc = Pin(4, Pin.OUT)
  8. cs = Pin(2, Pin.OUT)
  9. rst = Pin(5, Pin.OUT)
  10. spi = SPI(1, baudrate=40000000, polarity=0, phase=0)
  11.  
  12. tft = TFT_GREEN(128, 160, spi, dc, cs, rst, rotate=0)
  13.  
  14. Map = [
  15. [1,1,0,1,1,1,0,1],
  16. [0,1,1,1,1,1,1,0],
  17. [1,1,0,0,0,1,1,1],
  18. [0,1,0,1,0,1,0,1],
  19. [0,1,0,0,0,1,0,1],
  20. [1,1,1,1,0,0,0,1],
  21. [1,0,0,0,0,0,0,1],
  22. [1,0,0,0,1,0,0,1],
  23. [1,0,0,0,1,1,1,1],
  24. [1,1,1,1,1,0,0,0]
  25. ]
  26.  
  27.  
  28. tft.initr(tft.BGR) # tft.initr(tft.RGB) #Если вместо синего цвета отображается красный, а вместо красного синий
  29. tft.clear(tft.COLOR_BLACK)
  30.  
  31. x = 0
  32. y = 0
  33.  
  34. for row in Map:
  35. for col in row:
  36. if col:
  37. tft.draw_bmp(x * 16, y * 16,'brick.bmp')
  38. x+=1
  39. x=0
  40. y+=1

Мы объявили двумерный массив Map с описанием игровой карты. И в цикле перебираем все ее элементы. Те элементы, где присутствует 1 мы рисуем изображение стены (картинка brick.bmp).