Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Gra w życie. Warunek cyklu.

Ostatnio zmodyfikowano 2017-12-06 18:10
Autor Wiadomość
paula1902
Temat założony przez niniejszego użytkownika
» 2017-12-02 14:22:05
Właśnie w tym rzecz, że gdy zwiększam zmienną cykle przed petlą lub w pętli nie działa. To w którym momencie powinnam inkrementować cykle?

Tak. Dokładnie o to chodzi. Ma sprawdzać ostatnie 10 pokoleń. A więc zamiast
short cykle = 0;
 wystarczy
short cykle = pokolenie % 10;
?

Czyli dla pokolenie<10 muszę coś zmienić w funkcji czy_rozne ?


P-167460
mateczek
» 2017-12-02 14:45:16

Czyli dla pokolenie<10 muszę coś zmienić w funkcji czy_rozne ?

Właściwie dla pokolenie większe od 10.


Bufor kołowy wygląda tak:

10 11 12 13 14 15 _5_ 6 7 8 9
pokolenie =16;
indexTablicy 16%10 =6;
czyli aktualnie piszesz tam gdzie znajduje się cyfra "5" czyli nowe pokolenie musisz porównać z całą tablicą !!! A nie tylko <od zera do sześciu> jak masz aktualnie.

Proponował bym napisanie funkcji
C/C++
czy_rozne( tablica3D, tablicaPomocnicza, pokolenie ) {
    if( pokolenie < 10 ) zakres = pokolenie;
    else zakres = 10;
   
    for( int i = 0; i < zakres; i++ ) {
        //porónwanie tablic
    }
   
}
P-167461
paula1902
Temat założony przez niniejszego użytkownika
» 2017-12-02 19:29:50
No to wiem, że trzeba porównać z całą resztą, po to stworzyłam tablice trójwymiarową.
Eh nwm poprawiłam to ale teraz to już calkiem jest zle. Wyświetla prawidłowo tylko 1 stan(wczytany z pliku). Reszta jest wyzerowana i wyświetla się max pokolen. A więc ani prawidłowo nie wyznacza sąsiadów ani nie przerywa jak się powtarza. Załamka normalnie.

A ta tablica pomocnicza była tylko do tego, aby prawidłowo oceniać sąsiadów, bez niej gdy komórka przykładowo stawała się żywa to dla sprawdzenia kolejnej komórki była traktowana już jako żywa.
Więc po co mi ona jako argument funkcji czy_rozne?

 
C/C++
#include <iostream>
#include <fstream>
#include <Windows.h>
#include <cstdlib>
#define TABSIZE1 10
#define TABSIZE2 10
#define CYKLE 10
using namespace std;

bool czy_rozne( short tab[][ TABSIZE1 ][ TABSIZE2 ], short pokolenie ) //sprawdza czy wyswietlane stany komorek sa rozne
{
    short zakres;
    if( pokolenie < 10 )
         zakres = pokolenie;
    else zakres = 10;
   
    for( short k = 0; k < zakres; k++ )
    {
        for( short i = 0; i < TABSIZE1; i++ )
        {
            for( short j = 0; j < TABSIZE1; j++ )
            {
                if( tab[ zakres ][ i ][ j ] != tab[ k ][ i ][ j ] )
                     return true;
               
            }
        }
    }
    return false;
}

short pozycjax( short wspolrzedna ) { //ustala wspolrzedne x sasiadow z uwzglednieniem krancow tablicy
    if( wspolrzedna >= 0 || wspolrzedna < TABSIZE1 ) return wspolrzedna;
   
    if( wspolrzedna <= - 1 ) return TABSIZE1 - 1;
   
    if( wspolrzedna >= TABSIZE1 ) return 0;
   
}

short pozycjay( short wspolrzedna ) { //ustala wspolrzedne y sasiadow z uwzglednieniem krancow tablicy
    if( wspolrzedna >= 0 || wspolrzedna < TABSIZE2 ) return wspolrzedna;
   
    if( wspolrzedna <= - 1 ) return TABSIZE2 - 1;
   
    if( wspolrzedna >= TABSIZE2 ) return 0;
   
}

