Hra život s načtením ze souboru – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Hra život s načtením ze souboru – Pascal – Fórum – Programujte.comHra život s načtením ze souboru – Pascal – Fórum – Programujte.com

 

vlakilos
~ Anonymní uživatel
1 příspěvek
17. 12. 2011   #1
-
0
-

Dobrý den,

dostali jsme úkol a vzhledem k tomu, že jsem si vybral jiný obor, než programovaní. Mám problém s tím ho vytvořit. Potřeboval bych navést (poměrně hodně). Budu rád za každou pomoc.

Jedná se o hru život do, které se nahraje počáteční stav ze souboru. Ten vypadá takhle:

6
010010
011110
100001
101101
100001
011110

Poté potřebuju vytvořit podmatici, která zajistí, aby okrajové prvky byly neživé.

Zatím jsem vytvořil výpis, ale nefunguje teda jak má:

program Hra_zivot;
uses crt;
const Nk = 6;
type RADEK = array [1..Nk] of char;
     MAT = array [1..Nk] of RADEK;

var N,I:integer;
    A:MAT;
    B:RADEK;

procedure POCSTAV (var A:MAT; var N:integer; JMS:string);
var f:text;
    i,j:integer;
begin
assign (f,JMS);
reset (f);
readln (f,n);
for i:=1 to n do
        begin
         for j:=1 to n do
                 read(f,A[i,j]);

        end;
close (f);
end;


Procedure VYPIS (var A:MAT; N:integer);
var i,j : integer;
begin

for i:=1 to n do
begin
for j:=1 to n do write (A[i,j]);

end;
writeln;
end;

begin
clrscr;
I:=0;
POCSTAV (A, n, 'KOCKA.ZIV');
VYPIS (A,n);
readln;
end.

Výpis potom vypadá takhle:

010010
011110
100001
101101
100

a zbytek se nezobrazí. Každopádně pak asi předpokldám, že musím char převést na boolean a pak dál nějak ...

Mockrát děkuji za každou radu a moc si ji vážím.

Nahlásit jako SPAM
IP: 83.240.118.–
zlz
~ Anonymní uživatel
634 příspěvků
17. 12. 2011   #2
-
0
-

Při tom načítání načteš i znaky, kterými se označuje konec řádku. V DOS/Windows se řádky ukončují dvěma znaky, takže ti to načte 4 celé řádky (4*(6+2)) a 4 znaky.z pátého. Dá se to vytušit už z toho, že ten výpis je odřádkovaný.

Jednoduše to můžeš opravit přidáním readln/writeln na konec řádku při načítání/vypisování.

Nahlásit jako SPAM
IP: 213.211.51.–
Mircosoft+1
Věrný člen
22. 12. 2011   #3
-
0
-

Asi už jdu pozdě, ale třeba se ještě pár tipů bude hodit...

Data bych načítal po řádcích (Readln) do nk-znakového řetězce (třeba var radek:string[nk]). Ten se pak dá projít znak po znaku a podle nich nastavit prvky matice. Ale s načítáním znak po znaku to samozřejmě půjde taky, když se ošetří ty konce řádků.

S maticí by se nejlépe pracovalo ve tvaru array[1..nk,1..nk] of boolean, nastavení jednoho prvku by pak mohlo vypadat třeba takhle: matice[i,j]:=radek[j]='1' (radek[j]='1' je logický výraz, který dá hodnotu true, pokud se to rovná, a false, pokud ne). Ale zase by se to nedalo vypisovat přímo na obrazovku, musel bys ifem vybrat znak '0' nebo '1'. Z hlediska snadnosti výpisu by tedy bylo nejlepší, kdyby matice byla pole nk stringů (i s tím by se dalo pracovat).

Potom při počítání přírůstků a úbytků nezapomeň, že je potřeba mít dvě matice: jednu s aktuálním stavem, ze které čteš kde co je, a druhou s novým stavem, do které zapisuješ. Až všechno přepočítáš, zkopíruj novou matici do aktuální.

Nevím, jak je myšlena ta "podmatice, která zajistí, aby okrajové prvky byly neživé". Kdybych chtěl zabít okraje, prošel bych je dvěma cykly a nastavil na "neživý" (false nebo '0'): jeden cyklus by šel vodorovně a měnil by první a poslední řádek, druhý svisle a měnil by první a poslední sloupec. Jestli jsem to dobře pochopil, tak ti jde asi jenom o to, jak si zjednodušit počítání živých prvků poblíž okrajů matice: když přidáš okraje plné mrtvol, zbavíš se práce s kontrolou, jestli zkoumaný prvek náhodou neleží mimo matici. Pak to ale chce rozsah matice zvětšit na [0..nk+1] ("provozní" data budou jenom na pozicích 1..nk, pomocné pozice 0 a nk+1 budou pořád mrtvé).

Radši bych to ale nekomplikoval a ve výpočtech bych prostě přidal podmínku, že pokud se souřadnice nějakého zkoumaného prvku nacházejí mimo oblast matice, má se považovat za neživý. Na to by bylo ideální napsat funkci: function zije(var A:mat; n:integer; i,j:integer):boolean. Ta by nejdřív zkontrolovala souřadnice. Kdyby byly mimo, vrátí false a konec. Jinak by se podívala do matice a vrátila by true nebo false podle toho, co by tam našla.

Další možnost je, že by funkce nevracela booleany (i když by to bylo logické), ale číslo 0 nebo 1. Případně že by přímo ta matice byla složená z čísel a ne z booleanů ani z charů. Bylo by to výhodnější - protože hlavním účelem je spočítat, kolik je okolo zkoumaného prvku živých, stačilo by prostě sečíst hodnoty všech osmi okolních políček.

A jéje, zase jsem místo jednoduché rady skončil chaotickým brainstormingem :-]. No nic, snad to k něčemu bude.

Nahlásit jako SPAM
IP: 212.118.224.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
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, 8 hostů

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ý