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”.
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:
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.
Ciekawe artykuły:
Brak komentarzy:
Prześlij komentarz