problem z Game of Life

0

Postanowiłem sobie napisać właśnie tą grę [na razie na planszy 4x4], problem prawdopodobnie tkwi gdzieś w funkcji: 'przewin()', wydaje mi się, że koncepcja jest dobra.

#include <iostream>

using namespace std;

int menu(int pole[][6]);
int ustaw(int pole[][6]);
int przewin(int pole[][6]);

int main()
{
    int pole[6][6] = {};
    menu(pole);
    
    system("pause>nul");
    return 0;
}

///// MENU Z PĘTLĄ ANTYBŁĘDNĄ

int menu(int pole[][6])
{
    system("cls");
    //// WYSWIETLANIE PLANSZY
    for(int x = 1; x <= 4; ++x)
    {
    cout << endl;
          for(int y = 1; y <= 4; ++y)
          {
                  /// SPRAWDZANIE CZY ZYWA JEST KOMORKA
                  if(pole[x][y] == 1) cout << "#";
                  else cout << " ";
                  cout << "|";
          }
    
    cout << endl;
    cout << "-+-+-+-+";
    }
    int wybor;
    
    cout << "\n\nWybierz opcje: ";
    cout << "\n1.Wybierz zywe pola";
    cout << "\n2.Przewin ture" << endl;
    cin >> wybor;
    if(wybor == 1) { ustaw(pole); }
    else if(wybor == 2) { przewin(pole); }
    else {cout << "Nie ma takiej opcji"; system("pause>nul"); system("cls"); menu(pole);}
}

////// WYBÓR Z PĘTLĄ ANTYBŁĘDNĄ

int ustaw(int pole[][6])
{
    int ax, ay;
    system("cls");
    cout << "Jesli komorka jest zywa to zostanie zniszczona,\njesli martwa to zostanie stworzona. (1-4)";
    cout << "\nPodaj X: ";
    cin >> ax;
    if(ax < 1 || ax > 4) ustaw(pole);
    cout << "\nPodaj Y: ";
    cin >> ay;
    if(ay < 1 || ay > 4) ustaw(pole);
    
    /////// USTAWIANIE ISTNIENIA
    
    if(pole[ay][ax] == 0) { pole[ay][ax] = 1; cout << "\nPole x: " << ax << " y: " << ay << " zostalo ozywione."; system("pause>nul");}
    else { pole[ay][ax] = 0; cout << "\nPole x: " << ax << " y: " << ay << " zostalo zniszczone."; system("pause>nul");}
    menu(pole);
}

int przewin(int pole[][6])
{
    for(int y = 1; y <= 4; ++y)
    {
            for(int x = 1; x <= 4; ++x)
            {
                    int licznik = 0; // ISTNIEJACYCH KOMóREK W OKOLICY
                 if(pole[x-1][y] == 1) licznik += 1;
                 if(pole[x][y-1] == 1) licznik += 1;
                 if(pole[x][y+1] == 1) licznik += 1;
                 if(pole[x+1][y-1] == 1) licznik += 1;
                 if(pole[x-1][y+1] == 1) licznik += 1;
                 if(pole[x-1][y-1] == 1) licznik += 1;
                 if(pole[x+1][y+1] == 1) licznik += 1;
                 
                 
                if(pole[x][y] == 0)
                {
                              if(licznik == 3) pole[x][y] = 1;
                              else pole[x][y] = 0;
                }
                else
                {
                    if(licznik == 2 || licznik == 3) pole[x][y] = 1;
                              else pole[x][y] = 0;
                }               
                 
                    
            }
    }
    
    system("pause>nul");
    menu(pole);
}
 
0

To tak.. pokoloruj kod (wybierz kolorowanie dla CPP) i opisz co jest nie tak. Wtedy ktoś ci na pewno pomoże.

0

omg, ale o so chodzi?;] Mamy podziwiać? A gdzie brzegi/rogi? A warunki brzegowe jakiej?;> rece opadaja

0

Proszę.. problem tkwi w tym, że gdy wybieram opcję 2. nic się nie dzieję na planszy. Jak już wcześniej napisałem problem tkwi prawdopodobnie w funkcji 'przewin()'

#include <iostream>
 
using namespace std;
 
int menu(int pole[][6]);
int ustaw(int pole[][6]);
int przewin(int pole[][6]);
 
int main()
{
    int pole[6][6] = {};
    menu(pole);
 
    system("pause>nul");
    return 0;
}
 
///// MENU Z PĘTLĄ ANTYBŁĘDNĄ
 
int menu(int pole[][6])
{
    system("cls");
    //// WYSWIETLANIE PLANSZY
    for(int x = 1; x <= 4; ++x)
    {
    cout << endl;
          for(int y = 1; y <= 4; ++y)
          {
                  /// SPRAWDZANIE CZY ZYWA JEST KOMORKA
                  if(pole[x][y] == 1) cout << "#";
                  else cout << " ";
                  cout << "|";
          }
 
    cout << endl;
    cout << "-+-+-+-+";
    }
    int wybor;
 
    cout << "\n\nWybierz opcje: ";
    cout << "\n1.Wybierz zywe pola";
    cout << "\n2.Przewin ture" << endl;
    cin >> wybor;
    if(wybor == 1) { ustaw(pole); }
    else if(wybor == 2) { przewin(pole); }
    else {cout << "Nie ma takiej opcji"; system("pause>nul"); system("cls"); menu(pole);}
}
 
////// WYBÓR Z PĘTLĄ ANTYBŁĘDNĄ
 
int ustaw(int pole[][6])
{
    int ax, ay;
    system("cls");
    cout << "Jesli komorka jest zywa to zostanie zniszczona,\njesli martwa to zostanie stworzona. (1-4)";
    cout << "\nPodaj X: ";
    cin >> ax;
    if(ax < 1 || ax > 4) ustaw(pole);
    cout << "\nPodaj Y: ";
    cin >> ay;
    if(ay < 1 || ay > 4) ustaw(pole);
 
    /////// USTAWIANIE ISTNIENIA
 
    if(pole[ay][ax] == 0) { pole[ay][ax] = 1; cout << "\nPole x: " << ax << " y: " << ay << " zostalo ozywione."; system("pause>nul");}
    else { pole[ay][ax] = 0; cout << "\nPole x: " << ax << " y: " << ay << " zostalo zniszczone."; system("pause>nul");}
    menu(pole);
}
 
int przewin(int pole[][6])
{
    for(int y = 1; y <= 4; ++y)
    {
            for(int x = 1; x <= 4; ++x)
            {
                    int licznik = 0; // ISTNIEJACYCH KOMóREK W OKOLICY
                 if(pole[x-1][y] == 1) licznik += 1;
                 if(pole[x][y-1] == 1) licznik += 1;
                 if(pole[x][y+1] == 1) licznik += 1;
                 if(pole[x+1][y-1] == 1) licznik += 1;
                 if(pole[x-1][y+1] == 1) licznik += 1;
                 if(pole[x-1][y-1] == 1) licznik += 1;
                 if(pole[x+1][y+1] == 1) licznik += 1;
 
 
                if(pole[x][y] == 0)
                {
                              if(licznik == 3) pole[x][y] = 1;
                              else pole[x][y] = 0;
                }
                else
                {
                    if(licznik == 2 || licznik == 3) pole[x][y] = 1;
                              else pole[x][y] = 0;
                }               
 
 
            }
    }
 
    system("pause>nul");
    menu(pole);
}
0

A nie jest tak przypadkiem, że na końcu przewin() nie rysujesz planszy tj nie wykonujesz menu()?

BTW wydaje mi się, że ten kod:

if (pole[x][y] == 0)
{
    if (licznik == 3) pole[x][y] = 1;
    else pole[x][y] = 0;
}
else
{
    if (licznik == 2 || licznik == 3) pole[x][y] = 1;
    else pole[x][y] = 0;
}

Można skrócić po prostu:

if (licznik == 2 || licznik == 3)
    pole [x][y] = 1;
else
    pole[x][y] = 0;
0

Właśnie nie można tak skrócić, bo to będzie się kłócić z zasadami gry, tzn. komórka zostaje gdy są obok niej 2 lub 3 komórki ( w przeciwnym wypadku ginie), oraz komórka rodzi się (tzn. martwa zamienia się w żywą) gdy są obok niej są 3 inne żywe (koniecznie 3). A to przestawienie wyświetlania planszy [jeśli to masz na myśli] nic nie daje.

0

Spróbuj debugować "konsolowo" w każdym warunku daj wyświetlanie się w konsoli, który warunek się spełnia i zobacz, które się spełniają, a które nie. Wtedy znajdziesz gdzie jest błąd, bo prawdopodobnie, któryś warunek nie działa i przez to tablica zostaje w takim stanie jakim była.

0
xeo545x39 napisał(a)

Spróbuj debugować "konsolowo" w każdym warunku daj wyświetlanie się w konsoli, który warunek się spełnia i zobacz, które się spełniają, a które nie
nie ma nic gorszego i brzydszego niż debugowanie takim sposobem.

0

Ok, problem rozwiązany. Po prostu skasowałem całą definicję funkcji i napisałem powoli od nowa testując każdy element. Okazało się, że trzeba wykonywać kopię danych bo się 'wtrącają' zanim zostanie wyświetlony wynik. Rozszerzyłem też planszę do 10x10.

A tu kod jak by ktoś chciał przejrzeć ;)

#include <iostream>

using namespace std;

int menu(int pole[][12]);
int ustaw(int pole[][12]);
int przewin(int pole[][12]);

int main()
{
    int pole[12][12] = {};
    menu(pole);
    
    system("pause>nul");
    return 0;
}

///// MENU Z PĘTLĄ ANTYBŁĘDNĄ

int menu(int pole[][12])
{
    system("cls");
    //// WYSWIETLANIE PLANSZY
    cout << " 1-2-3-4-5-6-7-8-9-10";
    for(int x = 1; x <= 10; ++x)
    {
    cout << endl;
    if(x==10) cout << ".";
    else cout << x;
          for(int y = 1; y <= 10; ++y)
          {
                  /// SPRAWDZANIE CZY ZYWA JEST KOMORKA
                  if(pole[x][y] == 1) cout << "#";
                  else cout << " ";
                  cout << "|";
          }
    
    cout << endl;
    cout << " -+-+-+-+-+-+-+-+-+-+-"; ///
    }
    int wybor;
    
    cout << "\n\nWybierz opcje: ";
    cout << "\n1.Wybierz zywe pola";
    cout << "\n2.Przewin 1 ture" << endl;
    cin >> wybor;
    if(wybor == 1) { ustaw(pole); }
    else if(wybor == 2) { przewin(pole); }
    else {cout << "Nie ma takiej opcji"; system("pause>nul"); system("cls"); menu(pole);}
}

////// WYBÓR Z PĘTLĄ ANTYBŁĘDNĄ

int ustaw(int pole[][12])
{
    int ax, ay;
    system("cls");
    cout << "Jesli komorka jest zywa to zostanie zniszczona,\njesli martwa to zostanie stworzona. (1-4)";
    cout << "\nPodaj X: ";
    cin >> ax;
    if(ax < 1 || ax > 10) ustaw(pole);
    cout << "\nPodaj Y: ";
    cin >> ay;
    if(ay < 1 || ay > 10) ustaw(pole);
    
    /////// USTAWIANIE ISTNIENIA
    
    if(pole[ay][ax] == 0) { pole[ay][ax] = 1; cout << "\nPole x: " << ax << " y: " << ay << " zostalo ozywione."; system("pause>nul");}
    else { pole[ay][ax] = 0; cout << "\nPole x: " << ax << " y: " << ay << " zostalo zniszczone."; system("pause>nul");}
    menu(pole);
}

int przewin(int pole[][12]) //// PAMIETAJ [y][x], ŹLE JEST BO JUŻ TE NO LICZBY JAK SIĘ SPRAWDZAJĄ NIE WIDZE ICH TO JUŻ SIĘ SUMUJĄ
{
    int kopia[12][12] = {};
    for(int y = 1; y <= 10; ++y)
    {
            for(int x = 1; x <= 10; ++x)
            {
                    int l = 0;
                        if(pole[y-1][x] == 1) l++;
                        if(pole[y+1][x] == 1) l++;
                        if(pole[y-1][x-1] == 1) l++;
                        if(pole[y+1][x+1] == 1) l++;
                        if(pole[y+1][x-1] == 1) l++;
                        if(pole[y-1][x+1] == 1) l++;
                        if(pole[y][x-1] == 1) l++;
                        if(pole[y][x+1] == 1) l++;
                        
                    if(pole[y][x] == 0)
                    {
                        if(l == 3) kopia[y][x] = 1;
                        else kopia[y][x] = 0;     
                    }
                    else
                    {
                        if(l == 2 || l == 3) kopia[y][x] = 1;
                        else kopia[y][x] = 0;
                    }
                    
                    
                    
                    
            }
    
    }
    ///// PRZYDZIALANIE PO OBLICZENIACH WARTOSCI SKOPIOWANYCH, DO ORYGINALNYCH
    for(int y = 1; y <= 10; ++y)
    {
            for(int x = 1; x <= 10; ++x)
            {
                    pole[y][x] = kopia[y][x];
            }
    }
    menu(pole);
}

0

Tak jak xeo545x39 przypuszczał można skrócić wspomniany przez niego fragment kodu, ale inaczej:

         if (l == 3 || (l == 2 && pole[y][x] != 0))
            kopia[y][x] = 1;
         else
            kopia[y][x] = 0;

Jeśli 3 żywych sąsiadów - komórka będzie żywa (nie ważne czy wcześniej była żywa czy nie).
Jeśli 2 żywych sąsiadów, a sama komórka była żywa - komórka będzie żywa.
Pozostałe przypadki - komórka będzie martwa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1