ŻYCIE W PASCALU, modyfikacja programu


(Teq 18) #1

Witam , mam problem ponieważ muszę zrobić program "życie w pascalu" który polega na tym że :

Na ekranie losowo pojawiają się kropki koloru np. Jasno szarego (będzie to 1 pokolenie) , gdy obok jakiejś kropki znajdą się dwie takie same kropki w tym samym kolorze , to ta która kropka wokół której pojawiły się dwie inne zamienia kolor na szary (jest to 2 pokolenie) . wtedy tak samo gdy obok tej kropki pojawią się 2 kropki w kolorze szarym , zamienia się w kolor biały ( 3 pokolenie ) ,aż na całym ekranie będą wszystkie białe kropki albo ekran będzie pusty obojętnie.

Nie mogę ogarnąć tego programu . znalazłem takie coś ale to nie jest to czego szukam i potrzebuje.

Ostatecznie żeby nie było tyle roboty , mogą być 2 pokolenia , i nie musi być dużo tych kropek , byle było widać że kolorki się zmieniają gdy jest dwóch takich samych sąsiadów ; ) Nie musi być to program profesjonalny , może być napisany jak najłatwiej AMATORSKO byle coś się tam działo na temat ; ) Z góry dzięki za pomoc ; ) Za działając kod mogę podarować doładowanie 10-20zł do telefonu , symbolicznie :wink:

Program gotowy potrzebuje do niedzieli godziny 18 , proszę o pomoc :slight_smile:

program zycie;


const ilosc = 50; {ile pokolen mamy ogladac\}


wielkosc = 23; {jak duza ma byc plansza\}


type tablica = array [1..wielkosc, 1..wielkosc] of boolean;


tab = array [1..wielkosc, 1..wielkosc] of integer;


var aktualna, poprzednia: tablica;


oto: tab; {tutaj dla kazdej kropki zliczamy jej sasiadow\}


h, g, n: integer;


procedure zageszczenie (var kolonia: tablica; var otoczenie: tab);


var j, k: integer;

{liczymy liczbe sosiadow dla kazdej komorki\}


begin

{inicjalizujemy tablice, na poczatku zadna tablica nie ma sasiadow\}

for j := 1 to wielkosc do


        begin


        for k := 1 to wielkosc do


        begin


        otoczenie [j, k] := 0;


        end;

end;


        for j := 1 to wielkosc do


        begin


        for k := 1 to wielkosc do


        begin


        {jezeli dana komorka zyje to musimy zwiekszyc liczbe sasiadow u jej wszystkich sasiadow\}

        if kolonia [j, k] then


                begin


                if j > 1 then otoczenie [j - 1, k] := otoczenie[j - 1, k] + 1;


                if k > 1 then otoczenie [j, k - 1] := otoczenie[j, k - 1] + 1;


                if (k > 1) and (j > 1) then otoczenie [j - 1, k - 1] := otoczenie[j - 1, k - 1] + 1;


                if (k < wielkosc) and (j < wielkosc) then otoczenie [j + 1, k + 1] := otoczenie[j + 1, k + 1] + 1;


                if (k > 1) and (j < wielkosc) then otoczenie [j + 1, k - 1] := otoczenie[j + 1, k - 1] + 1;


                if (k < wielkosc) and (j > 1) then otoczenie [j - 1, k + 1] := otoczenie[j - 1, k + 1] + 1;


                if j < wielkosc then otoczenie [j + 1, k] := otoczenie[j + 1, k] + 1;


                if k < wielkosc then otoczenie [j, k + 1] := otoczenie[j, k + 1] + 1;


                end;


        end;


        end;


end;



procedure losuj (var kolonia: tablica);


var j, k: integer;


{losujemy pierwsze pokolenie\}


begin

{inicjalizacja losowania\}

randomize;


for j := 1 to wielkosc do


begin


for k := 1 to wielkosc do


begin


{aby nie bylo za nudno tylko mniej wiecej co 5. komorka na poczatku bedzie zywa\}


if random(5) = 0 then kolonia [j, k] := true


else kolonia [j, k] := false;


end;


end;


end;



procedure wypisz (var kolonia: tablica);


var j, k: integer;


{wypisyjemy na ekran dane pokolenie\}


begin


for j := 1 to wielkosc do


begin


for k := 1 to wielkosc do


begin


if kolonia [j, k] then write ('*')


else write (' ');


end;



writeln;


end;


end;



procedure nowe_pokolenie (var nowa, stara: tablica; var otoczenie: tab);


var j, k: integer;


{tutaj tworzymy tablice z nowym pokoleniem na podstawie zliczonych wczesniej\}


{ilosci sasiadow danej komorki\}


begin


for j := 1 to wielkosc do


        begin


        for k := 1 to wielkosc do


                begin


                nowa [j, k] := false;


                if otoczenie [j, k] = 3 then nowa [j, k] := true


                else if (otoczenie [j, k] = 2) and stara [j, k] then nowa [j, k] := true;


                end;


        end;


end;


        begin


        writeln ('Oto 1. pokolenie:');


        losuj (poprzednia);


        wypisz (poprzednia);


        readln; {czeka na ENTER\}


        for n := 2 to ilosc do


                begin


                writeln ('Oto ', n, '. pokolenie:');


                zageszczenie (poprzednia, oto);


                nowe_pokolenie (aktualna, poprzednia, oto);


                wypisz (aktualna);


                {do tablicy 'poprzednia' przpisujemy tablice 'aktulana'\}


                for h := 1 to wielkosc do


                        begin


                        for g := 1 to wielkosc do poprzednia [h, g] := aktualna [h, g];


                        end;


         readln;


         end;


end.

(kebkit) #2

to jest imitacja programu Conwaya z lat 70 algorytmu programu Life

http://en.wikipedia.org/wiki/Conway’s_Game_of_Life


(Teq 18) #3

No dokładnie , tylko nie wiem jak napisać ten program . Pomógłby ktoś napisać ten program ? Nie musi być zaawansowany , prosty programik . Niestety nie jestem na tym etapie jeszcze programowania :confused:


(Mirek Sztramski) #4

@RaveStar

Brutalnie zagrałeś :wink:


(Teq 18) #5

Bardzo hehe Nie rozumiem nic z tego :stuck_out_tongue:


(Teq 18) #6

Niestety dalej nie wiem o co chodzi , przypominam że jestem zielony z programowania w pascalu . Moja wiedza to : Tablice , Procedury , Funkcję , Jakieś obliczenia bez przesady z poziomem :slight_smile: Chciałem spróbować , 3 tablice zrobić ( 3 pokolenia kropek ) w tym kolory ustawić zamiast kropek zrobić gwiazdki * , i dalej bym nie wiedział co zrobić i by wyszła animacja przy naciskaniu entera .

W trybie grficznym można użyć delay i coś tam jeszcze i ładnie płynnie chodzi tylko że wtedy bym co najwyżej zrobić circle i wpisywać współrzędne stałe , ale znowu dalej bym nie wiedział co zrobić :stuck_out_tongue:

napisać bym chciał najlepiej jakiś prymitywny kod Z użyciem prostych tablic procedur i jakiś małych obliczeń , albo zobaczyć w tym trybie graficznym Circle ( położenie) , sąsiedzi Circle ( położenie pierwszego kółka - 1 ), następne pokolenie znowu Circle ( położenie ) .Chociaż byle były jakieś kropki albo gwiazdki i gdy ma 2 sąsiadów powstaje nowa gwiazdka albo jakiś inny znaczek . Ale nie wiem czy warto któryś z tych pomysłów zaczynać .


(Teq 18) #7

Wiem że pascal to już nie ta epoka , ale ja MUSZĘ napisać to w pascalu niestety : /


(kebkit) #8

https://www.google.pl/search?client=ope … 91&bih=684


(kebkit) #9

ja na studiach mialem jeden semestr w pascalu i sobie chwale…

zajecia odbywaly sie z pomoca serwera i każdy mial swoje konto shell na serwerze UNIX

kompilator pc i gpc