Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:laboratory_iot_c:exp55 [2024/12/15 17:47] – [Программный код эксперимента] labuser30products:laboratory_iot_c:exp55 [2024/12/15 18:04] (текущий) – [Программный код эксперимента] labuser30
Строка 14: Строка 14:
 ==== Программный код эксперимента ==== ==== Программный код эксперимента ====
  
-<file python Exp55.py[enable_line_numbers="2", start_line_numbers_at="1"]>+<file arduino Exp55.ino[enable_line_numbers="2", start_line_numbers_at="1"]>
 #include <SPI.h> #include <SPI.h>
 #include <Adafruit_ST7735.h> #include <Adafruit_ST7735.h>
Строка 172: Строка 172:
     }     }
 };  }; 
- 
-Button btn_up(16, HIGH); 
-Button btn_down(15, HIGH); 
-Button btn_left(12, HIGH); 
-Button btn_right(0, LOW); 
  
 const int boxes_number = 3; const int boxes_number = 3;
Строка 193: Строка 188:
  
 Man man(&tft, &reader, 5, 6); Man man(&tft, &reader, 5, 6);
 +
 +Button btn_up(16, HIGH);
 +Button btn_down(15, HIGH);
 +Button btn_left(12, HIGH);
 +Button btn_right(0, LOW);
  
 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; i++) {     for (int i = 0; i < gates_number; i++) {
-      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())) 
 +        gates[i].draw(); 
 +      }
     }     }
  
Строка 298: Строка 300:
   if (win) reader.drawBMP("/win.bmp", tft, 0, 0);    if (win) reader.drawBMP("/win.bmp", tft, 0, 0); 
 } }
- 
 </file> </file>
  
Строка 305: Строка 306:
 ''canMove(x, y)'' — проверяет возможность перемещения кладовщика или ящика в заданную координату. Эта функция просто проверяет наличие стены в данном месте. Если ее там нет — значит переместиться в эту координату можно. Если стена есть, то нельзя. ''canMove(x, y)'' — проверяет возможность перемещения кладовщика или ящика в заданную координату. Эта функция просто проверяет наличие стены в данном месте. Если ее там нет — значит переместиться в эту координату можно. Если стена есть, то нельзя.
  
-<code python[enable_line_numbers="2", start_line_numbers_at="136"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="180"]> 
-def canMove(x,y): +bool canMove(Pos pos{ 
-    if (Map[y][x])+  if (Map[pos.y][pos.x]) return false; 
-        return False +  else return true; 
-    else+}
-        return True+
 </code> </code>
  
-Функция ''feelBox(x, y)'' — проверяет наличие ящика в заданной координате. Эта проверка происходит при движении кладовщика. Если перед ним находится ящик, то он должен сдвинуться. Функция перебирает все объекты ящиков и сравнивает их координаты с заданной. Если на пути есть ящик, то возвращается ссылка на объект этого ящика, иначе возвращается False+Функция ''feelBox(x, y)'' — проверяет наличие ящика в заданной координате. Эта проверка происходит при движении кладовщика. Если перед ним находится ящик, то он должен сдвинуться. Функция перебирает все объекты ящиков и сравнивает их координаты с заданной. Если на пути есть ящик, то возвращается индекс объекта этого ящика в массиве, иначе возвращается -1. 
-<code python[enable_line_numbers="2", start_line_numbers_at="142"]> + 
-def feelBox(x,y): +<code arduino[enable_line_numbers="2", start_line_numbers_at="185"]> 
-    for B in Boxes: +int feelBox(Pos pos{ 
-        if B.getPos() == (x,y): +  for (int i = 0; i < boxes_number; i++) { 
-            return B +    if (boxes[i].getPos() == posreturn i; 
-    return False+  } 
 +  return -1; 
 +}
 </code> </code>
  
-Функция ''boxFeelGate(x,y)'' — проверяет находится ли ящик на цели. В качестве параметров функция принимает координату ящика и проверяет наличие цели с такой же координатой. +Функция ''boxOnGate()'' — проверяет находится ли ящик на цели. В качестве параметров функция принимает координату ящика и проверяет наличие цели с такой же координатой. 
-<code python[enable_line_numbers="2", start_line_numbers_at="148"]> + 
-def boxFeelGate(x,y): +<code arduino[enable_line_numbers="2", start_line_numbers_at="192"]> 
-    for G in Gates: +bool boxOnGate(Pos pos{ 
-        if G.getPos() == (x,y)+  for (int i = 0; i < gates_number; i++) { 
-            return True +    if (gates[i].getPos() == pos) return true; 
-    return False+  } 
 +  return false; 
 +}
 </code> </code>
  
Строка 334: Строка 338:
  
 Если нажатие было и новая координата определена, то происходит проверка новой координаты. Сначала мы проверяем есть ли на пути кладовщика ящик: Если нажатие было и новая координата определена, то происходит проверка новой координаты. Сначала мы проверяем есть ли на пути кладовщика ящик:
-<code python[enable_line_numbers="2", start_line_numbers_at="175"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="255"]> 
-        = feelBox(newPos[0], newPos[1])+        int box = feelBox(new_pos);
 </code> </code>
  
-Если ящик есть, значит мы должны двигаться вместе с ящиком. Но для этого нужно проверить может ли передвинуться ящик (нет ли стены перед ящиком). +Если ящик есть (индекс больше или равен 0), значит мы должны двигаться вместе с ящиком. Но для этого нужно проверить может ли передвинуться ящик (нет ли стены перед ящиком). 
-<code python[enable_line_numbers="2", start_line_numbers_at="176"]> +<code python[enable_line_numbers="2", start_line_numbers_at="256"]> 
-        if B and canMove(newPosNext[0], newPosNext[1]):+    if (box >= 0 && canMove(new_pos_next){
 </code> </code>
  
-Если все в порядке и ящик может передвинуться, то проверяем еще одно условие — находится ли ящик на цели. Если да, то B.setOnGate(True), если нет, то B.setOnGate(False).+Если все в порядке и ящик может передвинуться, то проверяем еще одно условие — находится ли ящик на цели. Если да, то boxes[box].setOnGate(True), если нет, то boxes[box].setOnGate(False).
  
 После чего передвигаем ящик и кладовщика в новую координату. После чего передвигаем ящик и кладовщика в новую координату.
Строка 350: Строка 354:
  
 Далее идет вспомогательная логика. В частности мы перерисовываем цели, если на них нет ящика или кладовщика. Это нужно, чтобы после прохождения ящика или кладовщика по цели они прорисовывались заново, но не прорисовывались поверх ящика или кладовщика: Далее идет вспомогательная логика. В частности мы перерисовываем цели, если на них нет ящика или кладовщика. Это нужно, чтобы после прохождения ящика или кладовщика по цели они прорисовывались заново, но не прорисовывались поверх ящика или кладовщика:
-<code python[enable_line_numbers="2", start_line_numbers_at="186"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="266"]> 
-        for G in Gates: +    for (int i = 0; i < gates_number; i++{ 
-            gPos = G.getPos() +      if (feelBox(gates[i].getPos()) == -1 and !(man.getPos() == gates[i].getPos())) { 
-            if not (feelBox(gPos[0], gPos[1])) and gPos !man.getPos(): +        gates[i].draw()
-                G.draw()+      } 
 +    }
 </code> </code>
  
-Далее идет проверка условия выигрыша. Игра считается выигранной когда все ящики установлены на свои цели. Для этого мы проверяем условие нахождения ящика на цели для каждого ящика. Если у всех ящиков соблюдается данное условие, то игра выиграна. А когда она выиграна на дисплее отображается победная картинка осуществляется выход из программы: +Далее идет проверка условия выигрыша. Игра считается выигранной когда все ящики установлены на свои цели. Для этого мы проверяем условие нахождения ящика на цели для каждого ящика. Если у всех ящиков соблюдается данное условие, то игра выиграна. А когда она выиграна на дисплее отображается победная картинка. 
-<code python[enable_line_numbers="2", start_line_numbers_at="191"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="274"]> 
-        win = 1 +  bool win = true; 
-        for B in Boxes: + 
-            if (not B.getOnGate()): +  for (int i = 0; i < boxes_number; i++) 
-                win = 0 +  { 
-                break +    if (!boxes[i].getOnGate()){ 
-         +      win = false; 
-        if (win)+      break; 
-            tft.draw_bmp(0, 16,  'win.bmp') +    } 
-            raise SystemExit+  } 
 + 
 +  if (win) reader.drawBMP("/win.bmp", tft, 0, 0)
 </code> </code>