Potřeboval bych poradit, mám vytvořit obdobu http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life. Už jse mě povedlo vytvořit pole i ho naplnit náhodnou hodnotou (0 nebo 1), pole jsem řešil pomocí iterátoru. Ale nevím jak do toho zapojit ty podmínky.
Pokud je počet sousedů organismu menší než dva, tak živý organismus umírá na osamělost.
Pokud je počet sousedů organismu větší než tři, tak živý organismus umírá na přelidněnost.
Pokud je počet sousedů organismu roven dvěma nebo třema, tak živý organismus pokračuje do další populace.
Pokud je počet sousedů políčka bez organismu právě tři, tak zde vzniká nový organismus.
Fórum › C / C++
Hra života
No, neviem ako mas vvyriesene to pole ale budem predpokladat ze 2-rozmerne tj P[x][y];
majme este jedno pole Q, rovnako velke a rozmerne ako P
int n = P[x][y-1] + P[x][y+1] /*okolo [x,y]*/ + P[x-1][y-1] + P[x-1][y] + P[x-1][y+1] /*riadok nad*/+ P[x+1][y-1] + P[x+1][y] + P[x+1][y+1] /*riadok pod*/;
if(P[x][y] && (n>3 || n < 2))
Q[x][y] = 0;
else if(!P[x][y] && n ==3)
Q[x][y] = 1;
Q je dalsia generacia. Potom len vymen P a Q (napr pracuj len s ukazatelmi na zaciatok tych poli) a sprav to iste, potom budes mat dalsiu generaciu v P atd...
Nie su tam poriesene okrajove podmienky(ale to je uz pomerne jednoduche, len zopar ifov naviac) a obal to do nejakeho pekneho cyklu
A este som zabudol, Q by malo byt na zaciatku kopia P (a v kazdom dalsom cykle) lebo tam budu prvky co sa menit nebudu...
a nakoniec este jeden
else
Q[x][y] = P[x][y]
Nabuduce si to lepsie skontrolujem ... ;)
Díky za radu... nedalo by jse to jestě nějako udělat pomocí STL algoritmu? pole jsem definoval a naplnil
vector<vector<int> > pole;
vector<int> radek;
vector<vector<int> >::iterator itpole;
vector<int>::iterator itradek;
pole.resize(pocet_sloupcu);
for(itpole=pole.begin();itpole!=pole.end();itpole++)
{itpole->resize(pocet_radku);}
for(itpole=pole.begin();itpole!=pole.end();itpole++)
{for(itradek=itpole->begin();itradek!=itpole->end();itradek++)
{*itradek=rand()%2;}
}
for(itpole=pole.begin();itpole!=pole.end();itpole++)
{ for(itradek=itpole->begin();itradek!=itpole->end();itradek++)
if (itpole == pole.begin() || itpole == pole.end() - 1) cout << "_ ";
else {
if (itradek == itpole->begin() || itradek == itpole->end() - 1) cout << "| ";
else cout << ((*itradek == 1) ? '*' : ' ') << " ";
}
cout << endl;}
Neviem ci to mas cast zadania (vyuzitie STL), ale toto je dokonaly priklad zabijania komara 200 Megatonovou termonuklearnou hlavicou.
Co ti urcite poradim je aby si tu STL vyuzival minimalne :)
Ale ked uz... tak vector<bla bla> aj vector<vector<bla bla>> maju definovany [] a iteratory (teda aspon na vektoroch) maju definovanu aritmetiku takze mozes pouzivat + a -.
A to je vsetko, pouzi presne to iste co som uz napisal.
Měl bych ještě poslední dotaz nevíte někdo jak na určitý políčko ukazovat pomocí iterátoru abych nemusel používat pocet_sloupcu a pocet_radku?
for(x=1;x<pocet_sloupcu-1;x++)
{for(y=1;y<pocet_radku-1;y++)
{n = pole[x][y-1] + pole[x][y+1] /*okolo [x,y]*/ + pole[x-1][y-1] + pole[x-1][y] + pole[x-1][y+1] /*riadok nad*/+ pole[x+1][y-1] + pole[x+1][y] + pole[x+1][y+1] /*riadok pod*/;
if(n>3 || n < 2) {pole2[x][y] = 0;}
else {if(n ==3) {pole2[x][y] = 1;}
else {pole2[x][y] = pole[x][y];}
}
}
}
Nevíte někdo proč se my to hází chybu? (napadá mě jenom že se dostávám mimo pole, ale už jsem snad vyzkoušel všechny kombinace)
for(itpole2d=pole2d.begin()+1;itpole2d!=pole2d.end()-1;itpole2d++) //radky
for(itradek=itpole2d->begin()+1;itradek!=itpole2d->end()-1;itradek++) //sloupce
{zacatek1=itpole2d-pole2d.begin()-1;
konec1=itpole2d-pole2d.begin()+1;
zacatek2=itradek-itpole2d->begin()-1;
konec2=itradek-itpole2d->begin()+1;
for(itpole2d=pole2d.begin()+zacatek1;itpole2d!=pole2d.begin()+konec1;itpole2d++) //radky
{for(itradek=itpole2d->begin()+zacatek2;itradek!=itpole2d->begin()+konec2;itradek++) //sloupce
{n=n+ *itradek;}
}
}
Připadá mi, že jsi se učil C++ pozadu nebo se řídíš pravidlem: "Proč to dělat jednoduše, když to jde složitě". Nastíním ti, jak to udělat jednoduše, ale "přeložíš" si to do syntaxe sám.
1) Pokud je počet sousedů organismu menší než dva, tak živý organismus umírá na osamělost.
Jestliže máš dvourozměrný pole, sousedy můžeš mít 4. Nahoře, dole, vlevo, vpravo. To neplatí, pokud daný prvek na konci řady, sloupce apod.
2) Pokud je počet sousedů organismu větší než tři, tak živý organismus umírá na přelidněnost.
Vyřazený prvek z bodu 1 už nemůže mít víc, než 3 sousedy, takže tenhle bod projdou, jinak ne.
3) Pokud je počet sousedů organismu roven dvěma nebo třema, tak živý organismus pokračuje do další populace.
Vyvrženci z bodu 1 + takoví, kteří také nemají plný počet sousedů pokračuje populace.
4) Pokud je počet sousedů políčka bez organismu právě tři, tak zde vzniká nový organismus.
Nejdřív zjistím, jestli organismus existuje, jestli ne a má 3 sousedy, vytvořím nový.
První 3 pravidla běží, jestliže v daném prvku je 1 (organismus), 4. pravidlo je pod else, jestliže tam organismus není.
Všechno poběží v hlavní smyčce, která potrvá do skončení hry (nebo jestli ta hra má mít nějak stanovenou dobu), uvnitř budou další 2 smyčky, které budou procházet dvourozměrné pole po jednom prvku a volat funkci, která bude s polem pracovat jako s odkazem nebo pokud je to pole ukazatelů, tak s ukazately.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Flashová animace ze života — založil Jan Malý
Java 2D hra - tvorba menu (hra nereaguje na klavesy) — založil Marek
Moderátoři diskuze