Advertisement
Domerk

Untitled

Dec 25th, 2013
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //elements.cpp
  2.  
  3. #include "elements.h"
  4.  
  5. #define TL_RADIUS 14;
  6. #define CLENGTH 128;
  7.  
  8. //==================================================
  9. //=============== конструктор машинки ==============
  10. //==================================================
  11. Car::Car(int nx, int ny, int ndirection)
  12. {
  13.     x = nx; // начальные координаты
  14.     y = ny;      
  15.     direction = ndirection; // направление
  16.     srand (time(NULL)); // гинератор псевдослучайных чисел
  17.     Turn = rand()%3; // поворот - случайное число в заданном промежутке
  18.     f = false; // флаги
  19.     p = false;
  20.     v = false;
  21.  
  22.  //   Turn = 1;
  23. }
  24. //==================================================
  25. //============= рисование машинки ==================
  26. //==================================================
  27. void Car::show(QPainter *painter)
  28. {
  29.     // есть 4 варианта направления движения
  30.     // соотвественно есть 4 варианта картинки
  31.  
  32.     if (direction == 1)
  33.     {
  34.         QImage car1("://images/car1.jpg"); // установливаем картинку
  35.         painter->drawImage(x, y, car1); // рисуем картинку
  36.     }
  37.  
  38.     if (direction == 2)
  39.     {
  40.         QImage car2("://images/car2.jpg");
  41.         painter->drawImage(x, y, car2);
  42.     }
  43.  
  44.     if (direction == 3)
  45.     {
  46.         QImage car3("://images/car3.jpg");
  47.         painter->drawImage(x, y, car3);
  48.     }
  49.  
  50.     if (direction == 4)
  51.     {
  52.         QImage car4("://images/car4.jpg");
  53.         painter->drawImage(x, y, car4);
  54.     }
  55.  
  56. }
  57. //==================================================
  58. //=============== движение машинки =================
  59. //==================================================
  60. void Car::moving()
  61. {
  62.     // проверяем, есть ли впереди машинка
  63.     if (v)
  64.     {
  65.         emit siganlXY(direction, x, y, Turn);
  66.         v = false;
  67.         return;
  68.  
  69.     }
  70.  
  71.     // движение при подъезде к перекрёстку, если светофор не зелёный, то стоп
  72.  
  73.  
  74.     if (tc != 3 && !f && !p)
  75.     {
  76.  
  77.         if (direction==1 && y>=10)
  78.         {
  79.             emit siganlXY(direction, x, y, Turn);
  80.             return;
  81.         }
  82.         if (direction==2 && x<=320)
  83.         {
  84.             emit siganlXY(direction, x, y, Turn);
  85.             return;
  86.         }
  87.         if (direction==3 && y<=320)
  88.         {
  89.             emit siganlXY(direction, x, y, Turn);
  90.             return;
  91.         }
  92.         if (direction==4 && x>=10)
  93.         {
  94.             emit siganlXY(direction, x, y, Turn);
  95.             return;
  96.         }
  97.     }
  98.  
  99.  
  100.  
  101.     // как только светофор зелёный, то
  102.  
  103.     if (tc == 3 && !f)
  104.     {
  105.         p = true;
  106.         if (direction == 1) // если движемся сверху вних
  107.         {
  108.             if (Turn == 1 && y >= 165)
  109.             {
  110.                 turn();
  111.                 return;
  112.             }
  113.  
  114.             if ((Turn == 2 || Turn == 0) && y >= 75)
  115.             {
  116.                 turn();
  117.                 return;
  118.             }
  119.         }
  120.  
  121.         if (direction == 2) // если движемся справа налево
  122.         {
  123.             if ((Turn == 1 || Turn == 0) && x <= 150)
  124.             {
  125.                 turn();
  126.                 return;
  127.             }
  128.  
  129.             if (Turn == 2 && x <= 265)
  130.             {
  131.                 turn();
  132.                 return;
  133.             }
  134.         }
  135.  
  136.         if (direction == 3) // если движемся снизу ввуерх
  137.         {
  138.             if ((Turn == 1 || Turn == 0) && y <= 140)
  139.             {
  140.                 turn();
  141.                 return;
  142.             }
  143.  
  144.             if (Turn == 2 && y <= 250)
  145.             {
  146.                 turn();
  147.                 return;
  148.             }
  149.  
  150.         }
  151.  
  152.         if (direction == 4) // если движемся слева направо
  153.         {
  154.             if (Turn == 1 && x >= 150)
  155.             {
  156.                 turn();
  157.                 return;
  158.             }
  159.  
  160.             if ((Turn == 2 || Turn == 0) && x >= 75)
  161.             {
  162.                 turn();
  163.                 return;
  164.             }
  165.         }
  166.     }
  167.  
  168.  
  169.     // если машинка после повторота исчезла за краем экрана, то
  170.     if (f)
  171.     {
  172.         p = false;
  173.  
  174.         if (direction==1 && y>=450)
  175.         {
  176.             x = 150;
  177.             y = -138;
  178.             srand (time(NULL));
  179.             Turn = rand()%3;
  180.             Turn = 1;
  181.             f = false;
  182.             return;
  183.         }
  184.         if (direction==2 && x<=-128)
  185.         {
  186.             x = 460;
  187.             y = 150;
  188.             srand (time(NULL));
  189.             Turn = rand()%3;
  190.             f = false;
  191.             return;
  192.         }
  193.         if (direction==3 && y<=-128)
  194.         {
  195.             x = 250;
  196.             y = 460;
  197.             srand (time(NULL));
  198.             Turn = rand()%3;
  199.             f = false;
  200.             return;
  201.         }
  202.         if (direction==4 && x>=450)
  203.         {
  204.             x = -138;
  205.             y = 250;
  206.             srand (time(NULL));
  207.             Turn = rand()%3;
  208.             f = false;
  209.             return;
  210.         }
  211.     }
  212.  
  213.     // движение в зависимости от направления
  214.  
  215.     if (direction==1)
  216.     {
  217.         y++;
  218.         emit siganlXY(direction, x, y, Turn);
  219.         return;
  220.     }
  221.     if (direction==2)
  222.     {
  223.         x--;
  224.         emit siganlXY(direction, x, y, Turn);
  225.         return;
  226.     }
  227.     if (direction==3)
  228.     {
  229.         y--;
  230.         emit siganlXY(direction, x, y, Turn);
  231.         return;
  232.     }
  233.     if (direction==4)
  234.     {
  235.         x++;
  236.         emit siganlXY(direction, x, y, Turn);
  237.         return;
  238.     }
  239. }
  240.  
  241. //==================================================
  242. //=========== слот для цвета светофора =============
  243. //==================================================
  244.  
  245. void Car::slotTC(int no, int tc_color)
  246. {
  247.     if (no==direction) // если номер светофора совпадает с направлением движения
  248.     {
  249.         tc = tc_color; // сохраняем его текущий цвет
  250.     }
  251. }
  252.  
  253. //==================================================
  254. //=============== слот для машинки =================
  255. //==================================================
  256.  
  257. void Car::slotXY(int dir, int mx, int my, int mt)
  258. {
  259.  /*   if (dir == direction)
  260.     {
  261.         vx = mx;
  262.         vy = my;
  263.         v = true;
  264.     } */
  265.  
  266.     vx = mx;
  267.     vy = my;
  268.  
  269.     if (dir == direction)
  270.     {
  271.         if (direction == 1 && my>y && (my-y-128)<=5)
  272.         {
  273.             v = true;
  274.         }
  275.         if (direction == 2 && x>mx && (x-mx-128)<=5)
  276.         {
  277.             v = true;
  278.         }
  279.         if (direction == 3 && y>my && (y-my-128)<=5 )
  280.         {
  281.             v = true;
  282.         }
  283.         if (direction == 4 && mx>x && (mx-x-128)<=5)
  284.         {
  285.             v = true;
  286.         }
  287.     }
  288.  
  289. }
  290.  
  291. //==================================================
  292. //================ поворот машинки =================
  293. //==================================================
  294.  
  295. void Car::turn()
  296. {
  297.     // значения поворота:
  298.     // 0 - едем прямо
  299.     // 1 - поворачиваем по часовой стрелку
  300.     // 2 - поворачиваем против часовой стрелки
  301.  
  302.     f = true;
  303.  
  304.     if (Turn == 0) // если значение повротора 0
  305.     {
  306.         return; // то едем прямо
  307.     }
  308.  
  309.  
  310.     // если движемся сверху вниз
  311.  
  312.     if (direction == 1 && Turn == 1)
  313.     {
  314.         direction = 4;
  315.         x = 140;
  316.         y = 250;
  317.         emit siganlXY(direction, x, y, Turn);
  318.         return;
  319.     }
  320.  
  321.     if (direction == 1 && Turn == 2)
  322.     {
  323.         direction = 2;
  324.         x = 35;
  325.         y = 150;
  326.         int nx = x + CLENGTH;
  327.         emit siganlXY(direction, nx, y, Turn);
  328.         return;
  329.     }
  330.  
  331.     // если движемся слева направо
  332.  
  333.     if (direction == 2 && Turn == 1)
  334.     {
  335.         direction = 1;
  336.         y++;
  337.         x = 150;
  338.         emit siganlXY(direction, x, y, Turn);
  339.         return;
  340.     }
  341.  
  342.     if (direction == 2 && Turn == 2)
  343.     {
  344.         direction = 3;
  345.         y = 35;
  346.         x = 250;
  347.         int ny = y + CLENGTH;
  348.         emit siganlXY(direction, x, ny, Turn);
  349.         return;
  350.     }
  351.  
  352.     // если движемся снизу вверх
  353.  
  354.     if (direction == 3 && Turn == 1)
  355.     {
  356.         direction = 2;
  357.         x = 145;
  358.         y = 150;
  359.         int nx = x + CLENGTH;
  360.         emit siganlXY(direction, nx, y, Turn);
  361.         return;
  362.     }
  363.  
  364.     if (direction == 3 && Turn == 2)
  365.     {
  366.         direction = 4;
  367.         x = 245;
  368.         y = 250;
  369.         emit siganlXY(direction, x, y, Turn);
  370.         return;
  371.     }
  372.  
  373.     // если движемся справа налево
  374.  
  375.     if (direction == 4 && Turn == 1)
  376.     {
  377.         direction = 3;
  378.         y = 170;
  379.         x = 250;
  380.         int ny = y + CLENGTH;
  381.         emit siganlXY(direction, x, ny, Turn);
  382.         return;
  383.     }
  384.  
  385.     if (direction == 4 && Turn == 2)
  386.     {
  387.         direction = 1;
  388.         y++;
  389.         x = 150;
  390.         emit siganlXY(direction, x, y, Turn);
  391.         return;
  392.     }
  393. }
  394.  
  395. //==================================================
  396. //==================================================
  397. //==================== светофоры ===================
  398. //==================================================
  399. //==================================================
  400.  
  401. TrafficLight::TrafficLight (int npos, int ncolor)
  402. {
  403.     position = npos;
  404.     radius = TL_RADIUS;
  405.     Traffic_Color = ncolor;
  406.  
  407.     if (Traffic_Color == 3) // в зависимости от цвета
  408.     {
  409.         cp = 2; // устанавливаем флаг
  410.     }
  411.     else
  412.     {
  413.         cp = 1;
  414.     }
  415.  
  416.     if (position == 1) // в зависимости от номера
  417.     {
  418.         x1 = 65; // устанавливаем координаты
  419.         y1 = 42;
  420.         x2 = 356;
  421.         y2 = 335;
  422.         a = 0;
  423.     }
  424.  
  425.     if (position == 2)
  426.     {
  427.         x1 = 87;
  428.         y1 = 355;
  429.         x2 = 376;
  430.         y2 = 62;
  431.         a = 270;
  432.     }
  433.  
  434.     if (position == 3)
  435.     {
  436.         x1 = 356;
  437.         y1 = 376;
  438.         x2 = 65;
  439.         y2 = 83;
  440.         a = 180;
  441.     }
  442.     if (position == 4)
  443.     {
  444.         x1 = 336;
  445.         y1 = 62;
  446.         x2 = 46;
  447.         y2 = 355;
  448.         a = 90;
  449.     }
  450.  
  451.     // заполняем массив времени
  452.     // значениями по умолчанию
  453.     // в 10мс
  454.     for (int i = 0; i<4; i++)
  455.     {
  456.         TTtimes+=1000;
  457.         TTtimes+=500;
  458.         TTtimes+=1000;
  459.     }
  460.  
  461. }
  462.  
  463. //==================================================
  464. //==================== светить =====================
  465. //==================================================
  466.  
  467. void TrafficLight::light (int atime)
  468. {
  469.  
  470.     //========== если красный ===========
  471.     if (Traffic_Color==1)
  472.     {
  473.         cp = 1; // флаг
  474.         if (position == 1) // в зависимости от номера
  475.         {
  476.             if (atime >= TTtimes[0]) // обращаемся к соответствующей ячейке массива времени
  477.             {
  478.                 Traffic_Color=2; // меняем цвет на жёлтый
  479.                 emit signalTC(position, Traffic_Color); // высылаем сигнал машинкам
  480.                 emit signalR(position); // высылаем сигнал дороге
  481.                 return; // выходим
  482.             }
  483.         }
  484.         if (position == 2)
  485.         {
  486.             if (atime >= TTtimes[3])
  487.             {
  488.                 Traffic_Color=2;
  489.                 emit signalTC(position, Traffic_Color);
  490.                 emit signalR(position);
  491.                 return;
  492.             }
  493.         }
  494.        if (position == 3)
  495.         {
  496.             if (atime >= TTtimes[6])
  497.             {
  498.                 Traffic_Color=2;
  499.                 emit signalTC(position, Traffic_Color);
  500.                 emit signalR(position);
  501.                 return;
  502.             }
  503.         }
  504.         if (position == 4)
  505.         {
  506.             if (atime >= TTtimes[9])
  507.             {
  508.                 Traffic_Color=2;
  509.                 emit signalTC(position, Traffic_Color);
  510.                 emit signalR(position);
  511.                 return;
  512.             }
  513.         }
  514.  
  515.     }
  516.  
  517.     //============== если жёлтый ==============
  518.  
  519.     if (Traffic_Color==2 && cp == 1) // тут учитывем флаг, т.е. предыдущий цвет
  520.     {
  521.         if (position == 1)
  522.         {
  523.             if (atime >= TTtimes[1])
  524.             {
  525.                 Traffic_Color=3;
  526.                 emit signalTC(position, Traffic_Color);
  527.                 emit signalR(position);
  528.                 return;
  529.             }
  530.         }
  531.         if (position == 2)
  532.         {
  533.             if (atime >= TTtimes[4])
  534.             {
  535.                 Traffic_Color=3;
  536.                 emit signalTC(position, Traffic_Color);
  537.                 emit signalR(position);
  538.                 return;
  539.             }
  540.         }
  541.       if (position == 3)
  542.         {
  543.             if (atime >= TTtimes[7])
  544.             {
  545.                 Traffic_Color=3;
  546.                 emit signalTC(position, Traffic_Color);
  547.                 emit signalR(position);
  548.                 return;
  549.             }
  550.         }
  551.         if (position == 4)
  552.         {
  553.             if (atime >= TTtimes[10])
  554.             {
  555.                 Traffic_Color=3;
  556.                 emit signalTC(position, Traffic_Color);
  557.                 emit signalR(position);
  558.                 return;
  559.             }
  560.         }
  561.  
  562.     }
  563.  
  564.     if (Traffic_Color==2 && cp == 2)
  565.     {
  566.         if (position == 1)
  567.         {
  568.             if (atime >= TTtimes[1])
  569.             {
  570.                 Traffic_Color=1;
  571.                 emit signalTC(position, Traffic_Color);
  572.                 emit signalR(position);
  573.                 return;
  574.             }
  575.         }
  576.         if (position == 2)
  577.         {
  578.             if (atime >= TTtimes[4])
  579.             {
  580.                 Traffic_Color=1;
  581.                 emit signalTC(position, Traffic_Color);
  582.                 emit signalR(position);
  583.                 return;
  584.             }
  585.         }
  586.       if (position == 3)
  587.         {
  588.             if (atime >= TTtimes[7])
  589.             {
  590.                 Traffic_Color=1;
  591.                 emit signalTC(position, Traffic_Color);
  592.                 emit signalR(position);
  593.                 return;
  594.             }
  595.         }
  596.         if (position == 4)
  597.         {
  598.             if (atime >= TTtimes[10])
  599.             {
  600.                 Traffic_Color=1;
  601.                 emit signalTC(position, Traffic_Color);
  602.                 emit signalR(position);
  603.                 return;
  604.             }
  605.         }
  606.  
  607.     }
  608.  
  609.     //============= если зелёный ===================
  610.  
  611.     if (Traffic_Color==3)
  612.     {
  613.         cp = 2;
  614.         if (position == 1)
  615.         {
  616.             if (atime >= TTtimes[2])
  617.             {
  618.                 Traffic_Color=2;
  619.                 emit signalTC(position, Traffic_Color);
  620.                 emit signalR(position);
  621.                 return;
  622.             }
  623.         }
  624.         if (position == 2)
  625.         {
  626.             if (atime >= TTtimes[5])
  627.             {
  628.                 Traffic_Color=2;
  629.                 emit signalTC(position, Traffic_Color);
  630.                 emit signalR(position);
  631.                 return;
  632.             }
  633.         }
  634.        if (position == 3)
  635.         {
  636.             if (atime >= TTtimes[8])
  637.             {
  638.                 Traffic_Color=2;
  639.                 emit signalTC(position, Traffic_Color);
  640.                 emit signalR(position);
  641.                 return;
  642.             }
  643.         }
  644.         if (position == 4)
  645.         {
  646.             if (atime >= TTtimes[11])
  647.             {
  648.                 Traffic_Color=2;
  649.                 emit signalTC(position, Traffic_Color);
  650.                 emit signalR(position);
  651.                 return;
  652.             }
  653.         }
  654.  
  655.     }
  656.  
  657.     emit signalTC(position, Traffic_Color);
  658. }
  659.  
  660.  
  661. //==================================================
  662. //============= рисование светофора ================
  663. //==================================================
  664.  
  665. void TrafficLight::show(QPainter *painter)
  666. {
  667.  
  668.     //устанавливаем цвет и толщину
  669.  
  670.     //карандаша
  671.  
  672.     if (Traffic_Color == 1) // если 1, то красный
  673.     {
  674.         painter->setPen(QPen(Qt::red,1));
  675.         painter->setBrush(QBrush(Qt::red));
  676.     }
  677.  
  678.     if (Traffic_Color == 2) // если 2, то жёлтый
  679.     {
  680.         painter->setPen(QPen(Qt::yellow,1));
  681.         painter->setBrush(QBrush(Qt::yellow));
  682.     }
  683.  
  684.     if (Traffic_Color == 3 ) // если 3, то зелёный
  685.     {
  686.         painter->setPen(QPen(Qt::green,1));
  687.         painter->setBrush(QBrush(Qt::green));
  688.     }
  689.  
  690.     painter->drawChord(x1, y1, 2*radius, 2*radius, 16*a, 16*180);
  691.     painter->drawChord(x2, y2, 2*radius, 2*radius, 16*a, 16*180);
  692.  
  693. }
  694.  
  695. //==================================================
  696. //============== слот для времени ==================
  697. //==================================================
  698.  
  699. void TrafficLight::slotTT(QVector <int> vct)
  700. {
  701.     TTtimes = vct; // принимаем вектор времени
  702. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement