• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Gra w zycie w jezyku C

+1 głos
734 wizyt
pytanie zadane 3 grudnia 2019 w C i C++ przez PirchHD Obywatel (1,730 p.)

Zrobiłem program grę w życie. Typowe zasady gdy komórka ( 1 ) nie ma sąsiadów umiera. gdy ma 1/2/3 zostaje przy życiu. Gdy ma 4 umiera przez zaludnienie. Zadanie robiłem dla siebie by poćwiczyć.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROZMIAR 25  // Rozmiar naszej planszy Rozmiar x Rozmiar (Nie ma osobnych wierszy i kolumn )
#define IleCykli 25 //ile chcemy cykli

int PierwszaTablicaLosowa();
int WypiszTab();
int Cykl_Zycia();
void akcja();

int tab[ROZMIAR][ROZMIAR];
int sasiad;

int main(){
  system("clear");
  PierwszaTablicaLosowa();
 for(int cykl = 0; cykl < IleCykli; cykl++){
  WypiszTab(tab);
  printf ("\n Cykl: %d \n Sasiad: %d \n",cykl,sasiad);
  Cykl_Zycia(tab);
  system("sleep 1");
  system("clear");
 }
return 0;
}
 
int PierwszaTablicaLosowa(){
  for (int i = 0; i < ROZMIAR; i++){
    for (int j = 0; j < ROZMIAR; j++){
      tab[i][j] = rand()%2;
    }
  }
 return 0;
}

int WypiszTab(int tab[ROZMIAR][ROZMIAR]){
  for (int i = 0; i < ROZMIAR; i++){
    for (int j = 0; j < ROZMIAR; j++){
      printf("%d ", tab[i][j]);
    }
  printf ("\n");
  }
return 0;
}

int Cykl_Zycia(int tab[ROZMIAR][ROZMIAR]){
// Cykl zycia byl inspirowany gotowcem 
  int sasiad = 0;
  int k,i;

  // Dlaa prawego gornego rogu
 
  k=ROZMIAR - 1; // Dla rozmiaru 10 k=9 chodzi o to by tablica sie nie nad pisala
  if(tab[0][k-1]==1)
    sasiad++;
  if(tab[1][k-1]==1)
    sasiad++;
  if(tab[1][k]==1)
    sasiad++;
   akcja(tab, i, k, sasiad);

   // Dla lewego gornego

   sasiad = 0;
  i=0;
  k=0;

  if(tab[i][k+1] == 1)
    sasiad++;
  if(tab[i+1][k+1] == 1)
    sasiad++;
  if(tab[i+1][k] == 1)
    sasiad++;
  akcja(tab,i,k,sasiad);

  // dla lewego dolnego rogu
 
  sasiad = 0;
  i = ROZMIAR - 1;
  k = 0;
  if (tab[i-1][k] == 1)
    sasiad++;
  if(tab[i][k+1] == 1)
    sasiad++;
  if(tab[i-1][k+1] == 1)
    sasiad++;
  akcja(tab, i, k, sasiad);

  // dla prawego dolnego rogu
 
  sasiad = 0;
  i = ROZMIAR - 1; 
  k = ROZMIAR - 1;
  if(tab[i][k-1] == 1)
    sasiad++;
  if(tab[i-1][k-1] == 1)
    sasiad++;
  if(tab[i-1][k] == 1)
    sasiad++;
 akcja (tab, i, k, sasiad);
  // dla gory od k 1-8
  sasiad = 0;
  i = 0;
  for (k = 1; k < ROZMIAR - 1; ++k){
    if (tab[i][k] == 1){
      if (tab[i][k-1] == 1)
        sasiad++;
      if ( tab[i+1][k-1] == 1)
        sasiad++;
      if(tab[i+1][k] == 1)
	sasiad++;
      if(tab[i+1][k+1] == 1)
	sasiad++;
      if(tab[i][k+1] == 1)
	sasiad++;
    }

  if (tab[i][k] == 0){
    if (tab[i][k-1] == 1)
      sasiad++;
    if(tab[i+1][k-1] == 1)
      sasiad++;
    if(tab[i+1][k] == 1)
      sasiad++;
    if(tab[i+1][k+1] == 1)
      sasiad++;
    if(tab[i][k+1] == 1)
      sasiad++;
  }
  akcja(tab, i, k, sasiad);
  }

  // dla doł k 1- 8

  sasiad = 0;
  i = 9;
  for (k = 1; k < ROZMIAR - 1; ++k){
    if (tab[i][k] == 1){
      if (tab[i][k-1] == 1)
        sasiad++;
      if ( tab[i-1][k-1] == 1)
        sasiad++;
      if(tab[i-1][k] == 1)
	sasiad++;
      if(tab[i-1][k+1] == 1)
	sasiad++;
      if(tab[i][k+1] == 1)
	sasiad++;
    }
    if (tab[i][k] == 0){
      if (tab[i][k-1] == 1)
        sasiad++;
      if(tab[i-1][k-1] == 1)
        sasiad++;
      if(tab[i-1][k] == 1)
        sasiad++;
      if(tab[i-1][k+1] == 1)
        sasiad++;
      if(tab[i][k+1] == 1)
        sasiad++;
    }
  akcja (tab,i,k,sasiad);
  }

  // dla lewa str 1-8
  
  sasiad = 0;
  k = 0;
  for(i=1; k < ROZMIAR - 1; ++k){
    if(tab[i][k] == 1){
      if(tab[i-1][k] == 1)
	sasiad++;
      if(tab[i-1][k+1] == 1)
        sasiad++;
      if(tab[i][k+1] == 1)
        sasiad++;
      if(tab[i+1][k+1] == 1)
        sasiad++;  
      if(tab[i+1][k] == 1)
        sasiad++;
    }
    if(tab[i][k] == 0){
      if(tab[i-1][k] == 1)
	sasiad++;
      if(tab[i-1][k+1] == 1)
        sasiad++;
      if(tab[i][k+1] == 1)
        sasiad++;
      if(tab[i+1][k+1] == 1)
        sasiad++;  
      if(tab[i+1][k] == 1)
        sasiad++;
    }
    akcja(tab, i, k, sasiad);
    }

  // dla prawa str 1-8

  sasiad = 0;
  k = 9;
  for(i=1; k < ROZMIAR - 1; ++k){
        if(tab[i][k] == 1){
            if(tab[i-1][k] == 1)
                sasiad++;
            if(tab[i-1][k-1] == 1)
                sasiad++;
            if(tab[i][k-1] == 1)
                sasiad++;
            if(tab[i+1][k-1] == 1) 
                sasiad++;
            if(tab[i+1][k] == 1)
                sasiad++;       
        }

        if(tab[i][k] == 0){
            if(tab[i-1][k] == 1)
                sasiad++;
            if(tab[i-1][k-1] == 1)
                sasiad++;
            if(tab[i][k-1] == 1)
                sasiad++;
            if(tab[i+1][k-1] == 1) 
                sasiad++;
            if(tab[i+1][k] == 1)
                sasiad++;   
        }
        akcja(tab,i,k,sasiad);
    } 

    sasiad=0;
    for(k = 1; k < ROZMIAR - 1; ++k){
        for(i = 1; i < ROZMIAR -1; ++i){
            if(tab[k][i] == 1){
                if(tab[k][i+1] == 1)
                    sasiad++;
                if(tab[k+1][i+1] == 1)
                    sasiad++;
                if(tab[k+1][i] == 1)
                    sasiad++;
                if(tab[k+1][i-1] == 1)
                    sasiad++;
                if(tab[k][i-1] == 1)
                    sasiad++;
                if(tab[k-1][i-1] == 1)
                    sasiad++;
                if(tab[k-1][i] == 1)
                    sasiad++;
                if(tab[k-1][i+1] == 1)
                    sasiad++;                   
            }

            if(tab[k][i] == 0){
                if(tab[k][i+1] == 1)
                    sasiad++;
                if(tab[k+1][i+1] == 1)
                    sasiad++;
                if(tab[k+1][i] == 1)
                    sasiad++;
                if(tab[k+1][i-1] == 1)
                    sasiad++;
                if(tab[k][i-1] == 1)
                    sasiad++;
                if(tab[k-1][i-1] == 1)
                    sasiad++;
                if(tab[k-1][i] == 1)
                    sasiad++;
                if(tab[k-1][i+1] == 1)
                    sasiad++;                   
            }
            akcja(tab, k, i, sasiad);
    }
  }
return 0;
}

void akcja(int tab[ROZMIAR][ROZMIAR],int w,int k,int sasiad){
  if (sasiad == 3)
    tab[w][k] = 1;
  if (sasiad == 3 && sasiad == 2)
    tab[w][k] = 1;
  if (sasiad == 1 && sasiad == 0)
    tab[w][k] = 1;
  if (sasiad >= 4)
    tab[w][k] = 0;
 // if (sasiad = 0)
   //  tab[w][k] = 0;
}

Ogólnie program działa dziwnie ( nie poprawnie ) ponieważ środek zawsze jest 0 w czym problem ? Przeanalizowałem Cykl_życia i wydaje mi się że wszystko jest okej (sprawdza wszystkie elementy z tablicy). Coś czuję że mój tok rozumowania jest zły w funkcji akcja. Proszę o pomoc i jak coś to jestem początkującym.

komentarz 3 grudnia 2019 przez adrian17 Ekspert (322,800 p.)

Coś czuję że mój tok rozumowania jest zły w funkcji akcja

No... tak :D

if (sasiad == 3 && sasiad == 2)

Liczba nie może być jednocześnie równa 3 i 2, więc to się nigdy nie spełni.

A co do samego kodu... proponuję to zdeduplikować? Zamiast wielokrotnego powtarzania `if(tab[k][i+1] == 1)` etc etc wystarczyłaby podwójna pętla po -1, 0, 1 która obsłużyłaby wszystkie pola, a narożniki wystarczy obsłużyć sprawdzając czy i+1, i-1, k+1, k-1 są poza zakresem.

komentarz 3 grudnia 2019 przez PirchHD Obywatel (1,730 p.)
Dzięki za pomoc ale zmieniłem to i nadal jest ten sam błąd:/ Wraz że gdy są 5 koło siebie to badal żyją więc pewnie winą jest cykl_życia bo cały lewa kolumna jest w 1 i nic :/
komentarz 3 grudnia 2019 przez adrian17 Ekspert (322,800 p.)
(pokaż nowy kod)
komentarz 4 grudnia 2019 przez mmarszik Mądrala (7,370 p.)

@PirchHD,

> zmieniłem to i nadal jest ten sam błąd:/ Wraz że gdy są 5 koło siebie to
> badal żyją więc pewnie winą jest cykl_życia bo cały lewa kolumna
> jest w 1 i nic :/

Pokazałem dwa przykłady. WIdać jak (przy pomocy tablic) w paru linijkach sumuje się sąsiadów i z tablicy bierze się funkcję przeżycia:

const int p = y*width + x;               // Sztuczka, bo użyłem tablicy jednowymiarowej
for( int i=0 ; i<offset.size(); i++ ) {   // tablica z ofsetami.
  sum += buffCopy[ p + offset[i] ];  // Suma, do bieżącego punktu dodajemy offsety.
}
buff[p] = rules[ sum ];                    // Bez stu ifów wyliczamy funkcję przeżycia.

 

W drugim przykładzie, jak już Ci podpowiedziano, dwie pętle wewnętrzne po sąsiadach. Tutaj akurat sumują się z obszaru 5x5:

int sum = 0;
for( int y2=y-2 ; y2<=y+2 ; y2++ ) {    // pętla po współrzędneij y
    for( int x2=x-2 ; x2<=x+2 ; x2++ ) { // po współrzędnej x
      sum += buffCopy[y2*width+x2];    // sumowanie i obliczanie pozycji pixela
   }
}
buff[y*width+x] = rules[ sum ];           // I funkcja przeżycia z tablicy.

 

No ale zamiast się wczytać czy dopytać, dostalem jak zwykle downwote.

 

komentarz 4 grudnia 2019 przez adrian17 Ekspert (322,800 p.)

No ale zamiast się wczytać czy dopytać, dostalem jak zwykle downwote.

Bo to gotowiec, w dodatku nijak nie odpowiada na pytanie,

komentarz 4 grudnia 2019 przez mmarszik Mądrala (7,370 p.)
By poczytał, to by zobaczył jak to się robi. Ma wartość edukacyjną. A że gotowy kod, to przynajmniej przetestowałem że nie ma błędów.
komentarz 4 grudnia 2019 przez PirchHD Obywatel (1,730 p.)
@mmarszik

to nie ja tobie dałem downwote. Dziekuje bardzo za kod (super ma efetky) ale jest w nim wiele bibliotek które nie znam więc ciężko mi go analizować.
komentarz 4 grudnia 2019 przez PirchHD Obywatel (1,730 p.)

Co do nowego kodu zmieniłem tylko funkcje akcja

void akcja(int tab[ROZMIAR][ROZMIAR],int w,int k,int sasiad){
  if (sasiad == 3)
    tab[w][k] = 1;
  if (sasiad == 2)
    tab[w][k] = 1;
  if (sasiad == 1)
    tab[w][k] = 1;
  if (sasiad >= 4)
    tab[w][k] = 0;
  if (sasiad = 0)
    tab[w][k] = 0;
}
1
komentarz 4 grudnia 2019 przez mmarszik Mądrala (7,370 p.)
Wybacz, nie chciało mi się rzeźbić ręcznie obslugi formatów graficznych, użyłem gotowców. Skup się na istocie algorytmu, biblioteka ich nie zaciemnia. Nawet jest czytelniej z biblioteką, bo jest znacznie mniej kodu.

Najpierw bufor na obliczenia:
QVector<int> buff( width * height , 0 );
Nie przejmuj się że tam pisze jakis QVector, to po porstu tablica z zerami. Obrazek o szerokości width i wysokości height ma ilość pikslei równą width * height.

Potem funkcja życia, to też jest tablica:
QVector<int> rules(9,0);
Tablica ta zawiera liczbY (np. od 0 do 1).

Liczysz punkt w tablicy dla współrzędnych x i y:
p = y*width + x

Tablica offset to punkty wokół punktu p
QVector<int> offset = {-1,+1,-1-width,-width....};

Później liczysz sumę wartości wokół komórki (z kopii bufora):
for( int i=0 ; i<offset.size(); i++ ) {
   sum += buffCopy[ p + offset[i] ];
}

Na koniec nowa wartość z funkcji życia:
buff[p] = rules[ sum ];

I jeszcze przerzucanie bufora do kopii po każdej pętli.
buffCopy = buff;

W drugiej wersji jest podobnie, ale iteruję poczynając od
x-2 i y-2 do x+2 i y+2, czyli biorę pole 5x5 wokół punktu p.

for( int y2=y-2 ; y2<=y+2 ; y2++ ) {
   for( int x2=x-2 ; x2<=x+2 ; x2++ ) {
       sum += buffCopy[y2*width+x2];
   }
}

Istota algorytmu jak widzisz wygląda tak samo jak w czystym C. Same pętle i tablice. Biblioteki tylko ułatwiają zapis obrazka, pobranie danych od usera, albo kopiowanie buforów bez memcpy.

Możesz łatwo dostosować to do swoich potrzeb.

4 odpowiedzi

+1 głos
odpowiedź 4 grudnia 2019 przez mmarszik Mądrala (7,370 p.)
wybrane 4 grudnia 2019 przez PirchHD
 
Najlepsza

Tutaj bardziej rozbudowana wersja. Komórka może mieć 7 stanów, a sumowanie następuje z 25 sąsiednich komórek. Niestety w tej wersji trzeba zdefiniować funkcję przejść aż dla 151 stanów. Ale efekt zawsze mnie urzekał, chyba warto :)

Tutaj kod:

#include <QImage>
#include <QTextStream>
#include <QVector>
#include <QColor>

int main() {
    QTextStream inp(stdin);
    QTextStream out(stdout);

    out << "Please input the width of image:" << endl;
    int width;
    inp >> width;

    out << "Please input the height of image:" << endl;
    int height;
    inp >> height;

    out << "Please input the loops of the algorithm:" << endl;
    int loops;
    inp >> loops;

    QVector<int> buff( width * height , 0 );
    QVector<int> buffCopy;

    out << "Please input the number of init points:" << endl;
    int n;
    inp >> n;

    for( int i=0 ; i<n ; i++ ) {
        int x,y,v;
        out << "Please input the x of the [" << (i+1) << "] point:" << endl;
        inp >> x;
        out << "Please input the y of the [" << (i+1) << "] point:" << endl;
        inp >> y;
        if( x < 0 || x >= width || y < 0 || y >= height || buff[ y * width + x] ) {
            out << "Invalid point" << endl;
            i--;
            continue;
        }
        out << "Please input value (0, 1, 2, 3, 4, 5, 6):" << endl;
        inp >> v;
        if( v < 0 || v > 6 ) {
            out << "Invalid value" << endl;
            i--;
            continue;
        }
        buff[ y * width + x] = v;
    }

    QVector<int> rules(151,0);
    for( int i=0 ; i<rules.size() ; i++ ) {
        out << "If sum == " << i << " plelase input 1,2,3,4,5,6 to live or 0 to death: " << endl;
        int rule;
        inp >> rule;
        if( rule < 0 || rule > 6) {
            out << "Input 0, 1, 2, 4, 5 or 6" << endl;
            i--;
            continue;
        }
        rules[i] = rule;
    }

    for( int loop=0 ; loop < loops ; loop++ ) {
        buffCopy = buff;
        for( int y=2 ; y<height-2 ; y++ ) {
            for( int x=2 ; x<width-2 ; x++ ) {
                int sum = 0;
                for( int y2=y-2 ; y2<=y+2 ; y2++ ) {
                    for( int x2=x-2 ; x2<=x+2 ; x2++ ) {
                        sum += buffCopy[y2*width+x2];
                    }
                }
                buff[y*width+x] = rules[ sum ];
            }
        }
    }

    QImage img( width , height , QImage::Format_RGBA8888 );
    for( int y=0 ; y<height ; y++ ) {
        for( int x=0 ; x<width ; x++ ) {
            QColor c;
            switch( buff[y*width+x] ) {
                case 0: c = QColor(0x00,0x00,0x00); break;
                case 1: c = QColor(0xFF,0x00,0x00); break;
                case 2: c = QColor(0x00,0xFF,0x00); break;
                case 3: c = QColor(0x00,0x00,0xFF); break;
                case 4: c = QColor(0xFF,0x00,0xFF); break;
                case 5: c = QColor(0x00,0xFF,0xFF); break;
                case 6: c = QColor(0xFF,0xFF,0x00); break;
                default: abort();
            }
            img.setPixel(x, y, c.rgb() ) ;
        }
    }
    img.save("out.png");
    return 0;
}

Przykładowe wejście programu, można wkleić ctrl+v:

1001
1001

1000

9
500
500
2
500
501
2
500
499
2
501
500
2
499
500
2
499
499
3
499
501
3
501
499
3
501
501
3



0
1
2
3
4
5
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
2
2
0
0
3
3
0
0
0
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
2
3
4
5
6
6
5
4
3
2
1
0

Tutaj efekt:

 

+1 głos
odpowiedź 4 grudnia 2019 przez mmarszik Mądrala (7,370 p.)

Może błąd polega na tym, że nie ma else?

void akcja(int tab[ROZMIAR][ROZMIAR],int w,int k,int sasiad){
  if (sasiad == 3)
    tab[w][k] = 1;
  else if (sasiad == 2)
    tab[w][k] = 1;
  else if (sasiad == 1)
    tab[w][k] = 1;
  else 
    tab[w][k] = 0;
}

// Albo:

void akcja(int tab[ROZMIAR][ROZMIAR],int w,int k,int sasiad){
  if (sasiad == 0 || sasiad > 3)
    tab[w][k] = 0;
  else
    tab[w][k] = 1;
}

// Albo:

void akcja(int tab[ROZMIAR][ROZMIAR],int w,int k,int sasiad){
    tab[w][k] = sasiad != 0 && sasiad < 4;
}

 

komentarz 4 grudnia 2019 przez PirchHD Obywatel (1,730 p.)
Niestety nic nie pomaga :/  Ale nawet nie pomyślałem że mogę zapisać to w taki sposób (krócej i łatwiej). Dzisiaj muszę robić inne programy ale jutro siadne na tym i jeszcze raz przeanalizuje każdy wariant. Albo poprostu zmienię to na for tak jak było mi już radzone.
0 głosów
odpowiedź 3 grudnia 2019 przez mmarszik Mądrala (7,370 p.)

Kod:

