Gra w życie, tablica wyświetla same 0 lub same 1.

0

Prześledziłem pracę kodu debuggerem i teoretycznie wszystko działa tak jak powinno. Jednak konsola w następnym ruchu wyświetla same zera lub jedynki. Od dwóch dni stoję w tym samym punkcie nie mogąc znaleźć przyczyny czemu tak się dzieje. Próbowałem także użyć switcha w metodzie cell_condition z takim samym skutkiem.

class Class1
    {
        int[,] plansza = new int[10, 10];
        int[,] nastepna = new int[10, 10];
        int[] pomocnicza = new int[100];
        int y, x;
        int a, b, c, d, e, f, g, h;
        int i = -1;

        public void fill_random()                                  //wypełnij losowo
        {
            Random random = new Random();

            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    plansza[i, j] = random.Next(2);
                }
            }
        }


        public void show()                                      //wyświetlenie tablicy w formie tabeli
        {
            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    Console.Write(plansza[i, j] + " ");
                    if (j == 9)
                        Console.WriteLine(" ");
                }
            }
        }


        public void next()
        {
            for (int y = 0; y < 10; y++)
            {
                for (int x = 0; x < 10; x++)
                {


                    if (y - 1 < 0 || x - 1 < 0 || y - 1 > 9 || x - 1 > 9)              //definicja sąsiadów, sprawdzenie czy nie wykraczają poza
                        a = 0;                                                        // zakres tablicy i obliczanie sumy ich wartości
                    else
                        a = plansza[y - 1, x - 1];

                    if (y - 1 < 0 || x < 0 || y - 1 > 9 || x > 9)
                        b = 0;
                    else
                        b = plansza[y - 1, x];

                    if (y - 1 < 0 || x + 1 < 0 || y - 1 > 9 || x + 1 > 9)
                        c = 0;
                    else
                        c = plansza[y - 1, x + 1];

                    if (y < 0 || x - 1 < 0 || y > 9 || x - 1 > 9)
                        d = 0;
                    else
                        d = plansza[y, x - 1];

                    if (y < 0 || x + 1 < 0 || y > 9 || x + 1 > 9)
                        e = 0;
                    else
                        e = plansza[y, x + 1];

                    if (y + 1 < 0 || x - 1 < 0 || y + 1 > 9 || x - 1 > 9)
                        f = 0;
                    else
                        f = plansza[y + 1, x - 1];

                    if (y + 1 < 0 || x < 0 || y + 1 > 9 || x > 9)
                        g = 0;
                    else
                        g = plansza[y + 1, x];

                    if (y + 1 < 0 || x + 1 < 0 || y + 1 > 9 || x + 1 > 9)
                        h = 0;
                    else
                        h = plansza[y + 1, x + 1];
                    
                    i += 1;
			        pomocnicza[i] = a + b + c + d + e + f + g + h;      //zapisanie dla każdej komórki sumy sąsiadów
                    
                }
            }
        }


            public void cell_condition()
            {
                 for (int y = 0; y < 10; y++)            //algorytm zmiany stanu komórek i przypisanie otrzymanej wartości do tablicy nastepna[]
            {
                for (int x = 0; x < 10; x++)
                {
                    for (int i = 0; i < 100; i++)
                    {
                        if (pomocnicza[i] == 0 || pomocnicza[i] == 1 || pomocnicza[i] == 4 || pomocnicza[i] == 5 || pomocnicza[i] == 6 || pomocnicza[i] == 7 || pomocnicza[i] == 8)
                        {
                            nastepna[y, x] = 0;
                        }
                        else if (pomocnicza[i] == 3)
                        {
                            nastepna[y, x] = 1;
                        }
                        else
                        {
                            plansza[y, x] = nastepna[y, x];
                        }
                    }
                }
            }
            }



        public void show_next()                 //pokaz tablice zawierajaca wynik w nastepnej rundzie
        {
            Console.ReadKey();
            Console.WriteLine();
            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    Console.Write(nastepna[i, j] + " ");
                    if (j == 9)
                        Console.WriteLine(" ");
                }
            }
        }


    } 
1

A co chciałbyś żeby wyświetlała?

        public void show_next()                 //pokaz tablice zawierajaca wynik w nastepnej rundzie
        {
            Console.ReadKey();
            Console.WriteLine();
            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    Console.Write(nastepna[i, j] + " ");
                    if (j == 9)
                        Console.WriteLine(" ");
                }
            }
        }

Wypisujesz zawartość tablicy nastepna.

A do tablicy nastepna zapisujesz tylko tutaj:

                        if (pomocnicza[i] == 0 || pomocnicza[i] == 1 || pomocnicza[i] == 4 || pomocnicza[i] == 5 || pomocnicza[i] == 6 || pomocnicza[i] == 7 || pomocnicza[i] == 8)
                        {
                            nastepna[y, x] = 0;
                        }
                        else if (pomocnicza[i] == 3)
                        {
                            nastepna[y, x] = 1;
                        }
                        else
                        {
                            plansza[y, x] = nastepna[y, x];
                        }

Jakby nie kombinować, nie wypiszesz czegoś innego niż 0 albo 1.

0

O to chodzi w tej grze, 0 to komórki martwe a jedynki żywe, problem w tym że w następnej rundzie tablica wyświetla albo 100 zer albo 100 jedynek.

0

Nie mam kompilatora C# przy sobie, więc nie dam rady debugować, ale na oko:

for (int y = 0; y < 10; y++)            //algorytm zmiany stanu komórek i przypisanie otrzymanej wartości do tablicy nastepna[]
            {
                for (int x = 0; x < 10; x++)
                {
                    for (int i = 0; i < 100; i++)
                    {
                        if (pomocnicza[i] == 0 || pomocnicza[i] == 1 || pomocnicza[i] == 4 || pomocnicza[i] == 5 || pomocnicza[i] == 6 || pomocnicza[i] == 7 || pomocnicza[i] == 8)
                        {
                            nastepna[y, x] = 0;
                        }
                        else if (pomocnicza[i] == 3)
                        {
                            nastepna[y, x] = 1;
                        }
                        else
                        {
                            plansza[y, x] = nastepna[y, x];
                        }
                    }
                }
}

To wygląda podejrzanie.

Co powinna ta funkcja robić? Aktualizować tablicę "plansza" z obecnego stanu do następnego?

Z jakiegoś powodu dzielisz tablice nastepna i plansza. Wydaje mi się że tablica nastepna jest w ogóle niepotrzebna, i powinieneś używać tylko tablicy "plansza" wszedzie. To raz.

Dwa, tablica 'pomocnicza' z jakiegoś powodu jest jednowymiarowa zamiast dwuwymiarowej - nie widzę czemu, pozostałe tablice masz dwuwymiarowe, a kod byłby dużo lepszy.

Trzy i najważniejsze, przechodzisz po całej tablicy 100 razy, tak na pewno nie powinno być (najbardziej wewnętrzna pętla, po i, przechodzi 100 razy, a wcześniej masz pętle po x i y po 10 razy).

Zmień tablicę pomocnicza na dwuwymiarową, wyrzuć tablicę 'następna', usuń pętlę for (int i = 0; i < 100; i++) z funkcji cell_condition i będzie działać.

0

Pętla 'i' przechodziła 100 razy bo tablica była jednowymiarowa. Zrobiłem tak jak powiedziałeś, usunąłem zbędną tablicę, tablicę pomocnicza przerobiłem na dwuwymiarową, nawet odchudziłem trochę kod i wszystko działa tak jak ma działać.

Dziękuje za pomoc.

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