LIVE Gra w życie. - wpisz do niej polecenie z ramki. - uruchom program poleceniem F9

Podobne dokumenty
LIVE Gra w życie. LIVE w JavaScript krok po kroku. ANIMACJA Rozpoczynamy od podstawowego schematu stosowanego w animacji

Opis implementacji: Implementacja przedstawia Grę w życie jako przykład prostej symulacji opartej na automatach.

Nazwa implementacji: Kółko i krzyżyk w Lazarusie. Autor: Piotr Fiorek Andrzej Stefaniuk

Po uruchomieniu Lazarusa należy wybrać z paska górnego opcję Projekt i następnie Nowy Projekt. Pokaże się okno:

Wprowadzenie do systemu Delphi

Obsługa grafiki w Delphi, rysowanie na płótnie, obsługa myszki, zapisywanie obrazków do plików, bitmapy pozaekranowe.

PROGRAM: WYSZUKANIE LICZBY MAKSYMALNEJ

Wykład 7: Lazarus GUI

Przenoszenie, kopiowanie formuł

Baltie 3. Podręcznik do nauki programowania dla klas I III gimnazjum. Tadeusz Sołtys, Bohumír Soukup

Wstawianie nowej strony

Animacje z zastosowaniem suwaka i przycisku

narzędzie Linia. 2. W polu koloru kliknij kolor, którego chcesz użyć. 3. Aby coś narysować, przeciągnij wskaźnikiem w obszarze rysowania.

Tak przygotowane pliki należy umieścić w głównym folderze naszego programu. Klub IKS

KARTA INFORMACYJNA Z INFORMATYKI DO KLASY 6. Imię i nazwisko ucznia:

Delphi. Lazarus. Kompilatory Delphi. Linki do stron o Delphi

Ćwiczenie z wykorzystaniem zmiennych i komponentu TGauge. TTimer co pewien czas. Gra. A jednak odlicza. Stoper. Aktualny czas, czyli zegar

Jeżeli pole Krawędź będzie zaznaczone uzyskamy obramowanie w całej wstawianej tabeli

przedmiot kilka razy, wystarczy kliknąć przycisk Wyczaruj ostatni,

Delphi 7 + Indy 10 Przykłady prostych aplikacji sieciowych

Delphi podstawy programowania. Środowisko Delphi

Zadanie Wstaw wykres i dokonaj jego edycji dla poniższych danych. 8a 3,54 8b 5,25 8c 4,21 8d 4,85

Podstawy tworzenia prezentacji w programie Microsoft PowerPoint 2007

Cel: Przypisujemy przyciskom określone funkcje panel górny (Panel1)

Przed rozpoczęciem pracy otwórz nowy plik (Ctrl +N) wykorzystując szablon acadiso.dwt

Zadanie 3. Praca z tabelami

etrader Pekao Podręcznik użytkownika Strumieniowanie Excel

Ćwiczenia nr 4. Arkusz kalkulacyjny i programy do obliczeń statystycznych

Widok po uruchomieniu. Widok w trakcie gry

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

3.4. Opis konfiguracji layoutów.

Opis programu Profbi Delegacje 2011 Delegacje Krajowe.

Badanie ruchu złożenia

Budowa aplikacji z graficznym interfejsem użytkownika - GUI (Graphic User Interface)

Program powinien otworzyć się z pierwszym formularzem. Jeśli nie, otwórz pierwszy formularz, wybierając go z listy - Shift+F12.

Niniejszy ebook jest własnością prywatną.

Usługi Informatyczne "SZANSA" - Gabriela Ciszyńska-Matuszek ul. Świerkowa 25, Bielsko-Biała

Informatyka II. Laboratorium Aplikacja okienkowa

Bazy danych kwerendy (moduł 5) 1. Przekopiuj na dysk F:\ bazę M5KW.mdb z dysku wskazanego przez prowadzącego

Adobe InDesign lab. 2 Jacek Wiślicki, Paweł Kośla. Spis treści: 1 Dokument wielostronicowy Książka Eksport do PDF... 7.

Formularz pierwszej oceny w służbie cywilnej

DOKUMENTY I GRAFIKI. Zarządzanie zawartością Tworzenie folderu Dodawanie dokumentu / grafiki Wersje plików... 7

Formularze w programie Word

Zaprojektuj grę logiczną NIM. Program losuje w każdym rzędzie od 1 do 10 grzybów. Gracz

Lazarus dla początkujących, część III

Projekt ZSWS. Instrukcja uŝytkowania narzędzia SAP Business Explorer Analyzer. 1 Uruchamianie programu i raportu. Tytuł: Strona: 1 z 31

01 grid tablica grid. Copyright 2017, mgr inż. Janusz Bonarowski 1

Tworzenie własnych komponentów

Aplikacja kret dla App Inventor 2

5.4. Tworzymy formularze

Dostosowanie szerokości kolumn

Opis programu Profbi Delegacje 2013 Delegacje Krajowe i Zagraniczne.

Ćwiczenie 2 Warstwy i kształty podstawowe

Karty pracy. Ustawienia. W tym rozdziale została opisana konfiguracja modułu CRM Karty pracy oraz widoki i funkcje w nim dostępne.

Zakładka Obmiar jest dostępna dla pozycji kosztorysowej w dolnym panelu. Służy do obliczania ilości robót (patrz też p ).

Informatyka Arkusz kalkulacyjny Excel 2010 dla WINDOWS cz. 1

LibreOffice Impress. Poziom podstawowy. Materiały szkoleniowe

Arkusz kalkulacyjny MS Excel 2010 PL.

I Tworzenie prezentacji za pomocą szablonu w programie Power-Point. 1. Wybieramy z górnego menu polecenie Nowy a następnie Utwórz z szablonu

Animacje cz. 2. Rysujemy koło zębate

W przeciwnym wypadku wykonaj instrukcję z bloku drugiego. Ćwiczenie 1 utworzyć program dzielący przez siebie dwie liczby

Ćwiczenie 1 Automatyczna animacja ruchu

Podstawy technologii WWW

Procedury i funkcje - powtórzenie i uzupełnienia. Przykład funkcji potęgowanie przy wykładniku naturalnym

procedure TForm1.POZIOMO(x,y,n,d,o,k:integer); W przycisku PIONOWE wpisz instrukcję: POZIOMO(110,110,10,100,10,clRed);

Utworzenie aplikacji mobilnej Po uruchomieniu Visual Studio pokazuje się ekran powitalny. Po lewej stronie odnośniki do otworzenia lub stworzenia

pakiet KADRY I PŁACE

Informatyka Arkusz kalkulacyjny Excel 2010 dla WINDOWS cz. 1

Robert Barański, AGH, KMIW MathScript and Formula Nodes v1.0

Adobe InDesign lab.1 Jacek Wiślicki, Paweł Kośla. Spis treści: 1 Podstawy pracy z aplikacją Układ strony... 2.

Generator CABRILLO program Marka SP7DQR (Instrukcja obsługi)

Formularz oceny okresowej arkusz B w służbie cywilnej Instrukcja użytkownika

Raytracer. Seminaria. Hotline. początkujący zaawansowani na miejscu

Formatowanie tekstu za pomocą zdefiniowanych stylów. Włączanie okna stylów. 1. zaznaczyć tekst, który chcemy formatować

Edytor tekstu MS Word podstawy

Stosowanie, tworzenie i modyfikowanie stylów.

Jak zrobić klasyczny button na stronę www? (tutorial) w programie GIMP

Pascal - grafika. Uruchomienie trybu graficznego. Moduł graph. Domyślny tryb graficzny

INSTRUKCJA OBSŁUGI KREATORA SKŁADANIA WNIOSKÓW

Unity 3D - pierwsze skrypty

Kierunek: ETI Przedmiot: Programowanie w środowisku RAD - Delphi Rok III Semestr 5. Ćwiczenie 5 Aplikacja wielo-okienkowa

Sekretariat Optivum. Jak przygotować listę uczniów zawierającą tylko wybrane dane, np. adresy ucznia i jego opiekunów? Projektowanie listy

Edytor tekstu MS Word 2010 PL: grafika. Edytor tekstu MS Word umożliwia wstawianie do dokumentów grafiki.

Nowy szablon stron pracowników ZUT

Jak przygotować pokaz album w Logomocji

Edytor tekstu OpenOffice Writer Podstawy

Instrukcja szybkiej obsługi

Bazy danych raporty. 1. Przekopiuj na dysk F:\ bazę M5BIB.mdb z dysku wskazanego przez prowadzącego.

Obsługa programu Paint. mgr Katarzyna Paliwoda

Arkusz kalkulacyjny EXCEL

Edytor tekstu MS Word 2010 PL. Edytor tekstu MS Word 2010 PL umożliwia wykonywanie działań matematycznych.

Dodawanie grafiki i obiektów

Grażyna Koba. Grafika komputerowa. materiały dodatkowe do podręcznika. Informatyka dla gimnazjum

Rozdział VI. Tabele i ich możliwości

Konfiguracja szablonu i wystawienie pierwszej aukcji allegro

Dokąd on zmierza? Przemieszczenie i prędkość jako wektory

Edytor tekstu MS Word 2010 PL. Edytor tekstu MS Word 2010 PL umożliwia wstawianie i formatowanie tabel.

Wstęp Sterowanie Utworzenie, wybór i kasowanie gracza. utworzenia nowego gracza Nowy gracz Nastawienie gracza

UONET+ - moduł Sekretariat. Jak wykorzystać wydruki list w formacie XLS do analizy danych uczniów?

Transkrypt:

LIVE Gra w życie Live jest jednym z pierwszych i najbardziej znanych tzw. automatów komórkowych. Został wymyślony w 1970 roku przez brytyjskiego matematyka Johna Conwaya. Co to takiego automat komórkowy? Mnóstwo sąsiadujących z sobą komórek. Każda z nich może być zapalona lub zgaszona zgodnie z wymyślonymi prostymi regułami. Na czym polega gra symulacja? Ustalamy układ początkowy komórek, puszczamy cały układ w ruch i obserwujemy. Więcej na Wikipedii: https://pl.wikipedia.org/wiki/gra_w_życie LIVE w Pascalu (Delphi, Lazarus) krok po kroku Podobnie jak w JavaScript, w tych wersjach Pascala mamy do czynienia z obiektem canvas, więc cała graficzna oprawa będzie bardzo podobna. Jedyna większa różnica, to sposób animacji w Pascalu operujemy tzw. timerami. Tworzenie projektu - wybierz z menu Plik Nowy Aplikacja - zapisz projekt Plik Zapisz wszystko (najlepiej w nowym folderze i z domyślnymi nazwami plików) Parametry początkowe formatki - w oknie Properties, wybierz Zdarzenia dla komponentu Form1 - kliknij podwójnie w zdarzenie OnCreate utworzona zostanie procedura FormCreate - wpisz do niej polecenia z ramki - uruchom program poleceniem F9 procedure TForm1.FormCreate(Sender: TObject); caption:='live'; height:=620; width:=800; color:=clgray; Jeśli wszystko poprawnie wpisane, to pojawi się szare okno o wymiarach 620x800 pikseli. UWAGA zawsze zakończ działanie programu przed kolejnym uruchomieniem UWAGA własności każdego komponentu można również wpisywać bezpośrednio w oknie Properties, w zakładce Zdarzenia. KWADRAT Procedura OnCreate pojawiła się automatycznie po podwójnym kliknięciu w zdarzeniach. Procedurę rysującą kwadraty musimy przygotować samodzielnie. - wklej do programu procedurę z ramki parametry kwadratu: lewy, górny róg (x,y) oraz bok i kolor ramki. Aby program działał poprawnie, nagłówek procedury powinien dodatkowo znaleźć się w miejscu, gdzie gromadzone są wszystkie metody obiektu Form1 pod nagłówkiem procedury FormCreate - wklej do programu procedurę KWA z ramki procedure Tform1.KWA(x,y,bok,kolor:integer); canvas.pen.color:=kolor; canvas.moveto(x,y); canvas.lineto(x+bok,y); canvas.lineto(x+bok,y+bok); canvas.lineto(x,y+bok); canvas.lineto(x,y); TForm1 = class(tform) procedure FormCreate(Sender: TObject); procedure KWA(x,y,bok,kolor:integer); Sprawdzamy rysowanie kwadratów Aby sprawdzić działanie procedury KWA utworzymy przycisk i wywołamy w nim rysowanie przykładowego kwadratu - kliknij w formatkę - wybierz z zakładki Standard przycisk TButton - kliknij w dowolne miejsce formatki pojawi się przycisk - kliknij podwójnie w przycisk utworzy się procedura Button1Click - wpisz do niej polecenie z ramki - uruchom program F9 i kliknij w przycisk powinien pojawić się czarny kwadrat KWA(10,10,100,clBlack);

Parametry przycisku Ustawimy przycisk w odpowiednim miejscu definiując jego własności w procedurze OnCreate (albo zapisując bezpośrednio w własnościach przycisku) - wpisz do procedury OnCreate polecenia z ramki Po uruchomieniu programu przycisk zawsze pojawi się w wyznaczonym miejscu UWAGA zamiast pisać kilka razy nazwę przycisku (Button1) można zastosować konstrukcję WITH DO SZACHOWNICA Szachownica zbudowana jest z kwadratów taka sama ilość w pionie i w poziomie. Do narysowania szachownicy posłużymy się dwoma pętlami. Button1.Height:=50; Button1.Left:=620; Button1.Width:=170; Button1.Top:=10; Button1.Caption:='START'; with Button1 do Height:=50; Left:=620; Width:=170; Top:=10; Caption:='START'; - wpisz procedurę SZACHY z ramki - nagłówek procedury umieść w deklaracji procedur formatki - w przycisku START umieść rysowanie przykładowej szachownicy SZACHY(10,10,20,clBlack,30); procedure TForm1.SZACHY(x,y,bok,kolor,ile:integer); i,j:integer; x1,y1:integer; for i:=1 to ile do for j:=1 to ile do x1:=x+(i-1)*bok; y1:=y+(j-1)*bok; KWA(x1,y1,bok,kolor); SUWAK rysujemy szachownice Za pomocą suwaka będziemy ustawiać ilość kratek szachownicy. Bok kratki obliczymy dzieląc maksymalny rozmiar szachownicy (600 pikseli) przez ilość kratek). Na suwaku będziemy mogli zmieniać ilość kratek w zakresie 1 do 100. - umieść komponent TScrollBar na formatce - w procedurze OnCreate wpisz parametry suwaka ScrollBar1 Jak zmieniać wymiary szachownicy? Za każdym razem gdy zmieniamy coś na suwaku generowane jest zdarzenie OnChange suwaka i właśnie w tej procedurze opiszemy rysowanie dowolnej szachownicy. - kliknij podwójnie w suwak pojawi się nowa procedura ScrollBar1Change - wpisz do niej polecenia z ramki do zmiennej ile pobierana jest zawartość suwaka with ScrollBar1 do Height:=50; Left:=620; Width:=170; Top:=70; Max:=100; Min:=1; procedure TForm1.ScrollBar1Change(Sender: TObject); bok,ile:integer; Repaint; SZACHY(10,10,bok,clBlack,ile); bok kwadratu musi być liczbą całkowitą (ilość pikseli) dlatego zaokrąglamy funkcją round procedura Repaint odświeża ekran przed narysowaniem kolejnej szachownicy

KLIKANIE Początkowy układ robaczków ustalamy klikając myszką w pola szachownicy. Formatka dysponuje oczywiście odpowiednim zdarzeniem związanym z klikaniem OnMouseDown - kliknij w dowolne miejsce na formatce (lub wybierz Form1:TForm1 na liście komponentów) - w oknie Properties wybierz zakładkę Zdarzenia - kliknij podwójnie w zdarzenie OnMuseDown - pojawi się szkielet nowej procedury FormMouseDown - wpisz w procedurze polecenie z ramki ShowMessage('X:'+IntToStr(X)+' '+'Y:'+IntToStr(Y)); Procedura FormMouseDown oferuje nam współrzędne kliknięcia w pikselach. Nam potrzebne są numery wiersza i kolumny kratek szachownicy. Jak to obliczyć? Współrzędną kliknięcia dzielimy całkowicie przez bok kwadratu. Uwzględniamy jeszcze przesunięcie początku szachownicy (o 10 pikseli) i powiększamy wszystko o jeden i już! - wpisz polecenia z ramki do procedury FormMouseDown Zauważ, że znów musieliśmy pobierać zawartość suwaka i obliczać bok. Procedura ShowMessage tym razem pokazuje numer kratki na szachownicy. ile,bok,wie,kol:integer; kol:=(x - 10) div bok +1; wie:=(y - 10) div bok +1; ShowMessage('K:'+IntToStr(kol)+' '+'W:'+IntToStr(wie)); WYPEŁNIANIE Kratka została kliknięta powinna wypełnić się białym kolorem. Ponowne kliknięcie maluje wnętrze kolorem szarym. Znamy współrzędne klikniętej kratki na szachownicy, ale nie znamy współrzędnych lewego górnego rogu kwadratu, który mamy wypełnić. Na podstawie numeru wiersza i kolumny (obliczonej przed chwilą) wyliczymy współrzędne początku kratki do wypełnienia. x1,y1:integer; x1:=(kol-1)*bok+10; y1:=(wie-1)*bok+10; - dopisz do procedury FormMouseDown instrukcje z ramki deklaracje zmiennych przed słowem, procedure TForm1.KWA(x,y,bok,kolor,wnetrze:integer); obliczanie współrzędnych x1 i y1 za instrukcjami wyliczającymi numer wiersza i canvas.brush.color :=wnetrze; kolumny. canvas.fillrect(x,y,x+bok,y+bok); Aby narysować wypełniony kwadrat canvas.pen.color:=kolor; zmodyfikujemy napisaną wcześniej canvas.moveto(x,y); procedurę KWA, Pojawił się jeszcze jeden canvas.lineto(x+bok,y); canvas.lineto(x+bok,y+bok); parametr wnetrze i dwie nowe instrukcje canvas.lineto(x,y+bok); na początku. canvas.lineto(x,y); - zmień procedurę KWA - zmień nagłówek procedury KWA w opisie klasy Form1 procedure KWA(x,y,bok,kolor,wnetrze:integer); - zmień procedurę SZACHY - zmień procedurę Button1Click - dopisz do procedury FormMouseDown KWA(x1,y1,bok,kolor,clGray); KWA(10,10,600,clBlack,clGray); KWA(10,10,600,clBlack,clWhite);

TABLICE Klikanie w szachownicę będzie zapalało kratki szachownicy na biały kolor. Co zrobić, żeby ponowne kliknięcie gasiło obszar na kolor szarego tła? Można sprawdzać kolor klikniętego piksela: jeśli był szary to zapal go na biały, w przeciwnym razie zapal go na szary kolor. Można i tak, ale po pierwsze jest to nieefektywne, a po drugie aby zagrać w Live musimy pamiętać (program musi pamiętać), które piksele są zapalone, a które zgaszone, aby obliczać gdzie zapalą się lub zgaszą robaczki w kolejnych pokoleniach. W tym celu wykorzystamy tablice możesz sobie wyobrazić, że komputer będzie miał do dyspozycji szufladę z mnóstwem przegródek w formie szachownicy właśnie. Do każdej przegródki można wsadzić jakieś informacje. Łatwo je zapisać i łatwo je odczytać za pomocą indeksowania numerowania, jak w grze w statki. Na początku założyliśmy, że tablica będzie miała maksymalny wymiar 100x100, więc i taka tablica będzie nam potrzebna. Uprzedzając nieco zadeklarujemy ją nieco większą, aby łatwiej było analizować brzegi. - zadeklaruj tablicę ROBACZKI w głównej części programu poniżej instrukcji Form1:TForm1; ROBACZKI:array[0..101,0..101] of byte; w każdej komórce tablicy będziemy wpisywać 0 brak robaczka lub 1 jest robaczek tablica powinna być wyzerowana na początku działania programu procedure ROBACZKI_ZERUJ; w,k:byte; - wpisz procedurę ROBACZKI_ZERUJ for w:=0 to 101 do - umieść wywołanie procedury ROBACZKI_ZERUJ(); na końcu for k:=0 to 101 do procedury FormCreate ROBACZKI[k,w]:=0; ponieważ ta procedura nie ma nic wspólnego z rysowaniem i obiektami komponenty Form1, dlatego też jej nagłówka nie musimy umieszczać w opisie klasy ZAPALANIE-GASZENIE Gdy klikamy w szachownicę pole zapala się na biało i dodatkowo do odpowiedniego pola tablicy zapisujemy jedynkę. Gdy gasimy (na szaro) kratkę do tablicy zapisujemy zero. Odwróćmy jednak tok rozumowania. Klikamy w szachownicę, zaglądamy do tablicy i jeśli w polu jest zero, to rysujemy białą kratkę i zapisujemy jedynkę. W przeciwnym razie postępujemy odwrotnie rysujemy szare pole i do tablicy zapisujemy zero. Cała instrukcja warunkowa będzie umieszczona w procedurze FormMouseDown - w procedurze FormMouseDown usuń instrukcję rysującą biały kwadrat - wpisz polecenia z ramki Teraz możemy ustawić początkowe położenie robaczków. Robaczki są rysowane lub wymazywane i dodatkowo wpisywane są jedynki i zera do tablicy ROBACZKI. PRZERYSOWANIE SZACHOWNICY Gra w życie polega na ciągłym odradzaniu się i umieraniu robaczków. Program będzie musiał przerysowywać całą szachownicę zgodnie z tym co jest w tablicy ROBACZKI procedura RYSUJ_ROBACZKI. - wpisz procedurę RYSUJ_ROBACZKI - umieść nagłówek procedury w opisie klasy Form1 - w procedurze ScrollBar1Change wpisz instrukcję i usuń instrukcję SZACHY( ) if ROBACZKI[kol,wie]=0 then ROBACZKI[kol,wie]:=1; KWA(x1,y1,bok,clBlack,clWhite); end else ROBACZKI[kol,wie]:=0; KWA(x1,y1,bok,clBlack,clGray); procedure TForm1. k,w:integer; ile,bok:integer; x1,y1:integer; for k:=1 to ile do for w:=1 to ile do x1:=(k-1)*bok+10; y1:=(w-1)*bok+10; if ROBACZKI[k,w]=1 then KWA(x1,y1,bok,clBlack,clWhite) else KWA(x1,y1,bok,clBlack,clGray);