#include <QImage>
#include <QTextStream>
#include <QVector>
#include <QColor>

int main() {
    QTextStream inp(stdin);
    QTextStream out(stdout);

    out << "Please input the width of image:" << endl;
    int width;
    inp >> width;

    out << "Please input the height of image:" << endl;
    int height;
    inp >> height;

    out << "Please input the loops of the algorithm:" << endl;
    int loops;
    inp >> loops;

    QVector<int> buff( width * height , 0 );
    QVector<int> buffCopy;

    out << "Please input the number of init points:" << endl;
    int n;
    inp >> n;

    for( int i=0 ; i<n ; i++ ) {
        int x,y;
        out << "Please input the x of the [" << (i+1) << "] point:" << endl;
        inp >> x;
        out << "Please input the y of the [" << (i+1) << "] point:" << endl;
        inp >> y;
        if( x < 0 || x >= width || y < 0 || y >= height || buff[ y * width + x] ) {
            out << "Invalid point" << endl;
            i--;
            continue;
        }
        buff[ y * width + x] = 1;
    }
    buffCopy = buff;

    QVector<int> rules(9,0);
    for( int i=0 ; i<rules.size() ; i++ ) {
        out << "If sum == " << i << " plelase input 1 to live or 0 to death: " << endl;
        int rule;
        inp >> rule;
        if( rule != 0 && rule != 1 ) {
            out << "Input 0 or 1" << endl;
            i--;
            continue;
        }
        rules[i] = rule;
    }

    QVector<int> offset = {-1,+1,-1-width,-width,+1-width,-1+width,+width,+1+width};
    for( int loop=0 ; loop < loops ; loop++ ) {
        for( int y=1 ; y<height-1 ; y++ ) {
            for( int x=1 ; x<width-1 ; x++ ) {
                int sum = 0;
                const int p = y*width + x;
                for( int i=0 ; i<offset.size(); i++ ) {
                    sum += buffCopy[ p + offset[i] ];
                }
                buff[p] = rules[ sum ];
            }
        }
        buffCopy = buff;
    }

    QImage img( width , height , QImage::Format_RGB32 );
    img.fill( QColor(0,0,0) );
    for( int y=1 ; y<height-1 ; y++ ) {
        for( int x=1 ; x<width-1 ; x++ ) {
            if( buff[y*width+x] ) {
                img.setPixel(x,y, QColor(0xFF,0xFF,0).value() ) ;
            }
        }
    }
    img.save("out.png");
    return 0;
}

Kompilacja i przykład użycia:

g++ -m64 -pipe -O3 -std=c++0x -Wall -W -D_REENTRANT -fPIC -DQT_GUI_LIB -DQT_CORE_LIB -I../eduLife -I. -isystem /usr/include/x86_64-linux-gnu/qt5 -isystem /usr/include/x86_64-linux-gnu/qt5/QtGui -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore -I. -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64  main.cpp -o life -lQt5Gui -lQt5Core -lGL -lpthread   
./life 
Please input the width of image:
512
Please input the height of image:
512
Please input the loops of the algorithm:
150
Please input the number of init points:
3
Please input the x of the [1] point:
256
Please input the y of the [1] point:
256
Please input the x of the [2] point:
255
Please input the y of the [2] point:
256
Please input the x of the [3] point:
257
Please input the y of the [3] point:
256
If sum == 0 plelase input 1 to live or 0 to death: 
0
If sum == 1 plelase input 1 to live or 0 to death: 
0
If sum == 2 plelase input 1 to live or 0 to death: 
1
If sum == 3 plelase input 1 to live or 0 to death: 
1
If sum == 4 plelase input 1 to live or 0 to death: 
1
If sum == 5 plelase input 1 to live or 0 to death: 
1
If sum == 6 plelase input 1 to live or 0 to death: 
0
If sum == 7 plelase input 1 to live or 0 to death: 
0
If sum == 8 plelase input 1 to live or 0 to death: 
0

Efekt:

0 głosów
odpowiedź 10 grudnia 2019 przez PirchHD Obywatel (1,730 p.)

Hej to znów ja. Ostatnio napisałem jeszcze raz cykl (w inny sposób) i nadal nie działał więc postanowiłem w takim zaczac od nowa i łatwiejszy sposób. Liczba 5 to jest ramka mojej tabelki, a sprawdzanie sąsiadów zaczyna się od tab[1]1] aż do tab [ROZMIAR-1][ROZMIAR-1]. Teoretycznie powinno działać przecież nie nad pisuje tablicy ale niestety tylko teoretycznie. Może gdzieś mam jaką nie wiedzę na temat tablic, Dziękuję za uwagę i prosze o pomoc :D

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROZMIAR 10  // Rozmiar naszej planszy Rozmiar x Rozmiar (Nie ma osobnych wierszy i kolumn )
#define IleCykli 25 //ile chcemy cykli

int PierwszaTablicaLosowa();
int WypiszTab();
int Cykl_Zycia();
void akcja();

int tab[ROZMIAR][ROZMIAR];
int sasiad;

int main(){
  system("clear");
  PierwszaTablicaLosowa();
 for(int cykl = 0; cykl < IleCykli; cykl++){
  WypiszTab(tab);
  printf ("\n Cykl: %d \n Sasiad: %d \n",cykl,sasiad);
  Cykl_Zycia(tab);
  system("sleep 1");
  int x,y;
    for(int i=0 ; i < 10; i++){
  x =rand()%10;
  y = rand()%10;
  tab[x][y] = 1;
    }
  system("clear");
 }
return 0;
}
 
int PierwszaTablicaLosowa(){
  for (int i = 0; i < ROZMIAR; i++){
    for (int j = 0; j < ROZMIAR; j++){
      tab[i][j] = rand()%2;
    }
  }
 return 0;
}

int WypiszTab(int tab[ROZMIAR][ROZMIAR]){
  for(int i = 0; i < ROZMIAR; i++){
   int k=0;
    tab[i][k] = 5;
    tab[k][i] = 5;
    tab[i][ROZMIAR-1] = 5;
    tab[ROZMIAR-1][i] = 5;
  }
  for (int i = 0; i < ROZMIAR; i++){
    for (int j = 0; j < ROZMIAR; j++){
      printf("%d ", tab[i][j]);
    }
  printf ("\n");
  }
return 0;
}

int Cykl_Zycia(int tab[ROZMIAR][ROZMIAR]){
  for(int w = 1; w < ROZMIAR - 1; w++){
    for(int k = 1; k < ROZMIAR - 1; k++){
      if(tab[w-1][k] == 1)
        sasiad++;
      if(tab[w+1][k] == 1)
	sasiad++;
      if(tab[w][k-1] == 1)
	sasiad++;
      if(tab[w][k+1] == 1)
	sasiad++;
      if(tab[w-1][k-1] == 1)
	sasiad++;
      if(tab[w+1][k+1] == 1)
	sasiad++;
      if(tab[w+1][k-1] == 1)
	sasiad++;    
      if(tab[w-1][k+1] == 1)
	sasiad++;
      akcja(tab[ROZMIAR][ROZMIAR],w,k,sasiad);
    }
  }
return 0;
}

void akcja(int tab[ROZMIAR][ROZMIAR],int w,int k,int sasiad){
  if (sasiad == 0 || sasiad > 3)
    tab[w][k] =0;
  else
    tab[w][k] = 1;
}

Błąd to Naruszenie ochrony pamięci(zrzut pamięci). Robiłem to na linuxie jak coś.

komentarz 11 grudnia 2019 przez mmarszik Mądrala (7,370 p.)
Na pewno tu jest błąd:

79) tab[ROZMIAR][ROZMIAR]
komentarz 12 grudnia 2019 przez PirchHD Obywatel (1,730 p.)
Dzięki wszystko działa
1
komentarz 12 grudnia 2019 przez mmarszik Mądrala (7,370 p.)
Cieszę się że mogłem pomóc.

Podobne pytania

+2 głosów
2 odpowiedzi 1,566 wizyt
pytanie zadane 12 czerwca 2018 w Inne języki przez lucelka Początkujący (260 p.)
0 głosów
1 odpowiedź 115 wizyt
pytanie zadane 15 października 2016 w C i C++ przez DragonCoder Nałogowiec (36,500 p.)
0 głosów
0 odpowiedzi 775 wizyt

89,082 zapytań

137,670 odpowiedzi

307,610 komentarzy

59,140 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...