Показаны различия между двумя версиями страницы.
Следующая версия | Предыдущая версия | ||
products:laboratory_iot:exp55 [2020/06/12 10:02] – создано labuser29 | products:laboratory_iot:exp55 [2024/12/15 17:43] (текущий) – labuser30 | ||
---|---|---|---|
Строка 5: | Строка 5: | ||
==== Схема эксперимента ==== | ==== Схема эксперимента ==== | ||
Схема эксперимента не изменилась. | Схема эксперимента не изменилась. | ||
+ | |||
{{ : | {{ : | ||
- | // | + | // |
+ | {{ : | ||
+ | // | ||
==== Программный код эксперимента ==== | ==== Программный код эксперимента ==== | ||
Строка 118: | Строка 121: | ||
return False | return False | ||
- | tft.initr() | + | tft.initr(tft.BGR) # tft.initr(tft.RGB) #Если вместо синего цвета отображается красный, |
tft.clear(tft.COLOR_BLACK) | tft.clear(tft.COLOR_BLACK) | ||
Строка 212: | Строка 215: | ||
raise SystemExit | raise SystemExit | ||
</ | </ | ||
+ | |||
+ | Мы добавили несколько дополнительных функций. А именно: | ||
+ | |||
+ | '' | ||
+ | |||
+ | <code python[enable_line_numbers=" | ||
+ | def canMove(x, | ||
+ | if (Map[y][x]): | ||
+ | return False | ||
+ | else: | ||
+ | return True | ||
+ | </ | ||
+ | |||
+ | Функция '' | ||
+ | <code python[enable_line_numbers=" | ||
+ | def feelBox(x, | ||
+ | for B in Boxes: | ||
+ | if B.getPos() == (x,y): | ||
+ | return B | ||
+ | return False | ||
+ | </ | ||
+ | |||
+ | Функция '' | ||
+ | <code python[enable_line_numbers=" | ||
+ | def boxFeelGate(x, | ||
+ | for G in Gates: | ||
+ | if G.getPos() == (x,y): | ||
+ | return True | ||
+ | return False | ||
+ | </ | ||
+ | |||
+ | В основном цикле программы мы получаем текущую координату кладовщика и задаем новую координату как (-1, -1). При обнаружении нажатия на кнопку, | ||
+ | |||
+ | Если нажатие было и новая координата определена, | ||
+ | <code python[enable_line_numbers=" | ||
+ | B = feelBox(newPos[0], | ||
+ | </ | ||
+ | |||
+ | Если ящик есть, значит мы должны двигаться вместе с ящиком. Но для этого нужно проверить может ли передвинуться ящик (нет ли стены перед ящиком). | ||
+ | <code python[enable_line_numbers=" | ||
+ | if B and canMove(newPosNext[0], | ||
+ | </ | ||
+ | |||
+ | Если все в порядке и ящик может передвинуться, | ||
+ | |||
+ | После чего передвигаем ящик и кладовщика в новую координату. | ||
+ | |||
+ | Этим описывается вся логика перемещения кладовщика и ящиков. | ||
+ | |||
+ | Далее идет вспомогательная логика. В частности мы перерисовываем цели, если на них нет ящика или кладовщика. Это нужно, чтобы после прохождения ящика или кладовщика по цели они прорисовывались заново, | ||
+ | <code python[enable_line_numbers=" | ||
+ | for G in Gates: | ||
+ | gPos = G.getPos() | ||
+ | if not (feelBox(gPos[0], | ||
+ | G.draw() | ||
+ | </ | ||
+ | |||
+ | Далее идет проверка условия выигрыша. Игра считается выигранной когда все ящики установлены на свои цели. Для этого мы проверяем условие нахождения ящика на цели для каждого ящика. Если у всех ящиков соблюдается данное условие, | ||
+ | <code python[enable_line_numbers=" | ||
+ | win = 1 | ||
+ | for B in Boxes: | ||
+ | if (not B.getOnGate()): | ||
+ | win = 0 | ||
+ | break | ||
+ | | ||
+ | if (win): | ||
+ | tft.draw_bmp(0, | ||
+ | raise SystemExit | ||
+ | </ | ||
+ | |||
+ | Таким образом мы реализовали известную игру Sokoban. | ||
+ | |||
+ | <WRAP center round tip 60%> | ||
+ | Попробуй нарисовать свой уровень с другой конфигурацией стен и другими положениями ящиков и целей | ||
+ | </ | ||