Po uruchomieniu programu i ustawieniu początkowego stany robaczków będą zapamiętywane i odtwarzane gdy zmienimy suwakiem wielkość szachownicy. STAN POCZĄTKOWY Po uruchomieniu programu ustawiamy suwak na 10 i rysujemy takąż pustą szachownicę - do FormCreate wstaw instrukcję dla ScrollBar1 ScrollBar1.Position:=10; Okazuje się, że wstawienie instrukcji RYSUJ_ROBACZKI do FormCreate nie da oczekiwanego rezultatu FormCreate wykonuje się jeszcze przed utworzeniem formatki z obszarem canvas. Procedurę rysowania musimy umieścić w podobnej procedurze FormActivate. -kliknij podwójnie w zdarzenie OnActivate formatki - wpisz instrukcje z ramki Po uruchomieniu programu mamy szachownicę o 10 kolumnach i wierszach repaint; POKOLENIA Potrafimy zmieniać szachownicę, ustawiać początkowe położenie robaczków i je zapamiętywać w tablicy. Aby puścić w ruch naszą grę należy wykonać jeszcze dwie czynności: - wyliczyć ile robaczków znajduje się wokół każdego pola - usunąć lub wstawić robaczki na podstawie ilości sąsiadów Ilość sąsiadów zapiszemy (jak należy się domyślać) w kolejnej tablicy - SASIEDZI. Każde pole ma 8 sąsiadujących pól, więc w tablicy będą znajdować się liczby od 0 do 8. - zadeklaruj tablicę SASIEDZI (pod deklaracją tablicy ROBACZKI) - zmodyfikuj procedurę ZERUJ_ROBACZKI zwróć uwagę na konieczność zastosowania instrukcji bloku (Begin end) Jak policzyć ilość zajętych pól wokół wybranego pola? należy rozejrzeć się wokół, w ośmiu kierunkach. W tym celu napiszemy osobną funkcję, która policzy ile jest robaczków wokół pola - wpisz definicję funkcji WYLICZ_ROBACZKI do funkcji wrzucamy numer kolumny i wiersza a otrzymujemy (ostatnia instrukcja funkcji) ilość zajętych pól wokół kratki (k,w) Potrafimy policzyć ilość robaczków wokół jednego pola. Kolejna procedura policzy ilość robaczków wokół wszystkich pól wyniki zapisujemy w nowej tablicy SASIEDZI -wpisz w dowolnym miejscy procedurę POLICZ_ROBACZKI SASIEDZI:array[0..101,0..101] of byte; procedure ROBACZKI_ZERUJ(); w,k:byte; for w:=0 to 101 do for k:=0 to 101 do ROBACZKI[k,w]:=0; SASIEDZI[k,w]:=0; function WYLICZ_ROBACZKI(k,w:byte):byte; suma:byte; suma:=0; suma:=suma+robaczki[k-1,w-1]; suma:=suma+robaczki[k-1,w-0]; suma:=suma+robaczki[k-1,w+1]; suma:=suma+robaczki[k-0,w-1]; suma:=suma+robaczki[k-0,w+1]; suma:=suma+robaczki[k+1,w-1]; suma:=suma+robaczki[k+1,w-0]; suma:=suma+robaczki[k+1,w+1]; WYLICZ_ROBACZKI:=suma; procedure POLICZ_ROBACZKI(); w,k:byte; for w:=0 to 101 do for k:=0 to 101 do SASIEDZI[k,w]:=WYLICZ_ROBACZKI(k,w);

REGUŁY LIVE Pozostała ostatnia (prawie) procedura na podstawie ustawienia robaczków w tablicy ROBACZKI oraz ilości robaczków wokół pola obliczonej w tablicy SASIEDZI, należy wyliczyć jakie będzie nowe pokolenie robaczków: w których polach narodzą się nowe, a w których polach zginą robaczki. Wynik zapiszemy powrotem w tablicy ROBACZKI. Powtarzając w koło wyliczanie sąsiadów, wyliczanie nowego pokolenia i rysowanie szachownicy będziemy mogli wprawić w ruch naszą symulację. Jakie są reguły życia i śmierci? Narodziny nowy robaczek rodzi się na pustym polu i musi mieć dokładnie trzech sąsiadów Śmierć robaczek umiera gdy ma mniej niż dwóch sąsiadów (samotność) lub gdy ma więcej niż trzech sąsiadów (brak pożywienia) Wystarczy te warunki zapisać w postaci matematycznej. - wpisz procedurę NOWE_POKOLENIE sprawdzimy jak działa nasza gra krok po kroku klikając w przycisk START - wpisz do procedury Button1Click nowe instrukcje POLICZ_ROBACZKI(); NOWE_POKOLENIE(); Narysuj układ początkowy i klikaj w przycisk START, a będziesz mógł śledzić, jak zmieniają się kolejne pokolenia robaczków. procedure NOWE_POKOLENIE(); k,w,sum,rob:byte; for w:=1 to 100 do for k:=1 to 100 do rob:=robaczki[k,w]; sum:=sasiedzi[k,w]; if (rob=0) and ( (sum=3) or (sum=3)) then ROBACZKI[k,w]:=1; if (rob=1) and ((sum<2) or (sum>=4)) then ROBACZKI[k,w]:=0; ANIMACJA I to już ostatni element programu chcemy aby proces odradzania i umierania odbywał się automatycznie. W opisywanych odmianach Pascala (Delphi i Lazarus) mamy możliwość zastosowania komponentu Timer, który cyklicznie potrafi wywoływać określone instrukcje. - wstaw na formatkę komponent TTimer z zakładki System w dowolnym miejscu jest niewidoczny po uruchomieniu programu - kliknij podwójnie w komponent TTimer na formatce pojawi się szkielet procedury Timer1Timer - wpisz do procedury trzy instrukcje POLICZ_ROBACZKI(); NOWE_POKOLENIE(); Aby uruchomić lub zatrzymać animację wykorzystamy przycisk START - usuń z procedury Button1Click trzy instrukcje ręcznej Timer1.Enabled:=not(Timer1.Enabled); animacji if Timer1.Enabled - wstaw do procedury Button1Click instrukcje z ramki then Button1.Caption:='STOP' - wpisz do procedury FormCreate początkowe ustawienie else Button1.Caption:='START ; Timera wyłączony oraz szybkość animacji (milisekundy W dowolnym momencie możesz uruchomić i zatrzymać animację. Jeśli przebiega zbyt szybko możesz zmienić parametr Interval (1000 milisekund to 1 sekunda) Timer1.Enabled:=false; Timer1.Interval:=1; O różnych interesujących aspektach LIVE dowiesz się na przykład z Wikipedii. Interesujące są układy cykliczne, nieśmiertelne, samoloty, pulsujące i wiele innych. Jeśli chcesz poeksperymentować, spróbuj zmienić zasady narodzin i umierania robaczków w procedurze NOWE_POKOLENIE

CAŁY PROGRAM unit Unit1; {$mode objfpc}{$h+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls; type { TForm1 } TForm1 = class(tform) Button1: TButton; ScrollBar1: TScrollBar; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure FormActivate(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure KWA(x,y,bok,kolor,wnetrze:integer); procedure ScrollBar1Change(Sender: TObject); procedure SZACHY(x,y,bok,kolor,ile:integer); procedure procedure Timer1Timer(Sender: TObject); private public Form1: TForm1; ROBACZKI:array[0..101,0..101] of byte; SASIEDZI:array[0..101,0..101] of byte; implementation {$R *.lfm} { TForm1 } procedure ROBACZKI_ZERUJ(); w,k:byte; for w:=0 to 101 do for k:=0 to 101 do ROBACZKI[k,w]:=0; SASIEDZI[k,w]:=0; function WYLICZ_ROBACZKI(k,w:byte):byte; suma:byte; suma:=0; //gorny wiersz suma:=suma+robaczki[k-1,w-1]; suma:=suma+robaczki[k-1,w-0];

suma:=suma+robaczki[k-1,w+1]; //srodkowy wiersz suma:=suma+robaczki[k-0,w-1]; //samego siebie nie wliczamy do sumy suma:=suma+robaczki[k-0,w+1]; //dolny wiersz suma:=suma+robaczki[k+1,w-1]; suma:=suma+robaczki[k+1,w-0]; suma:=suma+robaczki[k+1,w+1]; WYLICZ_ROBACZKI:=suma; procedure POLICZ_ROBACZKI(); k,w:byte; for w:=1 to 100 do for k:=1 to 100 do SASIEDZI[k,w]:=WYLICZ_ROBACZKI(k,w); procedure NOWE_POKOLENIE(); k,w,sum,rob:byte; for w:=1 to 100 do for k:=1 to 100 do rob:=robaczki[k,w];//pole wolne czy zajete sum:=sasiedzi[k,w];//ile robaczkow wokolo if (rob=0) and ( (sum=3) or (sum=3)) then ROBACZKI[k,w]:=1;//rodzi sie nowy robaczek if (rob=1) and ((sum<2) or (sum>=4)) then ROBACZKI[k,w]:=0;//umiera procedure TForm1.FormCreate(Sender: TObject); caption:='live'; height:=620; width:=800; color:=clgray; with Button1 do Height:=50; Left:=620; Width:=170; Top:=10; Caption:='START'; ROBACZKI_ZERUJ(); ScrollBar1.Position:=10; Timer1.Enabled:=false; Timer1.Interval:=1; procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); ile,bok,wie,kol:integer; x1,y1:integer; kol:=(x - 10) div bok +1;

wie:=(y - 10) div bok +1; x1:=(kol-1)*bok+10; y1:=(wie-1)*bok+10; if ROBACZKI[kol,wie]=0 then ROBACZKI[kol,wie]:=1; KWA(x1,y1,bok,clBlack,clWhite); end else ROBACZKI[kol,wie]:=0; KWA(x1,y1,bok,clBlack,clGray); //KWA(x1,y1,bok,clBlack,clWhite); //ShowMessage('X:'+IntToStr(X)+' '+'Y:'+IntToStr(Y)); //ShowMessage('K:'+IntToStr(kol)+' '+'W:'+IntToStr(wie)); procedure TForm1.Button1Click(Sender: TObject); //KWA(10,10,600,clBlack,clGray); //SZACHY(10,10,20,clBlack,30); //POLICZ_ROBACZKI(); //NOWE_POKOLENIE(); // Timer1.Enabled:=not(Timer1.Enabled); if Timer1.Enabled then Button1.Caption:='STOP' else Button1.Caption:='START'; procedure TForm1.FormActivate(Sender: TObject); repaint; procedure TForm1.KWA(x,y,bok,kolor,wnetrze:integer); canvas.brush.color :=wnetrze; canvas.fillrect(x,y,x+bok,y+bok); canvas.pen.color:=kolor; canvas.moveto(x,y); canvas.lineto(x+bok,y); canvas.lineto(x+bok,y+bok); canvas.lineto(x,y+bok); canvas.lineto(x,y); procedure TForm1.ScrollBar1Change(Sender: TObject); bok,ile:integer; repaint; //canvas.clear; //SZACHY(10,10,bok,clBlack,ile); procedure TForm1.SZACHY(x,y,bok,kolor,ile:integer); i,j:integer; x1,y1:integer;

for i:=1 to ile do for j:=1 to ile do x1:=x+(i-1)*bok; y1:=y+(j-1)*bok; KWA(x1,y1,bok,kolor,clGray); procedure TForm1. k,w:integer; ile,bok:integer; x1,y1:integer; for k:=1 to ile do for w:=1 to ile do x1:=(k-1)*bok+10; y1:=(w-1)*bok+10; if ROBACZKI[k,w]=1 then KWA(x1,y1,bok,clBlack,clWhite) else KWA(x1,y1,bok,clBlack,clGray); procedure TForm1.Timer1Timer(Sender: TObject); POLICZ_ROBACZKI(); NOWE_POKOLENIE(); end.