Guest User

Untitled

a guest
Jan 9th, 2014
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.02 KB | None | 0 0
  1. /*
  2.  * Симуляция воды в 2Д изометрии
  3.  *
  4. **/
  5.  
  6. #include <iostream>
  7. #include <vector>
  8. #include <stdlib.h>
  9. #include <windows.h>
  10. #include <conio.h>
  11.  
  12. using namespace std;
  13. vector< vector<int> > water;    //используется в: Water.
  14. int room_size = 10;             //используется в: Water, Room;
  15. bool debug_water = false;
  16. bool debug_room = false;
  17.  
  18. class Room {
  19. private:
  20.    
  21. public:
  22.     void setRoom() {
  23.         star: ;
  24.         system("cls");
  25.         cout << "\n   set room size         >> ";   cin >> room_size;
  26.         cout << endl;
  27.         if (room_size > 20) {
  28.             cout << "ERROR, parameter is very big. Please, set 1-20 room size \n";
  29.             goto star;
  30.         }
  31.         else if (room_size <= 0) {
  32.             cout << "ERROR, parameter < 0. Please, set 1-20 room size \n";
  33.             goto star;
  34.         }
  35.         debug_room = true; 
  36.     }
  37.        
  38. };
  39.  
  40. class Water {
  41. private:
  42.     vector<int> water_x;
  43.     int water_level = 0;
  44. public:
  45.     void setWater() {
  46.         system("cls");
  47.         star: ;
  48.        
  49.         cout << "\n   default water level in room   >> ";   cin >> water_level;
  50.         cout << endl;
  51.         if (water_level > 7) {
  52.             cout << "\n   ERROR, parameter is very big. Please, set 0-7 water level \n";
  53.             goto star;
  54.         }
  55.         else if (water_level < 0) {
  56.             cout << "\n   ERROR, parameter < 0. Please, set 0-7 water level \n";
  57.             goto star;
  58.         }
  59.         water_x.clear();
  60.         water.clear();
  61.         for (;water.size() < room_size; water.push_back(water_x))
  62.             for (;water_x.size() < room_size; water_x.push_back(water_level)) ;
  63.        
  64.         debug_water = true;
  65.     }
  66.    
  67.     void getWater() {
  68.         star: ;
  69.         system("cls");
  70.        
  71.         cout << "  ";
  72.         for (int x = 0; x < room_size+1; x++) {
  73.             cout << "##";
  74.         }
  75.         cout << "#";
  76.         for (int x = 0; x < room_size; x++) {
  77.             cout << "\n  # ";
  78.             for (int y = 0; y < room_size; y++) {
  79.                 cout << water[x][y] << " ";
  80.             }
  81.             cout << "#";
  82.         }
  83.         cout << "\n  ";
  84.         for (int x = 0; x < room_size+1; x++) {
  85.             cout << "##";
  86.         }
  87.         cout << "#\n";
  88.        
  89.     }
  90.    
  91.     void physix() {
  92.         const int qX1[8] = {1, -1, 1, 0, -1, 1, 0, -1};
  93.         const int qY1[8] = {0, 0, 1, -1, 1, -1, 1, -1};
  94.         int qX;
  95.         int qY;
  96.         vector<int> free_block;
  97.         int block;
  98.         bool physix_debug; //debug
  99.         for (int x = 0; x < room_size; x++) {
  100.             for (int y = 0; y < room_size; y++) {
  101.                 free_block.clear();
  102.                 physix_debug = false; //debug
  103.                 for (int k = 0; k < 9; k++) {
  104.                     qX = qX1[k] + x;
  105.                     qY = qY1[k] + y;
  106.                     if (water[x][y] != 1)
  107.                         if (qX >= 0 && qY >= 0)
  108.                             if (qX < room_size && qY < room_size)
  109.                                 if (water[qX][qY] < water[x][y] && water[x][y] != 0) { 
  110.                                     free_block.push_back(k);
  111.                                     physix_debug = true; //debug
  112.                                 }
  113.                 }
  114.                
  115.                 if (physix_debug == true) {
  116.                     block = rand() % free_block.size();
  117.                     qX = x+qX1[free_block[block]];
  118.                     qY = y+qY1[free_block[block]];
  119.                    
  120.                     water[x][y] -= 1;
  121.                     water[qX][qY]   += 1;
  122.                 }              
  123.             }
  124.         Water::getWater();
  125.         Sleep(10);
  126.         }
  127.     }  
  128. };
  129.  
  130. class Display {
  131. private:
  132. public:
  133.     void menu() {
  134.         system("cls");
  135.         cout << "\n  ####################################\n"
  136.              << "  ###################################\n"
  137.              << "  ##                              ##\n"
  138.              << "  ##       1 - new room           ##\n"
  139.              << "  ##       2 - start              ##\n"
  140.              << "  ##       3 - add block          ##\n"
  141.              << "  ##       4 - del block          ##\n"
  142.              << "  ##       5 - info               ##\n"
  143.              << "  ##       0 - quit               ##\n"
  144.              << "  ##                              ##\n"
  145.              << " ##################################\n"
  146.              << "##################################\n";
  147.         cout << "\n\n\n\n"
  148.              << "Command    >> ";  
  149.     }
  150.    
  151.     void menu_3() {
  152.         int x = 0;
  153.         int y = 0;
  154.         //int type;
  155.         star: ;
  156.         system("cls");
  157.         cout << "\n  ####################################\n"
  158.              << "  ###################################\n"
  159.              << "  ##                              ##\n"
  160.              << "  ##        ADD  BLOCK            ##\n"
  161.              << "  ##                              ##\n"
  162.              << " ##################################\n"
  163.              << "##################################\n";
  164.         cout << "## room size = " << room_size << "x" << room_size << endl << endl;
  165.         cout << "set coordinates X >> ";        cin >> x;
  166.         if (x > room_size || x < 1) {
  167.             error("ucorrect size");
  168.             getch();
  169.             goto star; 
  170.         }
  171.         cout << "\n"
  172.              << "set coordinates Y >> ";        cin >> y;
  173.         if (y > room_size || y < 1) {
  174.             error("ucorrect size");
  175.             getch();
  176.             goto star; 
  177.         }
  178.         x -= 1;
  179.         y -= 1;
  180.         water[x][y] = 7;
  181.     }
  182.    
  183.     void menu_4() {
  184.         int x = 0;
  185.         int y = 0;
  186.         //int type;
  187.         star: ;
  188.         system("cls");
  189.         cout << "\n  ####################################\n"
  190.              << "  ###################################\n"
  191.              << "  ##                              ##\n"
  192.              << "  ##        DELETE BLOCK          ##\n"
  193.              << "  ##                              ##\n"
  194.              << " ##################################\n"
  195.              << "##################################\n";
  196.         cout << "## room size = " << room_size << "x" << room_size << endl << endl;
  197.         cout << "set coordinates X >> ";        cin >> x;
  198.         if (x > room_size || x < 1) {
  199.             error("ucorrect size");
  200.             getch();
  201.             goto star; 
  202.         }
  203.         cout << "\n"
  204.              << "set coordinates Y >> ";        cin >> y;
  205.         if (y > room_size || y < 1) {
  206.             error("ucorrect size");
  207.             getch();
  208.             goto star; 
  209.         }
  210.         x -= 1;
  211.         y -= 1;
  212.         water[x][y] = 0;
  213.     }
  214.    
  215.     void error(string s) {
  216.         system("cls");
  217.         cout << "\n  ####################################\n"
  218.              << "  ###################################\n"
  219.              << "  ##                              ##\n"
  220.              << "  ##       ERROR ERROR            ##\n"
  221.              << "  ##                              ##\n"
  222.              << " ##################################\n"
  223.              << "##################################\n";
  224.         cout << "# " << s << " #\n";
  225.     }
  226.    
  227.     bool debug() {
  228.         if (debug_water == false || debug_room == false) {
  229.             error("ERROR! please, set parameters. Menu > 1 - new room.");
  230.             return false;  
  231.         }
  232.         return true;
  233.     }
  234. };
  235.  
  236. int main() {
  237.     Water objWater;
  238.     Room objRoom;
  239.     Display objDisplay;
  240.    
  241.     int command;
  242.    
  243.     star: ;
  244.     objDisplay.menu();
  245.     cin >> command;
  246.     switch (command) {
  247.         case 1:
  248.             objRoom.setRoom();
  249.             objWater.setWater();
  250.             objWater.getWater();
  251.             cout << "   Please, press button \n";
  252.             getch();
  253.             goto star;
  254.         case 2:
  255.             if (objDisplay.debug() == false) { getch(); goto star; }
  256.             for (int x = 0; x < 10; x++)
  257.                 objWater.physix();
  258.             objWater.getWater();
  259.             cout << "   Please, press button \n";
  260.             getch();
  261.             goto star;
  262.         case 3:
  263.             if (objDisplay.debug() == false) { getch(); goto star; }
  264.             objDisplay.menu_3();
  265.             objWater.getWater();
  266.             cout << "   Please, press button \n";
  267.             getch();
  268.             goto star;
  269.         case 4:
  270.             if (objDisplay.debug() == false) { getch(); goto star; }
  271.             objDisplay.menu_4();
  272.             objWater.getWater();
  273.             cout << "   Please, press button \n";
  274.             getch();
  275.             goto star;
  276.         case 5:
  277.             if (objDisplay.debug() == false) { getch(); goto star; }
  278.             objWater.getWater();
  279.             cout << "   Please, press button \n";
  280.             getch();
  281.             goto star;
  282.         case 0:
  283.             break;
  284.         default:
  285.             objDisplay.error("ucorrect command");
  286.             getch();
  287.             goto star;
  288.     }
  289. }
Advertisement
Add Comment
Please, Sign In to add comment