Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Martwa komórka, która ma dokładnie 3 żywych sąsiadów, staje się żywa w następnej jednostce czasu (rodzi się)
- //Ż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”).
- #include <iostream>
- #include <time.h>
- #include <unistd.h>
- #include <cstdlib>
- #include <thread>
- using namespace std;
- static const int num_threads = 4;
- int wiersze = 4;
- int kolumny = 8;
- class TheGameOfLife {
- int ** wskTab;
- int ** wskTMP;
- int x;
- int y;
- public:
- TheGameOfLife(int wiersze, int kolumny){
- x=wiersze+1;
- y=kolumny+1;
- wskTab = nullptr;
- wskTMP = nullptr;
- }
- void createBoard(void) {
- wskTab = new int *[x];
- for (int i = 0; i <= x; i++) {
- wskTab[i] = new int[y];
- }
- //tymczasowy wskaznik
- wskTMP = new int *[x];
- for (int i = 0; i <= x; i++) {
- wskTMP[i] = new int[y];
- }
- }
- void initBoard(void) {
- for (int i = 0; i <= x; i++)
- for (int j = 0; j <= y; j++){
- wskTab[i][j] = 0;
- wskTMP[i][j] = 0;
- }
- }
- void generateRandomBoardFields(void) {
- for (int i = 1; i <= x-1; i++)
- for (int j = 1; j <= y-1; j++)
- wskTab[i][j] = rand() % 2;
- printInitialBoard();
- }
- void printInitialBoard(void) {
- for (int i = 1; i <= x-1; i++) {
- cout << endl;
- for (int j = 1; j <= y-1; j++)
- cout << wskTab[i][j] << " ";
- }
- cout << "\n\n****************" << endl;
- }
- void printBoard(int** tmp) {
- for (int i = 1; i <= x-1; i++) {
- cout << endl;
- for (int j = 1; j <= y-1; j++)
- cout << tmp[i][j] << " ";
- }
- cout << "\n\n****************" << endl;
- }
- int ** returnTab(void){
- return wskTab;
- }
- int ** returnTabSecond(void){
- return wskTMP;
- }
- };
- void call_from_thread(int **wskTab, int **wskTMP, int ktoryWatek, int num_threads) {
- //ktory watek liczony od 1
- int ostatniaKolumna = kolumny/num_threads*ktoryWatek;
- int pierwszaKolumna = ostatniaKolumna - (kolumny/num_threads-1);
- for (int i = 1; i <= wiersze; i++) {
- for (int j = pierwszaKolumna; j <= ostatniaKolumna ; j++){
- int ilosc = 0;
- if(wskTab[i][j-1]==1){
- ilosc++;
- }
- if(wskTab[i-1][j]==1){
- ilosc++;
- }
- if(wskTab[i-1][j-1]==1){
- ilosc++;
- }
- if(wskTab[i+1][j-1]==1){
- ilosc++;
- }
- if(wskTab[i+1][j]==1){
- ilosc++;
- }
- if(wskTab[i-1][j+1]==1){
- ilosc++;
- }
- if(wskTab[i][j+1]==1){
- ilosc++;
- }
- if(wskTab[i+1][j+1]==1){
- ilosc++;
- }
- //jesli martwa, ale 3 sasiadow = zyje
- if(wskTab[i][j] == 0 && ilosc == 3){
- wskTMP[i][j] = 1;
- }
- //jesli zyje, ale wiecej niz 3 sasiadow/mniej niz 2 = umiera
- else if (wskTab[i][j] == 1 && (ilosc > 3 || ilosc < 2))
- {
- wskTMP[i][j] = 0;
- }
- //nic nie rob w innym wypadku
- else{
- wskTMP[i][j] = wskTab[i][j];
- }
- }
- }
- }
- int main() {
- int tmp;
- int **wskTab = nullptr;
- int **wskTemp = nullptr;
- srand(time(NULL));
- TheGameOfLife gra(wiersze, kolumny);
- thread t[num_threads];
- gra.createBoard();
- gra.initBoard();
- gra.generateRandomBoardFields();;
- wskTab = gra.returnTab();
- wskTemp = gra.returnTabSecond();
- while(true){
- cout << "\n1 - nastepny krok\n0 - wylacz" << endl;
- cin >> tmp;
- if(tmp == 0){
- exit(0);
- }
- for (int i = 0; i < num_threads; ++i) {
- t[i] = std::thread(call_from_thread, wskTab, wskTemp, i+1, num_threads);
- }
- for (int i = 0; i < num_threads; ++i) {
- t[i].join();
- }
- //wskTemp -> plansza po turze
- for (int i = 1; i <= wiersze; i++) {
- for (int j = 1; j <= kolumny; j++){
- wskTab[i][j] = wskTemp[i][j];
- }
- }
- gra.printBoard(wskTab);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement