Hra života – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Hra života – C / C++ – Fórum – Programujte.comHra života – C / C++ – Fórum – Programujte.com

 

JouiBart0
Newbie
26. 10. 2009   #1
-
0
-

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.

Nahlásit jako SPAM
IP: 87.249.130.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
26. 10. 2009   #2
-
0
-

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

Nahlásit jako SPAM
IP: 78.128.199.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
26. 10. 2009   #3
-
0
-

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 ... ;)

Nahlásit jako SPAM
IP: 78.128.199.–
JouiBart0
Newbie
26. 10. 2009   #4
-
0
-

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;}


Nahlásit jako SPAM
IP: 87.249.130.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
26. 10. 2009   #5
-
0
-

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.

Nahlásit jako SPAM
IP: 78.128.199.–
JouiBart0
Newbie
2. 11. 2009   #6
-
0
-

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];}
}
}
}

Nahlásit jako SPAM
IP: 87.249.130.–
JouiBart0
Newbie
3. 11. 2009   #7
-
0
-

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;}
}
}

Nahlásit jako SPAM
IP: 89.103.39.–
KIIV
~ Moderátor
+43
God of flame
3. 11. 2009   #8
-
0
-

To JouiBart : musis hlavne dat jakou chybu...

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
JouiBart0
Newbie
3. 11. 2009   #9
-
0
-

Program se zkompiluje a nehodí žádnou chybu.... Když ho spustím tak mě vyskočí windowsácká hláška Program přestal pracovat..

Nahlásit jako SPAM
IP: 89.103.39.–
JouiBart0
Newbie
4. 11. 2009   #10
-
0
-

Už to je dobrý, řešil jsem to jinak... :smile1: a chyba byla asi v tom používat jednu proměnnou ve 2 cyklech...

Nahlásit jako SPAM
IP: 89.103.39.–
Eye0
Duch
4. 11. 2009   #11
-
0
-

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.

Nahlásit jako SPAM
IP: 83.208.239.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 12 hostů

Podobná vlákna

Flashová animace ze života — založil Jan Malý

Hra 2 — založil Zelenáč

Hra — založil Javprogramator

Hra v c — založil bohetik

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý