Difference between revisions of "Sokoban"
| Line 13: | Line 13: | ||
  #include "demo.h"  |   #include "demo.h"  | ||
| − | //char smer[256] = "DPDPDVPPPDDVDDPDPDPDVDLDLDDLPLDLPLDLDVPDVLDDVPPPDDVDLDLDVDPLDPDLDVLLLDDDVPPPD";  | + |  //char smer[256] = "DPDPDVPPPDDVDDPDPDPDVDLDLDDLPLDLPLDLDVPDVLDDVPPPDDVDLDLDVDPLDPDLDVLLLDDDVPPPD";  | 
| − | char smer[255] = "DPDPDVPPP";  | + |  char smer[255] = "DPDPDVPPP";  | 
| − | + | ||
| − | void rt(void) {  | + |   void rt(void) {  | 
| − | + |    //rightTurn  | |
| − | + |    setMotor(2, -4000);  | |
| − | + |    setMotor(1, 4000);  | |
| − | }  | + |  }  | 
| − | + | ||
| − | void lt(void) {  | + |   void lt(void) {  | 
| − | + |    //leftTurn  | |
| − | + |    setMotor(1, -4000);  | |
| − | + |    setMotor(2, 4000);  | |
| − | }  | + |  }  | 
| − | void bd(void) {  | + |  void bd(void) {  | 
| − | + |    //backward  | |
| − | + |    setMotor(3, -4000);  | |
| − | }  | + |  }  | 
| − | + | ||
| − | void fd(int distance) {  | + |   void fd(int distance) {  | 
| − | + |    unsigned int endA = countA + distance;  | |
| − | + |    unsigned int endB = countB + distance;  | |
| − | + |    while (countA <= endA && countB <= endB) {  | |
| − | + |      uint8_t ln = senseLine();  | |
| − | + |      uint8_t led1 = (ln >> 3) & 1;  | |
| − | + |      uint8_t led2 = (ln >> 2) & 1;  | |
| − | + |      uint8_t ledx = ln & 1;  | |
| − | + | ||
| − | + |      if (led2 == 1 || ledx == 1) {  | |
| − | + |        led2 = 1;  | |
| − | + |      }  | |
| − | + |      else {  | |
       led2 = 0;  |        led2 = 0;  | ||
| − | + |      }  | |
| − | + |      uint8_t led3 = (ln >> 1) & 1;  | |
| − | + |      if (led1 == 1 && led2 == 1 && led3 == 0) {  | |
| − | + |        lt();  | |
| − | + |      }  | |
| − | + |      if (led1 == 0 && led2 == 1 && led3 == 1) {  | |
| − | + |        rt();  | |
| − | + |      }  | |
| − | + |      setMotor(3, 4000);  | |
| − | + |    }  | |
| − | + |    motorsOff();  | |
| − | }  | + |  }  | 
| − | void back(int distance) {  | + |  void back(int distance) {  | 
| − | + |    unsigned int endA = countA + distance;  | |
| − | + |    unsigned int endB = countB + distance;  | |
| − | + |    while (countA <= endA && countB <= endB) {  | |
| − | + |      //chprintf(BT, "cA = %5d, eA = %5d, CB = %5d, eB = %5d\n\r", countA, endA, countB, endB);  | |
| − | + |      uint8_t ln = senseLine();  | |
| − | + |      uint8_t led1 = (ln >> 3) & 1;  | |
| − | + |      uint8_t led2 = (ln >> 2) & 1;  | |
| − | + |      uint8_t ledx = ln & 1;  | |
| − | + | ||
| − | + |      if (led2 == 1 || ledx == 1) {  | |
| − | + |        led2 = 1;  | |
| − | + |      }  | |
| − | + |      else {  | |
| − | + |        led2 = 0;  | |
| − | + |      }  | |
| − | + |      uint8_t led3 = (ln >> 1) & 1;  | |
| − | + |      if (led1 == 1 && led2 == 1 && led3 == 0) {  | |
| − | + |        //lt  | |
| − | + |        rt();  | |
| − | + |      }  | |
| − | + |      if (led1 == 0 && led2 == 1 && led3 == 1) {  | |
| − | + |        //rt  | |
| − | + |        lt();  | |
| − | + |      }  | |
| − | + |      //chprintf(BT, "dopredu...\r\n");  | |
| − | + |      bd();  | |
| − | + |    }  | |
| − | + |    motorsOff();  | |
| − | }  | + |  }  | 
| − | void turn(const char s) {  | + |  void turn(const char s) {  | 
| − | + |    int d = 11, dis = 3;  | |
| − | + |    if (s == 'v') {  | |
| − | + |      dis = dis + 5;  | |
| − | + |    }  | |
| − | + |    if (s == 'v') {  | |
| − | + |      back(d);  | |
| − | + |    }  | |
| − | + |    else {  | |
     fd(d);  |      fd(d);  | ||
| − | + |    }  | |
| − | + |    unsigned int endA = countA + dis;  | |
| − | + |    unsigned int endB = countB + dis;  | |
| − | + |    while (countA <= endA && countB <= endB) {  | |
| − | + |      if (s == 'l' || s == 'v') {  | |
| − | + |        lt();  | |
| − | + |      }  | |
| − | + |      if (s == 'r') {  | |
| − | + |        rt();  | |
| − | + |      }  | |
| − | + |    }  | |
| − | + | ||
| − | + |    while (true) {  | |
| − | + |      uint8_t ln = senseLine();  | |
| − | + |      uint8_t led1 = (ln >> 3) & 1;  | |
| − | + |      uint8_t led2 = (ln >> 2) & 1;  | |
| − | + |      uint8_t ledx = ln & 1;  | |
| − | + |      if (led2 == 1 || ledx == 1) {  | |
| − | + |        led2 = 1;  | |
| − | + |      }  | |
| − | + |      else {  | |
| − | + |        led2 = 0;  | |
| − | + |      }  | |
| − | + |      uint8_t led3 = (ln >> 1) & 1;  | |
| − | + |      chprintf(BT, "L1 = %5d, L2 = %5d, L3 = %5d\n\r", led1, led2, led3);  | |
| − | + |      if (led1 == 0 && led2 == 1 && led3 == 0) {  | |
| − | + |        break;  | |
| − | + |      }  | |
| − | + |      if (s == 'l' || s == 'v') {  | |
| − | + |        lt();  | |
| − | + |      }  | |
| − | + |      if (s == 'r') {  | |
| − | + |        rt();  | |
| − | + |      }  | |
| − | + |    }  | |
| − | + |    if (s == 'v') {  | |
| − | + |      back(d);  | |
| − | + |    }  | |
| − | + |    else {  | |
| − | + |      fd(d);  | |
| − | + |    }  | |
| − | }  | + |  }  | 
| − | void chod(void) {  | + |  void chod(void) {  | 
| − | + |    int i = 0;  | |
| − | + |    while (smer[i] != '\0') {  | |
| − | + |      if (smer[i] == 'D') {  | |
| − | + |        fd(22);  | |
| + |      }  | ||
| + |      if (smer[i] == 'P') {  | ||
| + |        turn('r');  | ||
| + |      }  | ||
| + |      if (smer[i] == 'L') {  | ||
| + |        turn('l');  | ||
| + |      }  | ||
| + |      chprintf(BT, "==============i++=============");  | ||
| + |      i++;  | ||
| + |    }  | ||
| + |  }  | ||
| + |  void chodd(void) {  | ||
| + |    while (true) {  | ||
| + |      chprintf(BT, "zadajte pismeno: \r\n");  | ||
| + |      uint8_t choice = chSequentialStreamGet(BT);  | ||
| + |      switch (choice) {  | ||
| + |      case 'd':  | ||
| + |        fd(22);  | ||
| + |        break;  | ||
| + |      case 'p':  | ||
| + |        turn('r');  | ||
| + |        break;  | ||
| + |      case 'l':  | ||
| + |        turn('l');  | ||
| + |        break;  | ||
| + |      case 'v':  | ||
| + |        turn('v');  | ||
| + |        break;  | ||
| + |      }  | ||
| + |    }  | ||
| + |  }  | ||
| + |  int main(void) {  | ||
| + |    tatrabotInit();  | ||
| + |    //demo();  | ||
| + |    chod();  | ||
| + |    /*  | ||
| + |     while(true){  | ||
| + |     chprintf(BT, "cA = %5d,  eB = %5d\n\r", countA, countB);  | ||
     }  |      }  | ||
| − | + |      */  | |
| − | + |     chprintf(BT, "end");  | |
| − | + |     motorsOff();  | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − |     chprintf(BT, "  | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
  }  |   }  | ||
| + |   }   | ||
==Video==  | ==Video==  | ||
<youtube>fOhg62UGtd0</youtube>  | <youtube>fOhg62UGtd0</youtube>  | ||
Revision as of 18:58, 15 February 2016
Zadanie nášho projektu
Cieľom nášho projektu Sokoban bolo naprogramovať robota Tatrabot tak, aby zvládol nájsť správne riešenie zadanej hracej plochy viď obr. 1 hry Sokoban k dispozícii sme mali 4 hracie plochy ktoré sú na obr. 1 a následne týmto nájdeným riešením odohrať hru do úspešného konca, pričom hracia plocha pozostávala z navzájom kolmých čiar vytvárajúcich mriežku rôznych tvarov obsahujúcu priesečníky reprezentujúce kocky potrebné k odohratiu hry, teda ich dopraveniu na vopred určené miesta zadanej hracej plochy mriežky.
Náš projekt mal 2 fázy. Zatiaľ máme dokončenú prvú fázu kde sme sa zoznámili s robotom TATRABOT vyskúšali sme jeho funkčnosť a naučili sme ho jazdiť po vygenerovanej trase. Druhú časť ktorá generuje trasu sa nám ešte nepodarilo spraviť.
task main()
{
#include "tatrabot.h"
#include "demo.h"
//char smer[256] = "DPDPDVPPPDDVDDPDPDPDVDLDLDDLPLDLPLDLDVPDVLDDVPPPDDVDLDLDVDPLDPDLDVLLLDDDVPPPD";
char smer[255] = "DPDPDVPPP";
 
void rt(void) {
  //rightTurn
  setMotor(2, -4000);
  setMotor(1, 4000);
}
 
void lt(void) {
  //leftTurn
  setMotor(1, -4000);
  setMotor(2, 4000);
}
void bd(void) {
  //backward
  setMotor(3, -4000);
}
 
void fd(int distance) {
  unsigned int endA = countA + distance;
  unsigned int endB = countB + distance;
  while (countA <= endA && countB <= endB) {
    uint8_t ln = senseLine();
    uint8_t led1 = (ln >> 3) & 1;
    uint8_t led2 = (ln >> 2) & 1;
    uint8_t ledx = ln & 1;
 
    if (led2 == 1 || ledx == 1) {
      led2 = 1;
    }
    else {
     led2 = 0;
    }
    uint8_t led3 = (ln >> 1) & 1;
    if (led1 == 1 && led2 == 1 && led3 == 0) {
      lt();
    }
    if (led1 == 0 && led2 == 1 && led3 == 1) {
      rt();
    }
    setMotor(3, 4000);
  }
  motorsOff();
}
void back(int distance) {
  unsigned int endA = countA + distance;
  unsigned int endB = countB + distance;
  while (countA <= endA && countB <= endB) {
    //chprintf(BT, "cA = %5d, eA = %5d, CB = %5d, eB = %5d\n\r", countA, endA, countB, endB);
    uint8_t ln = senseLine();
    uint8_t led1 = (ln >> 3) & 1;
    uint8_t led2 = (ln >> 2) & 1;
    uint8_t ledx = ln & 1;
 
    if (led2 == 1 || ledx == 1) {
      led2 = 1;
    }
    else {
      led2 = 0;
    }
    uint8_t led3 = (ln >> 1) & 1;
    if (led1 == 1 && led2 == 1 && led3 == 0) {
      //lt
      rt();
    }
    if (led1 == 0 && led2 == 1 && led3 == 1) {
      //rt
      lt();
    }
    //chprintf(BT, "dopredu...\r\n");
    bd();
  }
  motorsOff();
}
void turn(const char s) {
  int d = 11, dis = 3;
  if (s == 'v') {
    dis = dis + 5;
  }
  if (s == 'v') {
    back(d);
  }
  else {
   fd(d);
  }
  unsigned int endA = countA + dis;
  unsigned int endB = countB + dis;
  while (countA <= endA && countB <= endB) {
    if (s == 'l' || s == 'v') {
      lt();
    }
    if (s == 'r') {
      rt();
    }
  }
 
  while (true) {
    uint8_t ln = senseLine();
    uint8_t led1 = (ln >> 3) & 1;
    uint8_t led2 = (ln >> 2) & 1;
    uint8_t ledx = ln & 1;
    if (led2 == 1 || ledx == 1) {
      led2 = 1;
    }
    else {
      led2 = 0;
    }
    uint8_t led3 = (ln >> 1) & 1;
    chprintf(BT, "L1 = %5d, L2 = %5d, L3 = %5d\n\r", led1, led2, led3);
    if (led1 == 0 && led2 == 1 && led3 == 0) {
      break;
    }
    if (s == 'l' || s == 'v') {
      lt();
    }
    if (s == 'r') {
      rt();
    }
  }
  if (s == 'v') {
    back(d);
  }
  else {
    fd(d);
  }
}
void chod(void) {
  int i = 0;
  while (smer[i] != '\0') {
    if (smer[i] == 'D') {
      fd(22);
    }
    if (smer[i] == 'P') {
      turn('r');
    }
    if (smer[i] == 'L') {
      turn('l');
    }
    chprintf(BT, "==============i++=============");
    i++;
  }
}
void chodd(void) {
  while (true) {
    chprintf(BT, "zadajte pismeno: \r\n");
    uint8_t choice = chSequentialStreamGet(BT);
    switch (choice) {
    case 'd':
      fd(22);
      break;
    case 'p':
      turn('r');
      break;
    case 'l':
      turn('l');
      break;
    case 'v':
      turn('v');
      break;
    }
  }
}
int main(void) {
  tatrabotInit();
  //demo();
  chod();
  /*
   while(true){
   chprintf(BT, "cA = %5d,  eB = %5d\n\r", countA, countB);
   }
   */
  chprintf(BT, "end");
  motorsOff();
}
 } 
Video