Advertisement
Guest User

Untitled

a guest
Jan 19th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.66 KB | None | 0 0
  1. //Martwa komórka, która ma dokładnie 3 żywych sąsiadów, staje się żywa w następnej jednostce czasu (rodzi się)
  2. //Żywa komórka z 2 albo 3 żywymi sąsiadami pozostaje nadal żywa; przy innej liczbie sąsiadów umiera (z „samotności” albo „zatłoczenia”).
  3.  
  4. #include <iostream>
  5. #include <time.h>
  6. #include <unistd.h>
  7. #include <cstdlib>
  8. #include <thread>
  9.  
  10. using namespace std;
  11.  
  12. static const int num_threads = 4;
  13. int wiersze = 4;
  14. int kolumny = 8;
  15.  
  16. class TheGameOfLife {
  17.     int ** wskTab;
  18.     int ** wskTMP;
  19.     int x;
  20.     int y;
  21. public:
  22.  
  23.     TheGameOfLife(int wiersze, int kolumny){
  24.         x=wiersze+1;
  25.         y=kolumny+1;
  26.         wskTab = nullptr;
  27.         wskTMP = nullptr;
  28.     }
  29.  
  30.     void createBoard(void) {
  31.         wskTab = new int *[x];
  32.         for (int i = 0; i <= x; i++) {
  33.             wskTab[i] = new int[y];
  34.         }
  35.         //tymczasowy wskaznik
  36.         wskTMP = new int *[x];
  37.         for (int i = 0; i <= x; i++) {
  38.             wskTMP[i] = new int[y];
  39.         }
  40.     }
  41.  
  42.     void initBoard(void) {
  43.         for (int i = 0; i <= x; i++)
  44.             for (int j = 0; j <= y; j++){
  45.                 wskTab[i][j] = 0;
  46.                 wskTMP[i][j] = 0;
  47.             }
  48.     }
  49.  
  50.     void generateRandomBoardFields(void) {
  51.         for (int i = 1; i <= x-1; i++)
  52.             for (int j = 1; j <= y-1; j++)
  53.                 wskTab[i][j] = rand() % 2;
  54.  
  55.         printInitialBoard();
  56.     }
  57.  
  58.     void printInitialBoard(void) {
  59.         for (int i = 1; i <= x-1; i++) {
  60.             cout << endl;
  61.             for (int j = 1; j <= y-1; j++)
  62.                 cout << wskTab[i][j] << " ";
  63.         }
  64.         cout << "\n\n****************" << endl;
  65.     }
  66.  
  67.     void printBoard(int** tmp) {
  68.         for (int i = 1; i <= x-1; i++) {
  69.             cout << endl;
  70.             for (int j = 1; j <= y-1; j++)
  71.                 cout << tmp[i][j] << " ";
  72.         }
  73.         cout << "\n\n****************" << endl;
  74.     }
  75.  
  76.     int ** returnTab(void){
  77.         return wskTab;
  78.     }
  79.  
  80.     int ** returnTabSecond(void){
  81.         return wskTMP;
  82.     }
  83. };
  84.  
  85. void call_from_thread(int **wskTab, int **wskTMP, int ktoryWatek, int num_threads) {
  86.     //ktory watek liczony od 1
  87.  
  88.     int ostatniaKolumna = kolumny/num_threads*ktoryWatek;
  89.     int pierwszaKolumna = ostatniaKolumna - (kolumny/num_threads-1);
  90.  
  91.         for (int i = 1; i <= wiersze; i++) {
  92.             for (int j = pierwszaKolumna; j <= ostatniaKolumna ; j++){
  93.                 int ilosc = 0;
  94.                 if(wskTab[i][j-1]==1){
  95.                     ilosc++;
  96.                 }
  97.                 if(wskTab[i-1][j]==1){
  98.                     ilosc++;
  99.                 }
  100.                 if(wskTab[i-1][j-1]==1){
  101.                     ilosc++;
  102.                 }
  103.                 if(wskTab[i+1][j-1]==1){
  104.                     ilosc++;
  105.                 }
  106.                 if(wskTab[i+1][j]==1){
  107.                     ilosc++;
  108.                 }
  109.                 if(wskTab[i-1][j+1]==1){
  110.                     ilosc++;
  111.                 }
  112.                 if(wskTab[i][j+1]==1){
  113.                     ilosc++;
  114.                 }
  115.                 if(wskTab[i+1][j+1]==1){
  116.                     ilosc++;
  117.                 }
  118.  
  119.                 //jesli martwa, ale 3 sasiadow = zyje
  120.                 if(wskTab[i][j] == 0 && ilosc == 3){
  121.                     wskTMP[i][j] = 1;
  122.                 }
  123.                 //jesli zyje, ale wiecej niz 3 sasiadow/mniej niz 2 = umiera
  124.                 else if (wskTab[i][j] == 1 && (ilosc > 3 || ilosc < 2))
  125.                 {
  126.                     wskTMP[i][j] = 0;
  127.                 }
  128.                 //nic nie rob w innym wypadku
  129.                 else{
  130.                     wskTMP[i][j] = wskTab[i][j];
  131.                 }
  132.             }
  133.         }
  134. }
  135.  
  136. int main() {
  137.     int tmp;
  138.     int **wskTab = nullptr;
  139.     int **wskTemp = nullptr;
  140.     srand(time(NULL));
  141.  
  142.     TheGameOfLife gra(wiersze, kolumny);
  143.     thread t[num_threads];
  144.  
  145.     gra.createBoard();
  146.     gra.initBoard();
  147.     gra.generateRandomBoardFields();;
  148.  
  149.     wskTab = gra.returnTab();
  150.     wskTemp = gra.returnTabSecond();
  151.  
  152.     while(true){
  153.         cout << "\n1 - nastepny krok\n0 - wylacz" << endl;
  154.         cin >> tmp;
  155.  
  156.         if(tmp == 0){
  157.             exit(0);
  158.         }
  159.  
  160.          for (int i = 0; i < num_threads; ++i) {
  161.              t[i] = std::thread(call_from_thread, wskTab, wskTemp, i+1, num_threads);
  162.         }
  163.  
  164.          for (int i = 0; i < num_threads; ++i) {
  165.              t[i].join();
  166.          }
  167.  
  168.          //wskTemp -> plansza po turze
  169.          for (int i = 1; i <= wiersze; i++) {
  170.              for (int j = 1; j <= kolumny; j++){
  171.                      wskTab[i][j] = wskTemp[i][j];
  172.                  }
  173.              }
  174.          gra.printBoard(wskTab);
  175.     }
  176.     return 0;
  177. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement