Advertisement
Guest User

task

a guest
Sep 12th, 2019
400
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.15 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. struct sPos {
  5.     sPos() { x = 0; y = 0; }
  6.     //sPos(int aX, int aY) { x = aX; y = aY; }
  7.     int x;
  8.     int y;
  9. };
  10.  
  11. struct sSize
  12. {
  13.     sSize() { width = 0; height = 0; }
  14.     //sSize(int aW, int aH) { width = aW; height = aW; }
  15.     int width;
  16.     int height;
  17. };
  18.  
  19. struct sRect
  20. {
  21.     sRect() = default;
  22.     sRect(int x, int y, int w, int h) { pos.x = x; pos.y = y; size.width = w; size.height = h; }
  23.     sPos pos;
  24.     sSize size;
  25.     bool intersects(const sRect& other) {
  26.         return !((other.pos.x + other.size.width <= pos.x) ||
  27.                  (other.pos.y + other.size.height <= pos.y) ||
  28.                  (other.pos.x >= pos.x + size.width) ||
  29.                  (other.pos.y >= pos.y + size.height));
  30.     }
  31. };
  32.  
  33. enum class eDirection {
  34.     UP,
  35.     LEFT,
  36.     RIGHT,
  37.     DOWN
  38. };
  39.  
  40. struct sCar {
  41.     sRect rect;
  42.     eDirection dir = eDirection::UP;
  43.     int speed = 0;
  44.     virtual void move() {
  45.         switch (dir) {
  46.             case eDirection::UP:
  47.                 rect.pos.y += speed;
  48.             case eDirection::DOWN:
  49.                 rect.pos.y -= speed;
  50.             case eDirection::RIGHT:
  51.                 rect.pos.x += speed;
  52.             case eDirection::LEFT:
  53.                 rect.pos.x -= speed;
  54.         }
  55.     }
  56.  
  57.     sRect getFuturePos() {
  58.         switch (dir) {
  59.             case eDirection::UP:
  60.                 return sRect(rect.pos.x, rect.pos.y + speed, rect.size.width, rect.size.height);
  61.             case eDirection::DOWN:
  62.                 return sRect(rect.pos.x, rect.pos.y - speed, rect.size.width, rect.size.height);
  63.             case eDirection::RIGHT:
  64.                 return sRect(rect.pos.x + speed, rect.pos.y, rect.size.width, rect.size.width);
  65.             case eDirection::LEFT:
  66.                 return sRect(rect.pos.x - speed, rect.pos.y, rect.size.width, rect.size.height);
  67.         }
  68.     }
  69.  
  70.     bool needPassOtherCar(sCar* otherCar) {
  71.         bool result = false;
  72.         auto otherdir = otherCar->dir;
  73.         switch (dir) {
  74.             case eDirection::UP:
  75.                 if (otherdir == eDirection::LEFT)
  76.                     result = true;
  77.                 break;
  78.             case eDirection::DOWN:
  79.                 if (otherdir == eDirection::RIGHT)
  80.                     result = true;
  81.                 break;
  82.             case eDirection::RIGHT:
  83.                 if (otherdir == eDirection::UP)
  84.                     result = true;
  85.                 break;
  86.             case eDirection::LEFT:
  87.                 if (otherdir == eDirection::DOWN)
  88.                     result = true;
  89.                 break;
  90.         }
  91.         return result;
  92.     }
  93.  
  94.     //virtual ~sCar() = 0;
  95.  
  96.     virtual int getFuel() = 0;
  97.     virtual void refill(int count) = 0;
  98. };
  99.  
  100. struct sGasEngine : virtual sCar {
  101.     int getFuel() override { return fuel; }
  102.     void refill(int count) override { fuel += count; }
  103.     void move() override { fuel--; sCar::move(); }
  104.     int fuel = 0;
  105. };
  106.  
  107. struct sElectroCar : virtual sCar {
  108.     int getFuel() override { return charge; }
  109.     void refill(int count) override { charge += count; }
  110.     void move() override { charge--; sCar::move(); }
  111.     int charge = 0;
  112. };
  113.  
  114. struct sHybrid : sGasEngine, sElectroCar {
  115.     void refill(int count) override { charge += count / 2; fuel += count / 2; }
  116.     int getFuel() override { return charge + fuel; }
  117.     void move() override {
  118.         if (rand() % 2 == 0)
  119.             sElectroCar::move();
  120.         else
  121.             sGasEngine::move();
  122.     }
  123. };
  124.  
  125. std::vector<sCar*> asdasd;
  126. const int initialCarsCount = 10;
  127.  
  128. #define SCREEN_WIDTH 1024
  129. #define SCREEN_HEIGHT 768
  130.  
  131. void spawnCarFromTop() {
  132.     sCar* car;
  133.     int carType = rand();
  134.     if (carType % 3 == 0) {
  135.         car = new sGasEngine();
  136.     }
  137.     else if (carType % 3 == 1) {
  138.         car = new sElectroCar();
  139.     }
  140.     else /*if (carType % 3 == 2)*/ {
  141.         car = new sHybrid();
  142.     }
  143.     car->rect = sRect(SCREEN_WIDTH / 2, SCREEN_HEIGHT, 100, 100);
  144.     car->speed = 1;
  145.     car->dir = eDirection::DOWN;
  146. }
  147.  
  148. void spawnCarFromBot() {
  149.     sCar* car;
  150.     int carType = rand();
  151.     if (carType % 3 == 0) {
  152.         car = new sGasEngine();
  153.     }
  154.     else if (carType % 3 == 1) {
  155.         car = new sElectroCar();
  156.     }
  157.     else/* if (carType % 3 == 2)*/ {
  158.         car = new sHybrid();
  159.     }
  160.     car->rect = sRect(SCREEN_WIDTH / 2, 0, 100, 100);
  161.     car->speed = 1;
  162.     car->dir = eDirection::UP;
  163. }
  164.  
  165. void SpawnCarFromLeft() {
  166.     sCar* car;
  167.     int carType = rand();
  168.     if (carType % 3 == 0) {
  169.         car = new sGasEngine();
  170.     }
  171.     else if (carType % 3 == 1) {
  172.         car = new sElectroCar();
  173.     }
  174.     else /*if (carType % 3 == 2)*/ {
  175.         car = new sHybrid();
  176.     }
  177.     car->rect = sRect(0, SCREEN_HEIGHT / 2, 100, 100);
  178.     car->speed = 1;
  179.     car->dir = eDirection::RIGHT;
  180. }
  181.  
  182. void spawnCarFromRight() {
  183.     sCar* car;
  184.     int carType = rand();
  185.     if (carType % 3 == 0) {
  186.         car = new sGasEngine();
  187.     }
  188.     else if (carType % 3 == 1) {
  189.         car = new sElectroCar();
  190.     }
  191.     else /*if (carType % 3 == 2)*/ {
  192.         car = new sHybrid();
  193.     }
  194.     car->rect = sRect(SCREEN_WIDTH, SCREEN_HEIGHT / 2, 100, 100);
  195.     car->speed = 1;
  196.     car->dir = eDirection::LEFT;
  197. }
  198.  
  199. void spawnCar() {
  200.     if (rand() % 4 == 1)
  201.         spawnCarFromRight();
  202.     else if (rand() % 4 == 2)
  203.         spawnCarFromTop();
  204.     else if (rand() % 4 == 3)
  205.         spawnCarFromBot();
  206.     else if (rand() % 4 == 4)
  207.         SpawnCarFromLeft();
  208. }
  209.  
  210. void /*bool*/ main_loop() {
  211.     for (auto car : asdasd) {
  212.         for (auto car22 : asdasd) {
  213.             if (car->getFuturePos().intersects(car22->getFuturePos())) {
  214.                 if (car->needPassOtherCar(car22))
  215.                     car->move();
  216.             }
  217.             else {
  218.                 car22->move();
  219.             }
  220.         }
  221.         if (!(car->rect.pos.x <= 0 || car->rect.pos.x >= SCREEN_WIDTH
  222.             || car->rect.pos.y <= 0 || car->rect.pos.y >= SCREEN_HEIGHT))
  223.             spawnCar();
  224.     }
  225.     //return main_loop();
  226. }
  227.  
  228. int main(int argc, char** argv) {
  229.     for (auto i = 0; i < initialCarsCount; ++i) {
  230.         spawnCar();
  231.     }
  232.     main_loop();
  233.     return 0;
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement