Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| products:laboratory_iot_c:exp55 [2024/12/15 17:47] – [Программный код эксперимента] labuser30 | products:laboratory_iot_c:exp55 [2024/12/15 18:04] (текущий) – [Программный код эксперимента] labuser30 | ||
|---|---|---|---|
| Строка 14: | Строка 14: | ||
| ==== Программный код эксперимента ==== | ==== Программный код эксперимента ==== | ||
| - | < | + | < |
| #include < | #include < | ||
| #include < | #include < | ||
| Строка 172: | Строка 172: | ||
| } | } | ||
| }; | }; | ||
| - | |||
| - | Button btn_up(16, HIGH); | ||
| - | Button btn_down(15, | ||
| - | Button btn_left(12, | ||
| - | Button btn_right(0, | ||
| const int boxes_number = 3; | const int boxes_number = 3; | ||
| Строка 193: | Строка 188: | ||
| Man man(& | Man man(& | ||
| + | |||
| + | Button btn_up(16, HIGH); | ||
| + | Button btn_down(15, | ||
| + | Button btn_left(12, | ||
| + | Button btn_right(0, | ||
| bool canMove(Pos pos) { | bool canMove(Pos pos) { | ||
| Строка 268: | Строка 268: | ||
| Pos not_pos = {-1, -1}; | Pos not_pos = {-1, -1}; | ||
| - | if (!(new_pos == not_pos)){ | + | if (!(new_pos == not_pos)) { |
| int box = feelBox(new_pos); | int box = feelBox(new_pos); | ||
| - | if (box >= 0 && canMove(new_pos_next)){ | + | if (box >= 0 && canMove(new_pos_next)) { |
| if (boxOnGate(new_pos_next)) boxes[box].setOnGate(true); | if (boxOnGate(new_pos_next)) boxes[box].setOnGate(true); | ||
| else boxes[box].setOnGate(false); | else boxes[box].setOnGate(false); | ||
| Строка 281: | Строка 281: | ||
| for (int i = 0; i < gates_number; | for (int i = 0; i < gates_number; | ||
| - | if (feelBox(gates[i].getPos()) == -1 and !(man.getPos() == gates[i].getPos())) gates[i].draw(); | + | if (feelBox(gates[i].getPos()) == -1 and !(man.getPos() == gates[i].getPos())) |
| + | | ||
| + | } | ||
| } | } | ||
| Строка 298: | Строка 300: | ||
| if (win) reader.drawBMP("/ | if (win) reader.drawBMP("/ | ||
| } | } | ||
| - | |||
| </ | </ | ||
| Строка 305: | Строка 306: | ||
| '' | '' | ||
| - | < | + | < |
| - | def canMove(x,y): | + | bool canMove(Pos pos) { |
| - | if (Map[y][x]): | + | if (Map[pos.y][pos.x]) return |
| - | | + | else return |
| - | else: | + | } |
| - | | + | |
| </ | </ | ||
| - | Функция '' | + | Функция '' |
| - | < | + | |
| - | def feelBox(x,y): | + | < |
| - | for B in Boxes: | + | int feelBox(Pos pos) { |
| - | if B.getPos() == (x,y): | + | for (int i = 0; i < boxes_number; |
| - | return | + | if (boxes[i].getPos() == pos) return i; |
| - | | + | } |
| + | | ||
| + | } | ||
| </ | </ | ||
| - | Функция '' | + | Функция '' |
| - | < | + | |
| - | def boxFeelGate(x,y): | + | < |
| - | for G in Gates: | + | bool boxOnGate(Pos pos) { |
| - | if G.getPos() == (x,y): | + | for (int i = 0; i < gates_number; |
| - | | + | if (gates[i].getPos() == pos) return |
| - | return | + | } |
| + | | ||
| + | } | ||
| </ | </ | ||
| Строка 334: | Строка 338: | ||
| Если нажатие было и новая координата определена, | Если нажатие было и новая координата определена, | ||
| - | < | + | < |
| - | | + | |
| </ | </ | ||
| - | Если ящик есть, значит мы должны двигаться вместе с ящиком. Но для этого нужно проверить может ли передвинуться ящик (нет ли стены перед ящиком). | + | Если ящик есть |
| - | <code python[enable_line_numbers=" | + | <code python[enable_line_numbers=" |
| - | if B and canMove(newPosNext[0], | + | if (box >= 0 && |
| </ | </ | ||
| - | Если все в порядке и ящик может передвинуться, | + | Если все в порядке и ящик может передвинуться, |
| После чего передвигаем ящик и кладовщика в новую координату. | После чего передвигаем ящик и кладовщика в новую координату. | ||
| Строка 350: | Строка 354: | ||
| Далее идет вспомогательная логика. В частности мы перерисовываем цели, если на них нет ящика или кладовщика. Это нужно, чтобы после прохождения ящика или кладовщика по цели они прорисовывались заново, | Далее идет вспомогательная логика. В частности мы перерисовываем цели, если на них нет ящика или кладовщика. Это нужно, чтобы после прохождения ящика или кладовщика по цели они прорисовывались заново, | ||
| - | < | + | < |
| - | for G in Gates: | + | for (int i = 0; i < gates_number; |
| - | gPos = G.getPos() | + | if (feelBox(gates[i].getPos()) == -1 and !(man.getPos() |
| - | if not (feelBox(gPos[0], gPos[1])) and gPos != man.getPos(): | + | |
| - | G.draw() | + | } |
| + | } | ||
| </ | </ | ||
| - | Далее идет проверка условия выигрыша. Игра считается выигранной когда все ящики установлены на свои цели. Для этого мы проверяем условие нахождения ящика на цели для каждого ящика. Если у всех ящиков соблюдается данное условие, | + | Далее идет проверка условия выигрыша. Игра считается выигранной когда все ящики установлены на свои цели. Для этого мы проверяем условие нахождения ящика на цели для каждого ящика. Если у всех ящиков соблюдается данное условие, |
| - | < | + | < |
| - | win = 1 | + | |
| - | for B in Boxes: | + | |
| - | if (not B.getOnGate()): | + | |
| - | win = 0 | + | { |
| - | break | + | |
| - | + | win = false; | |
| - | if (win): | + | break; |
| - | tft.draw_bmp(0, 16, 'win.bmp') | + | } |
| - | raise SystemExit | + | } |
| + | |||
| + | | ||
| </ | </ | ||