short nowa_tablica( short( & tab )[ CYKLE ][ TABSIZE1 ][ TABSIZE2 ], short cykle, short x, short y ) // ustala kolejny stan
{
    int l_zywych_sasiadow = 0;
   
    if( tab[ cykle ][ pozycjax( x - 1 ) ][ pozycjay( y - 1 ) ] == 1 ) l_zywych_sasiadow++;
   
    if( tab[ cykle ][ pozycjax( x - 1 ) ][ pozycjay( y ) ] == 1 ) l_zywych_sasiadow++;
   
    if( tab[ cykle ][ pozycjax( x - 1 ) ][ pozycjay( y + 1 ) ] == 1 ) l_zywych_sasiadow++;
   
    if( tab[ cykle ][ pozycjax( x ) ][ pozycjay( y - 1 ) ] == 1 ) l_zywych_sasiadow++;
   
    if( tab[ cykle ][ pozycjax( x ) ][ pozycjay( y + 1 ) ] == 1 ) l_zywych_sasiadow++;
   
    if( tab[ cykle ][ pozycjax( x + 1 ) ][ pozycjay( y - 1 ) ] == 1 ) l_zywych_sasiadow++;
   
    if( tab[ cykle ][ pozycjax( x + 1 ) ][ pozycjay( y ) ] == 1 ) l_zywych_sasiadow++;
   
    if( tab[ cykle ][ pozycjax( x + 1 ) ][ pozycjay( y + 1 ) ] == 1 ) l_zywych_sasiadow++;
   
    if( tab[ cykle ][ x ][ y ] == 1 ) // jesli komorka byla zywa
    {
        if( l_zywych_sasiadow == 2 || l_zywych_sasiadow == 3 )
             return 1;
        else
             return 0;
       
    }
    else //(komorka==0)
    if( l_zywych_sasiadow == 3 )
         return 1;
   
}

void wyswietl( short tab[ CYKLE ][ TABSIZE1 ][ TABSIZE2 ], short cykle ) //wyswietla tablice dla poszczegolnego cyklu
{
    for( short i = 0; i < TABSIZE1; i++ )
    {
        for( short j = 0; j < TABSIZE2; j++ )
             cout << tab[ cykle ][ i ][ j ] << " ";
       
        cout << endl;
    }
}

int main( int argc, char * argv[] )

