środa, 9 października 2019

Zabawa "Zgadnij słowo" w Delphi część 1

Proponujemy jedną z najciekawszych zabaw, jakie przygotowaliśmy w poradach programowania w języku Delphi. Będzie ona oparta na klasycznej zabawie dziecięcej typu: Zgadnij słowo, o którym pomyślałem. Słowo ma pięć liter. Zaczyna się na literę „A”, a kończy na literę „S”.

programy w delphi

Założenia i opis programu:




Po naciśnięciu przycisku START program losuje słowo do odgadnięcia, podając nam tylko, z ilu liter się składa oraz, jaka jest jego pierwsza i ostatnia litera.


W pole edycyjne wpisujemy słowo, które – jak przypuszczamy – jest tym słowem szukanym i naciskamy przycisk „Sprawdź”. Procedura sprawdzająca ocenia odpowiedź i wyświetla komunikat informujący nas o poprawności lub niepoprawności odpowiedzi oraz zlicza ilość odpowiedzi poprawnych i niepoprawnych.


Aby zabawę uczynić nieco łatwiejszą, wprowadzamy zasadę, że po udzieleniu niepoprawnej odpowiedzi, program powtórzy swoje podpowiedzi, tym razem jednak podając także informację o tym, jaka jest druga litera.


Słowo możemy odgadywać w dowolnej ilości prób, jednak po nieodgadnięciu słowa, program za każdym razem zwiększy w tabeli wyników ilość niepoprawnych odpowiedzi.


Kiedy stracimy już zaufanie do programu, że wybrał dla nas rzeczywiste słowo, będziemy mogli nacisnąć przycisk „Pokaż słowo”, aby program wyświetlił je nam.





Potrzebne komponenty:




Button1 – przycisk „Start”,

Button2 – przycisk „Sprawdź”,

Button3 – przycisk „Pokaż słowo”,

Edit1 – pole edycyjne do podawania odpowiedzi,

Label1 – etykieta wyświetlająca napis „Podaj słowo”,

Label2 – etykieta wyświetlająca napis „Wyniki”,

Label3 – etykieta wyświetlająca napis „Poprawne”,

Label4 – etykieta wyświetlająca napis „Niepoprawne”,

Label5 – etykieta wyświetlająca ilość poprawnych odpowiedzi

Label6 – etykieta wyświetlająca ilość niepoprawnych odpowiedzi



Przy pomocy Inspektora Obiektów zmieniamy nazwy komponentom, modyfikując właściwość Caption:



Komponent    Nazwa



Button1  START

Button2  Sprawdź

Button3  Pokaż słowo

Edit1    (kasujemy nazwę)

Label1   Podaj słowo

Label2   Wyniki

Label3   Poprawne

Label4  Niepoprawne

Label5   0

Label6   0





Oto wstępny wygląd programu:

nauka delphi
Okno programu "Zgadnij słowo"

Komentarz:




1. Zmienne globalne




W zmiennych globalnych musimy umieścić nie tylko zmienną przechowującą słowo do odgadnięcia (SLOWO), ale także jego parametry, czyli pierwszą, drugą i ostatnią literę (Litera1, Litera2, Litera3) oraz ilość liter. Jest to konieczne do zrealizowania naszego założenia, aby program – po udzieleniu niepoprawnej odpowiedzi – powtórzył swoją podpowiedź, tym razem dodając jeszcze informację, jaka jest druga litera. W normalnych warunkach, gdyby procedura „Sprawdź” nie korzystała z tych danych, moglibyśmy zmienne przechowujące powyższe parametry, umieścić w procedurze START jako zmienne lokalne, pozostawiając jako zmienną globalną tylko zmienną SLOWO, z której tradycyjnie procedura „Sprawdź” będzie korzystać do oceny naszej odpowiedzi.





2. Form Create i Form Close




Zerowanie zmiennych Poprawne i Niepoprawne, które odbywa się w procedurze Form Create (a więc w chwili uruchomienia programu), jest konieczne, aby program wiedział, jaki jest stan początkowy tychże zmiennych. Bez tej informacji obie zmienne mogą działać niewłaściwie. W naszym przypadku zerowanie umieszczamy w procedurze startowej z uwagi na to, że zarówno procedura START, jak i procedura sprawdzająca będą przez nas wielokrotnie wywoływane, stąd też umieszczenie zerowania w ich obrębie będzie bez sensu, ponieważ za każdym razem zmienne te będą zerowane, a nie o to nam przecież chodzi, chodzi nam o to, aby program pamiętał nasze dotychczasowe wyniki.


W bardziej typowych przypadkach, gdy nie ma potrzeby zapamiętywania dotychczasowych wyników, wartość początkową zmiennej deklarujemy w konkretnej procedurze tak, jak w tym przypadku:



Zmienna:= 0;

Zmienna:= Zmienna + Random(10);



Do zmiennej o nazwie Zmienna chcemy dodać liczbę, która zostanie przez program wylosowana z zakresu 0...9. Aby zachować logikę procedury, musimy przed nią podać wartość początkową tej zmiennej, aby program wiedział, do jakiej liczby ma dodać tę wylosowaną. Oczywiście, wartość początkowa zmiennej nie musi wynosić zero, równie dobrze może zawierać inną wartość, w zależności od potrzeby.

 
Procedura Form Close zawiera nasz stały element znany z innych zabaw, więc powstrzymamy się od komentarza.



3. Gdy naciśniesz przycisk START




Z uwagi na to, że komputer, nawet ten najbardziej nowoczesny, nie zna ludzkiej mowy bez jej wcześniejszej implementacji, musimy w naszym projekcie zawrzeć wszystkie słowa, z których będzie korzystał. To samo robimy w przypadku oprogramowywania logiki robota i androida: Znają one tylko te słowa, które im zamieściliśmy w bazie danych. Nie jest to zresztą do końca prawda, gdyż bez problemu możemy stworzyć algorytmy, które będą same wyłapywać z rozmowy nowe słowa czy stwierdzenia i zapisywać je w bazie danych. Nie jest to jednak temat tego rozdziału, więc na tym poprzestaniemy. Odsyłamy do rozdziałów pt. „Powiedz coś” i „Jak się masz”, gdzie przedstawiliśmy przykłady najprostszych algorytmów wypowiedzi programu.

 
Do utworzenia bazy słów, które program będzie używał, wykorzystamy znany nam już element, czyli tablicę stałych. Jest to bowiem najprostszy sposób na magazynowanie danych. Jako że są to słowa, więc ustalamy ich typ jako string. W naszej bazie danych zgromadziliśmy ponad 700 słów, aby zapewnić w zabawie odpowiedni komfort użytkowania. Gdyby ilość słów była niewielka, bardzo szybko zaczęłyby się one powtarzać, a my zapamiętalibyśmy poszczególne słowa. Dla każdej początkowej litery i odpowiedniej ilości znaków musi być co najmniej kilka różnych słów, inaczej po kilku razach wiedzielibyśmy już, o jakie słowo chodzi. Im więcej słów do odgadnięcia przygotujemy, tym lepsza później będzie zabawa.

 
Zachęcamy wszystkich do rozszerzenia naszej bazy danych o nowe słowa. Można także część słów usunąć, jeżeli uważamy, że są za trudne. W każdym z tych przypadków należy zwracać uwagę na to, aby każde słowo ujęte było w cudzysłów i oddzielone od kolejnego słowa przecinkiem. Nie musimy martwić się tym, że trzeba będzie potem męczyć się z ręcznym podliczaniem tylu słów. Jest na to proste rozwiązanie. Wystarczy tylko uruchomić proces kompilacji, a kompilator sam podliczy je, wskazując w komunikacie błędu, że nie może skompilować kodu, gdyż wykrył niepoprawną deklarację rozmiaru tablicy: W deklaracji ilości elementów jest podane na przykład 735 elementów, a tymczasem znalazł ich, powiedzmy 928. W ten sposób dowiemy się, ile aktualnie jest słów w tablicy i możemy skorygować zapis:  

Tablica: array [1..735] of String.

 
Jak widzimy, nasza baza danych zajmuje bardzo dużo miejsca, a liczba linii kodu nie zamyka się już na poziomie kilkuset, jak było to do tej pory. To pierwszy przykład w naszych projektach tak pojemnego kodu. W drugiej części książki poznamy jeszcze bardziej obszerne i zagmatwane rozwiązania, dzięki czemu zdamy sobie sprawę, że czasami prosta czynność programu wymaga od programisty zastosowania długich procedur i musi wykazać się dużą przenikliwością, aby przygotować program na każdą ewentualność. Robiliśmy to już zresztą nie raz, zabezpieczając program przed chociażby naciśnięciem przycisku „Sprawdź” bez podania uprzednio odpowiedzi. Wszystkie takie niebezpieczne dla działania programu sytuacje musimy z góry przewidzieć i zaopatrzyć program w odpowiednie zabezpieczenie, inaczej program będzie źle pracował lub będzie się zawieszał.

 
Po deklaracji tablicy słów deklarujemy zmienną Numer_slowa. Będzie ona matematycznym odpowiednikiem słowa. Dzięki niej komputer, jako maszyna matematyczna, będzie mógł używać je w swobodny sposób.



Edit1.Clear; //wyczyść pole edycyjne (Do podawania Odpowiedzi)

Randomize; //uruchom maszynę losującą

Numer_slowa:= Random(735)+1; //wylosuj numer słowa z tablicy słów

SLOWO:= Tablica[Numer_slowa]; //przypisz słowo do zmiennej



Tradycyjnie w naszych zabawach, najpierw czyścimy pole edycyjne, aby można było wpisać odpowiedź. W drugiej kolejności uruchamiamy maszynę losującą, która wybierze dla nas numer słowa z tablicy i umieści go w zmiennej pomocniczej Numer_slowa. Pamiętajmy o tym, że musimy podać pełny zakres, z jakiego program ma losować, więc musi on odpowiadać ilości elementów tablicy.

 
Z uwagi na to, że Delphi liczy liczby od zera, stosujemy konstrukcję Random(735)+1, aby wyeliminować wylosowanie zera: Gdy wylosuje zero, będzie musiał dodać do niego liczbę 1 i taki też będzie końcowy wynik. W ten sposób maszyna losuje elementy z przedziału 1-735, czyli dokładnie z takiego, jak nasza tablica słów. Gdyby wylosowała zero i odniosła się do tablicy, szukając odpowiedniego słowa, nastąpiłby konflikt logiczny, bo takiej wartości nie ma zadeklarowanej w tablicy, jest tylko słowo pierwsze, drugie, trzecie i tak dalej..., zaistniałby więc błąd programu.

 
Mając wylosowany numer słowa, możemy go teraz powiązać ze zmienną globalną SLOWO, która będzie przechowywać wylosowane przez program słowo.



Ilosc_liter:= (Length(SLOWO)); //policz ilość liter w słowie

Litera1:= SLOWO[1]; //pierwsza litera słowa

Litera2:= SLOWO[2]; //druga litera słowa

Litera3:= SLOWO[length(SLOWO)]; //ostatnia litera słowa



Znając już wylosowane słowo, analizujemy je, przygotowując i zapisując potrzebne informacje do zmiennych globalnych. Najpierw podliczamy, z ilu liter składa się słowo, a następnie zapisujemy do zmiennych pierwszą, drugą i ostatnią jego literę. Jak widzimy, konstrukcja jest prosta: w nawiasie kwadratowym wskazujemy, o którą literę nam chodzi. Słowo length używamy na określenie ostatniego elementu danego ciągu. W pierwszym przypadku wskazuje zmiennej Ilosc_liter, że ma policzyć ilość znaków od umownego pierwszego do ostatniego, a w drugim przypadku podaje wartość ostatniego znaku. Tak też możemy te słowo rozumieć, jako ostatni znak w ciągu lub zbiorze.

 
Mając już zebrane potrzebne informacje, możemy przystąpić do zadania pytania:



ShowMessage(('Słowo ma ' + IntToStr(Ilosc_liter) + ' liter. Zaczyna się na literę ' + Litera1 + ' , a kończy na literę ' + Litera3));

Edit1.SetFocus; //ustaw focus w Polu do Odpowiedzi



Pytanie zadajemy najprostszym sposobem, czyli poprzez wyświetlenie komunikatu ShowMessage. Nic nie stoi jednak na przeszkodzie, aby zamienić go na wersję mówioną. Zdobyliśmy już takie umiejętności, przygotowując rozszerzenie zabawy „Policz, ile to jest – wersja audio”.

 
Pytając pierwszy raz o dane słowo, podajemy tylko pierwszą i ostatnią literę oraz, z ilu liter się ono składa. W procedurze „Sprawdź”, gdy odpowiedź będzie błędna, podamy jako ułatwienie także drugą literę. Po zadaniu pytania standardowo dla naszych rozwiązań umieszczamy kursor w polu na odpowiedzi, aby nie trzeba było klikać na niego, chcąc wpisać słowo.


Artykuł pochodzi z mojej książki pt. "Delphi w przykładach dla początkujących". Zapraszam na Stronę książki.

poradnik programowania Delphi





Ciekawe artykuły:

    
    Zapoznaj się z innymi artykułami. Przejdź do zakładki Spis artykułów.

Brak komentarzy:

Prześlij komentarz

Wspomóż mnie lub zostań moim patronem już od 5 zł - sprawdź szczegóły

Moje e-booki

Kliknij w okładkę, aby przejść do strony książki

Przejdź do strony książki Przejdź do strony książki