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