{
    short pokolenie = 1;
    short ile_pokolen = 15; //ile chcemy wyswietlac max
    short l_zywych_sasiadow;
    short x;
    short y;
    short cykle = 1;
   
    short tab[ CYKLE ][ TABSIZE1 ][ TABSIZE2 ] = { 0 };
    short tab_pom[ TABSIZE1 ][ TABSIZE2 ]; //tablica pomocnicza (do spr sasiadow prawidlowo)
    ifstream plik;
   
    //plik.open("zywe.txt");
    if( argc > 1 ) {
        string parametr;
        parametr = argv[ 1 ];
        plik.open( argv[ 1 ] );
    }
    else
         cout << "Nie podano wlasciwego parametru!";
   
   
    if( !plik.good() )
    {
        cout << "Nie udalo sie otworzyc pliku!";
        return 0;
    }
   
    while( !plik.eof() ) //spawdzanie do konca pliku
    {
        plik >> x;
        plik >> y;
        tab[ cykle ][ x ][ y ] = 1; // tablica po wczytaniu zyjacych komorek z pliku
    }
   
    plik.close();
   
    ///////
   
    do
    {
       
        wyswietl( tab, cykle );
        cout << endl << "Pokolenie nr " << pokolenie << endl;
        cout << endl << "cykl nr " << cykle << endl;
        cout << endl;
        pokolenie++;
        cykle = pokolenie % 10;
        //Sleep(1500);
        //system("cls");
       
       
        for( short x = 0; x < TABSIZE1; x++ ) //wyznaczanie kolejngo cyklu(wymiaru) tablicy
        {
            for( short y = 0; y < TABSIZE2; y++ )
            {
                if( nowa_tablica( tab, cykle, x, y ) == 1 )
                {
                    tab_pom[ x ][ y ] = 1;
                }
                else
                {
                    tab_pom[ x ][ y ] = 0;
                }
            }
        }
        for( short x = 0; x < TABSIZE1; x++ )
        for( short y = 0; y < TABSIZE2; y++ )
             tab[ cykle ][ x ][ y ] = tab_pom[ x ][ y ];
       
    } while((( czy_rozne( tab, pokolenie ) ) == true ) &&( pokolenie <= ile_pokolen ) );
   
    system( "pause" );
    return 0;
}
P-167474
mateczek
» 2017-12-02 19:39:26
oczywiście że jest źle. Dlatego jest źle że w tablicy 3D masz element ostatni i porównujesz go z samym sobą !!! Spróbuj oswoić się z debuggerem !!! ikonka robaka w twoim IDE pozwoli Ci analizować kod w pracy krokowej sam zobaczysz co nie działa zgodnie z twoim pomysłem.
P-167475
paula1902
Temat założony przez niniejszego użytkownika
» 2017-12-02 19:45:58
Racja.. dodałam warunek i nadal nie działa ;((

C/C++
bool czy_rozne( short tab[][ TABSIZE1 ][ TABSIZE2 ], short pokolenie ) //sprawdza czy wyswietlane stany komorek sa rozne
{
    short zakres;
    if( pokolenie < 10 )
         zakres = pokolenie;
    else zakres = 10;
   
    for( short k = 0; k < zakres; k++ )
    {
        if( k != zakres ) {
            for( short i = 0; i < TABSIZE1; i++ )
            {
                for( short j = 0; j < TABSIZE1; j++ )
                {
                    if( tab[ zakres ][ i ][ j ] != tab[ k ][ i ][ j ] )
                         return true;
                   
                }
            }
        }
    }
    return false;
}
P-167476
mateczek
» 2017-12-02 20:04:53
widzisz ja miałem taki pomysł by w tablicy 3D trzymać poprzednie cykle i porównywać je z tablicą pomocniczą gdzie masz ostatnio obrabiany !!!


Jeśli już to funkcje można poprawić w ten sposób. musisz albo przekazać albo wyliczyć index ostatnio dodanego elementu aby go porównać z resztą zapamiętanych. Zdajesz sobie sprawę że teraz w kolejce masz 9 ostatnich pokoleń+aktualne pokolenie i aktualne pokolenie porównujesz do 9 poprzednich??
C/C++
bool czy_rozne( short tab[][ TABSIZE1 ][ TABSIZE2 ], short pokolenie ) //sprawdza czy wyswietlane stany komorek sa rozne
{
    short zakres;
    if( pokolenie < 10 )
         zakres = pokolenie;
    else zakres = 10;
   
    int ostatni_obrabiany = pokolenie % 10; // indeks ostatniego dodanego elementu do tablicy 3D
    for( short k = 0; k < zakres; k++ )
    {
        if( k == ostatni_obrabiany ) continue; // nie ma sensu porównywać z samsym sobą
       
        for( short i = 0; i < TABSIZE1; i++ )
        {
            for( short j = 0; j < TABSIZE1; j++ )
            {
                if( tab[ ostatni_obrabiany ][ i ][ j ] != tab[ k ][ i ][ j ] )
                     return true;
               
            }
        }
    }
    return false;
}
P-167477
paula1902
Temat założony przez niniejszego użytkownika
» 2017-12-02 21:05:56
No dobrze, ale w takim razie dlaczego kolejne stany wyswietlaja sie poprawnie ale gdy zmienna cykle się nie zmienia.
C/C++
if( pokolenie < 10 )
     cykle = pokolenie;
else cykle = pokolenie % 10;
Po tym warunku wszystko szlag trafia.. Nie mogę znalezc błedów..
 a gdy daję to przed pętlą do while, nie zmienia się numer cyklu.. to dziala dla tych danych.

2 2
3 3
2 7
3 4
4 3
5 5
6 5
7 1
8 6
P-167479
mateczek
» 2017-12-02 22:05:24
myślę że nie ma sensu łatać tego kodu . proponuje napisać od nowa
C/C++
if( tab[ zakres ][ i ][ j ] != tab[ k ][ i ][ j ] )
     return true; //pierwsza różna tablica kończy funkcję nie sprawdza innych [/code]

[ cpp ] short cykle = 1; // jeśli to ma być index tablicy to musisz zaczynać od zera !!!
P-167480
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona