Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| 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%> | ||
| + | Попробуй нарисовать свой уровень с другой конфигурацией стен и другими положениями ящиков и целей | ||
| + | </ | ||