Komentarz:
1. Zmienne globalne
Zazwyczaj
w programach używamy zmiennych lokalnych, powiązanych tylko z daną
procedurą. W ten sposób unikamy konfliktu logicznego, gdy w tym
samym czasie jedną zmienną chcą wykorzystać dwie lub więcej
procedur.
Czasami
jednak zachodzi potrzeba dostępu do parametru z poziomu różnych
procedur tak, jak w naszym programie: procedura dla przycisku START
generuje wynik działania, który jest umieszczony w zmiennej
globalnej WYNIK, a inna procedura, powiązana z obsługą przycisku
Sprawdź, korzysta z tej zmiennej, aby porównać, czy udzielona
odpowiedź jest poprawna. Gdyby zmienna WYNIK była zmienną lokalną
, zamkniętą w jednej procedurze, nie udałoby się tego dokonać.
Stąd też w naszym projekcie umieszczamy trzy zmienne globalne:
WYNIK-
do przechowywania wyniku działania,
Poprawne-
do przechowywania ilości poprawnych odpowiedzi,
Niepoprawne-
do przechowywania ilości niepoprawnych odpowiedzi.
Umieszczamy
je w sekcji między var a Implementation, po deklaracji zmiennej
Form1: Tform1.
var
Form1: TForm1;
WYNIK:
Integer; //zmienna
przechowująca
wynik działania
Poprawne:
Integer; //zmienna przechowująca ilość
poprawnych odpowiedzi
Niepoprawne:
Integer; //zmienna
przechowująca ilość niepoprawnych
odpowiedzi
implementation
{$R
*.dfm}
Wszystkie
trzy zmienne będą przechowywać liczby, więc muszą być typu
Integer.
2. Form Create
Poprawne:=0;
//wyzeruj ilość poprawnych odpowiedzi
Niepoprawne:=0;
//wyzeruj ilość niepoprawnych odpowiedzi
Label9.Caption:= '0';
//wyświetl '0' poprawnych odpowiedzi
Label10.Caption:= '0';
//wyświetl '0' niepoprawnych odpowiedzi
Procedura Form Create
wykonuje napisany przez nas kod w chwili uruchomienia programu, więc
w miejscu tym wyzerujemy tabelę wyników i wyświetlimy oba wyniki
jako zerowe.
Aby utworzyć procedurę
Form Create klikamy na puste miejsce naszej formy, a następnie w
Inspektorze Obiektów przechodzimy do zakładki Events i obok
zdarzenia OnCreate klikamy dwa razy. Zostaniemy automatycznie
przeniesieni do kodu z nowo utworzoną procedurą.
3. Form Close
if
(Poprawne<Niepoprawne) or (Poprawne=Niepoprawne) then
begin
ShowMessage('Musisz
jeszcze trochę potrenować');
end
else
ShowMessage('Gratuluję!
Uzyskałeś dobry wynik');
Procedura Form Close
realizowana jest w momencie zamykania programu i tworzymy ją tak
samo, jak poprzednią, wybierając jednak zdarzenie OnClose. W sekcji
tej umieściliśmy możliwość oceny naszych wyników w zabawie.
Na początku mamy
instrukcję warunkową if...then (jeżeli..., to...), oraz warunek do
spełnienia. Cały kod możemy przetłumaczyć następująco: Jeżeli
(if) Ilość poprawnych odpowiedzi (Poprawne) jest mniejsza (<) od
Ilości niepoprawnych odpowiedzi (Niepoprawne) lub (or) Ilość
poprawnych (Poprawne) jest taka sama (=) jak Ilość niepoprawnych
odpowiedzi (Niepoprawne) to wtedy (then) Wyświetl komunikat
(ShowMessage) o treści: „Musisz jeszcze trochę potrenować”, w
przeciwnym razie (else) (czyli, gdy ilość poprawnych odpowiedzi
jest większa od niepoprawnych) wyświetl komunikat: „Gratuluję!
Uzyskałeś dobry wynik”.
W tego typu konstrukcji,
gdzie używamy operatora else
pamiętajmy o tym, że przed nim polecenie występuje bez zwyczajowo
wymaganego średnika (w tym przypadku słowo end).
To częsty błąd początkujących programistów.
Kolejne
niedopatrzenia, które często staje się udziałem początkujących
programistów, jest podawanie warunku. W prostym przypadku instrukcji
warunkowej, wystarczy napisać tak:
if
Poprawne<Niepoprawne then
(kod
do wykonania)
Jeżeli jednak chcemy,
aby zostało spełnionych kilka warunków, wtedy każdy z nich musimy
ująć w nawias, na przykład tak:
if
( Poprawne<Niepoprawne) and
(Liczba1=5) then
(kod
do wykonania)
4. Procedura Edit1KeyPress
if
not (Key in ['0'..'9',#45,#8]) then
begin
Key:=#0;
ShowMessage('To nie
jest liczba'); //wyświetl komunikat o
błędzie
end;
Aby utworzyć tę
procedurę klikamy na komponent Edit1 a następnie w Inspektorze
Obiektów, w zakładce Events wybieramy zdarzenie OnKeyPress i
otwieramy je podwójnym kliknięciem.
Jak sama nazwa wskazuje,
procedurę tę wykorzystamy do kontroli wpisywania znaków w polu
edycyjnym. Zgodnie z naszymi założeniami chcemy, aby była
możliwość wpisywania tylko liczb, minusa i, aby aktywny był
klawisz Backpace do kasowania źle wpisanych liczb.
Cały kod odczytamy tak:
Jeżeli (if) naciśnięty klawisz (Key) nie jest (not) klawiszem
liczb ('0'..'9'), minusem (#45- kod klawisza „minus”), ani
Backpace (#8- kod klawisza Backpace), wtedy (then) nie reaguj
(Key:#0) tylko wyświetl komunikat (ShowMessage) „To nie jest
liczba”.
Z punktu widzenia
programu, procedura ta nie jest konieczna. Jest to tylko udogodnienie
dla nas eliminujące pomyłki.
5. Gdy naciśniesz przycisk START
var
Liczba1: Integer;
//zmienna przechowująca pierwszą liczbę
Liczba2: Integer;
//zmienna przechowująca drugą liczbę
Dzialanie: Integer;
//zmienna pomocnicza do losowania znaku
działania
Znak: String;
//zmienna przechowująca znak działania
Na początku procedury
definiujemy zmienne lokalne, które będą nam potrzebne. Przede
wszystkim musimy przygotować dwie zmienne na dwie liczby, które
zostaną użyte w działaniu. Za każdym razem program będzie sobie
jakieś dwie liczby losowo wybierał, musi więc mieć gdzie je
zapisać. Stąd umieszczone zmienne Liczba1 i Liczba2 są typu
Integer,a więc typu liczbowego.
Poza liczbami, program
będzie losował także znak działania (dodawanie, odejmowanie,
mnożenie), który następnie będzie mógł wyświetlić w pytaniu.
To implikuje użycie zmiennej typu String, a więc typu tekstowego.
Zmiennej tej nadaliśmy nazwę „Znak”.
Ostatnia zmienna, czyli
„Dzialanie” (nie możemy nadać nazwy „Działanie”, ponieważ
Delphi nie używa polskich znaków dialektycznych) służy do
wylosowania rodzaju działania (dodawanie, odejmowanie, mnożenie).
Jest ona typu liczbowego, ponieważ za jej pomocą będziemy losowali
liczbę do której przypiszemy jedno z tych trzech działań:
Edit1.Clear;
//wyczyść pole edycyjne (do
podawania Odpowiedzi)
Randomize;
//uruchom maszynę losującą
Liczba1:=Random(21);
//losuj pierwszą liczbę
Liczba2:=Random(21);
//losuj drugą liczbę
Dzialanie:=Random(3);
//losuj znak działania matematycznego
case Dzialanie of
//gdy zostanie wylosowana dana liczba
to...
0: WYNIK:=
Liczba1+Liczba2; //...wykonaj dodawanie
1: WYNIK:=
Liczba1-Liczba2; //...wykonaj odejmowanie
2: WYNIK:=
Liczba1*Liczba2; //...wykonaj mnożenie
Przechodząc do kodu
wykonywalnego, po naciśnięciu przycisku START, następuje
wyczyszczenie pola edycyjnego (Edit1.Clear), a następnie
uruchomienie maszyny losującej (Randomize). Po jej uruchomieniu,
losujemy potrzebne nam elementy, a więc obie liczby z zakresu od 0
do 20 (Liczba:=Random(21)), oraz
rodzaj działania (Dzialanie:=Random(3)). Delphi
liczy liczby od zera, stąd też przy Random(21) mamy
liczbę 21, a nie 20, tak samo, jak w przypadku zmiennej Dzialanie
mamy trzy liczby, ale liczone od zera, a więc: 0, 1, 2.
Dalsza część kodu
informuje program co ma zrobić, gdy zostanie wylosowana odpowiednia
liczba dla zmiennej Dzialanie: Jeżeli zostało wylosowane zero,
wtedy do zmiennej globalnej WYNIK ma zapisać wynik dodawania obu
wcześniej wylosowanych liczb (Liczba1 i Liczba2). Gdy wylosowano 1
lub 2 to, odpowiednio, ma zapisać w zmiennej WYNIK wynik odejmowania
lub mnożenia tychże liczb. W ten oto prosty sposób uzyskujemy dużą
nieprzewidywalność kolejnego działania, jaki program wygeneruje.
Przypominamy, że przy
mnożeniu wykorzystujemy klawisz „gwiazdka”, a przy dzieleniu
„ukośnik”.
Artykuł pochodzi z mojej książki pt. "Delphi w przykładach dla początkujących". Zapraszam na Stronę książki.
Ciekawe artykuły:
Zapoznaj się z innymi utworami. Przejdź do zakładki Spis artykułów.
- Zagadki logiczne i inne zagadki
- Gry matematyczne w Delphi
- Zabawy rozwijające pamięć w Delphi
- Przechwyt klawiatury w Delphi
- Nauki płynące z mądrości pokoleń
Zapoznaj się z innymi utworami. Przejdź do zakładki Spis artykułów.
Brak komentarzy:
Prześlij komentarz