Projekty z kursu Systemy operacyjne 2 na PWr
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

so2-bricks.cpp 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #include <cstdlib>
  2. #include <ctime>
  3. #include <iostream>
  4. #include <string>
  5. #include <thread>
  6. #include <vector>
  7. #include <ncurses.h>
  8. #include <unistd.h>
  9. #include "Brick.h"
  10. bool running = true, climate = false;
  11. std::vector<Brick> bricks;
  12. // "Monitor" function
  13. void refreshScreen()
  14. {
  15. while(running == true)
  16. {
  17. clear();
  18. for(int i = 0; i < bricks.size(); i++)
  19. {
  20. // Easter egg (1)
  21. if(climate)
  22. {
  23. mvprintw(bricks[i].getyPosition(), bricks[i].getxPosition(), "*" );
  24. }
  25. else
  26. {
  27. mvprintw(bricks[i].getyPosition(), bricks[i].getxPosition(), "#" );
  28. }
  29. }
  30. refresh();
  31. // Refresh every 0.01 s
  32. usleep(10000);
  33. }
  34. }
  35. int main(int argc, char *argv[])
  36. {
  37. int xMax, yMax, fallingBricks = 0;
  38. std::vector<std::thread> brickThreads;
  39. srand(time(0));
  40. // Easter egg (2)
  41. if(argc == 2)
  42. {
  43. std::string param(argv[1]);
  44. if(param == "--globalwarming")
  45. {
  46. climate = true;
  47. }
  48. }
  49. // Initialize ncurses
  50. initscr();
  51. curs_set(0);
  52. getmaxyx(stdscr, yMax, xMax);
  53. // Initialize scene
  54. Brick::initScene(xMax, yMax);
  55. // Initialize all bricks...
  56. for(int i = 0; i < xMax; i++)
  57. {
  58. // ...with random descent rate in range 0 (slow) to 20 (fast)
  59. Brick brick(i, rand() % 21);
  60. bricks.push_back(brick);
  61. }
  62. // Start monitor
  63. std::thread monitor(refreshScreen);
  64. while(fallingBricks < xMax)
  65. {
  66. // Determine random brick...
  67. int randBrick = rand() % xMax;
  68. while(bricks.at(randBrick).isFalling())
  69. {
  70. // ...which still isn't falling down...
  71. randBrick = rand() % xMax;
  72. }
  73. // ...and launch it with nuclear-powered hammer ;-)
  74. brickThreads.push_back(bricks.at(randBrick).fallThread());
  75. fallingBricks++;
  76. // Random time in range 100 to 500 ms until next fall
  77. unsigned randTime = rand() % 5 + 1;
  78. usleep(100000 * randTime);
  79. }
  80. // Wait for all bricks
  81. for(int i = 0; i < brickThreads.size(); i++)
  82. {
  83. brickThreads.at(i).join();
  84. }
  85. // Stop monitor
  86. sleep(1);
  87. running = false;
  88. monitor.join();
  89. // Close ncurses
  90. endwin();
  91. std::cout << "BRIcks Caban Kernel-thread System v1.1" << std::endl;
  92. std::cout << "Jan Potocki 2018" << std::endl;
  93. std::cout << "(beerware)" << std::endl;
  94. std::cout << std::endl;
  95. std::cout << '"' << "I had a Type-4 keyboard," << std::endl;
  96. std::cout << "Bought with my Sun workstation," << std::endl;
  97. std::cout << "Hacked on it 'til my fingers bled." << std::endl;
  98. std::cout << "Was the winter of '95..." << '"' << std::endl;
  99. // Easter egg (3)
  100. if(climate)
  101. {
  102. std::cout << std::endl;
  103. std::cout << "SEVERE WEATHER ALERT: major snowfall predicted in 48h forecast for Lower Silesia, south-western Poland" << std::endl;
  104. std::cout << "Global warming affecting again!... ;-)" << std::endl;
  105. }
  106. else
  107. {
  108. std::cout << "Beware of BRICKS! ;-)" << std::endl;
  109. }
  110. return 0;
  111. }