Delphi, cz. 5
Tak jak mówiłem w tym rozdziale zajmiemy się czymś innym, a mianowicie napiszemy grę: "Kolko i Krzyżyk". Myślisz, ze to trudne? Wcale nie. Zacznijmy wiec. Aha, na stronie: www.programowanie.of.pl możesz ściągnąć kilka gier Kolko i Krzyżyk wraz z kodami źródłowymi.
Pierwsze kroki
Stwórz nowy formularz ( "File" -> "New Application" ). Teraz zapisz projekt ( "File" -> "Save All" ) pod nazwa "kik.dpr" i "MainForm.pas" jako nazwa formularza. W Inspektor Obiektów zmień właściwość "Name" formy na "MainFrm", a "Caption" na "Kolko i Krzyżyk 1.0". Na początek na formularzu potrzebować będziemy 9 przycisków typu "TSpeedButton" ( zakładka: "Additional" ). Umieść te 9 przycisków obok siebie. Teraz obrysuj myszka te 9 przycisków - wszystkie przyciski zostaną zaznaczone. Teraz w Inspektor Obiektów zmień właściwość "Height" i "Width" tych przycisków na 30. Na formularzu umieść jeszcze dwa przyciski typu "SpeedButton" (zakładka: "Additional" ). Te dwa przyciski symbolizować będą gracza pierwszego i drugiego. Zmień właściwość "Name" pierwszego z przycisków na "Player1", a drugiego na "Player2". Teraz zmień właściwość "Caption" pierwszego z przycisków na "Gracz 1", a drugiego na "Gracz 2". Rozciągnij trochę te dwa przyciski tak, aby mieścił się w nich napis.
Teraz ponownie zaznacz dwa przyciski "Gracz 1" i "Gracz 2". W Inspektor Obiektów we właściwości "GroupIndex" wpisz cyfrę 1. Ta właściwość określa tzw. grupę. Przekonasz się o tym później. Teraz zaznacz jedynie pierwszy z przycisków i w Inspektor Obiektów zmień jego właściwość "Down" na "True". Od tej pory jeden z przycisków będzie "wciśnięty". Po naciśnięciu na jeden przycisk drugi zostanie "wciśnięty", a drugi "wciśnięty". Dzieje się tak, dlatego, ze właściwość "GroupIndex" tych dwóch przycisków są jednakowe.
Pisanie kodu
Teraz zajmiemy się pisaniem kodu. Przełącz się do edytora kodu ( F12 ). Pod słowem "private" dopisz taka linie:
procedure Change;
Teraz uzupełnij procedure ( jak to zrobić - pisałem w poprzednich rozdziałach ) i wpisz w niej taki kod:
{
Ta procedura zmienia ustawienia "Down" przycisków
}
if Player1.Down then //Jezeli wcisniety jest klawisz Player1
Player2.Down := True //Wcisnij klawisz Player2
else //Jezeli jest odwrotnie....
Player1.Down := True; //...wcisnij klawisz Player1
Właściwie to, co najważniejsze zostało opisane w komentarzach. Procedura zmienia kolejność "wciśnięcia" przycisków - najpierw jeden potem drugi :) Teraz do sekcji "private" dopisz jeszcze jedna linie:
procedure CheckIt;
Ta procedura będzie sprawdzać wygrane. Tak jak poprzednio uzupełnij procedure w ten sposób:
{
Ta procedura sprawdza czy padla wygrana czy tez nie.
Konstrukcja tej peoceury jest bardzo prosta. Calosc polega
na sprawdzaniu czy na klawiszu jest napis 'X', czy 'O'.
Nastepnie nastepuje sprawdzenie, czy ten sam napis jest takze
na innych przyciskach. Jezeli tak generowana jest procedura Winner
}
if (b1.Caption = 'X') and (b2.Caption = 'X') and
(b3.Caption = 'X') or (b1.Caption = 'O') and
(b2.Caption = 'O') and (b3.Caption = 'O') then
Winner;
if (b1.Caption = 'X') and (b5.Caption = 'X') and
(b9.Caption = 'X') or (b1.Caption = 'O') and
(b5.Caption = 'O') and (b9.Caption = 'O') then
Winner;
if (b1.Caption = 'X') and (b4.Caption = 'X') and
(b7.Caption = 'X') or (b1.Caption = 'O') and
(b4.Caption = 'O') and (b7.Caption = 'O') then
Winner;
if (b4.Caption = 'X') and (b5.Caption = 'X') and
(b6.Caption = 'X') or (b4.Caption = 'O') and
(b5.Caption = 'O') and (b6.Caption = 'O') then
Winner;
if (b7.Caption = 'X') and (b8.Caption = 'X') and
(b9.Caption = 'X') or (b7.Caption = 'O') and
(b8.Caption = 'O') and (b9.Caption = 'O') then
Winner;
if (b2.Caption = 'X') and (b5.Caption = 'X') and
(b8.Caption = 'X') or (b2.Caption = 'O') and
(b5.Caption = 'O') and (b8.Caption = '0') then
Winner;
if (b3.Caption = 'X') and (b6.Caption = 'X') and
(b9.Caption = 'X') or (b3.Caption = 'O') and
(b6.Caption = 'O') and (b9.Caption = 'O') then
Winner;
if (b3.Caption = 'X') and (b5.Caption = 'X') and
(b7.Caption = 'X') or (b3.Caption = 'O') and
(b5.Caption = 'O') and (b7.Caption = 'O') then
Winner;
end;
Jak widisz procedura jest trochę dluga, dlatego, ze musi uwzgledniac wszystkie warianty wygranej. Rozumiesz, wszystkie ixy w lini poziomej, pionowej, ukośnie itp., itd.
W przypadku, gdy ktoś wygra wywoływana będzie procedura "Winne", która później napiszemy. Pewnie zauważyłeś "tajemnicze" "b1", "b2" itp. Są to nazwy naszych 9 przycisków, na których umieszczane będą symbole X i O. A wiec przełącz się do formularza ( F12 ). Zmień właściwość "Name" tych przycisków na "b1" do "b9".
Co teraz? Teraz musisz napisać procedure, która generowana będzie po naciśnięciu na klawisz. Kliknij na pierwszy z przycisków ( b1 ) - zostaniesz przeniesiony do edytora kodu. Musisz do tej procedury wpisać kod:
{
To jest taka sama procedura dla wszytkich
przycisków. Jezeli przycisk "Gracz1" jest wciśnięty
to postawiony jest 'X', w przeciwenym wypadku 'O'
}
if Player1.Down then
TSpeedButton(Sender).Caption := 'X'
else
TSpeedButton(Sender).Caption := 'O';
CheckIt;
Change;
{ Procedura, ktora jest wywolywana po kazdorazowym
naciśnięciu przycisku sluzy do zmian wartosci "Down"
przyciskow Player1, Player2
}
Widzisz powiązanie z tym, co robiliśmy w poprzednim rozdziale? Już omawiam, o co chodzi w tej procedurze. Najpierw następuje sprawdzanie, czy naciśnięty jest przycisk "Player1". Jeżeli tak jest to wartość "Down" przybierze wartość "true". A jeżeli się tak stanie to na aktywnym przycisku typu "TSpeedButton" wartość "Caption" zmieni się na "X". Jeżeli jest inaczej tzn., ze wciśnięty jest przycisk "Player2". Jeżeli tak jest to na przycisku "TSpeedButton" będzie widniał napis symbolizujący kolko ( "O" ). Jeżeli czegoś w tej procedurze nie rozumiesz to zerknij do poprzedniego rozdziału. Na samym końcu wywołane zostaną dwie procedury, które już napisaliśmy wcześniej. Teraz znów przełącz się do formularza. Kliknij pojedynczo na przycisku "b2". Teraz w Inspektor Obiektów kliknij na zakładce "Events". Odnajdź pole "OnClick" - zaznacz je. Po prawej stronie pojawi się strzałka - kliknij ja - rozwinie się menu, w którym odszukaj pozycje "b1Click" i kliknij je. Od tej pory po kliknieciu na przycisku "b2" zostanie wywołana procedura "b1Click". Zrób tak z pozostałymi przyciskami przypisując im te sama procedure ( "b1" ). Do zakończenia pisania programu pozostało jeszcze napisanie procedury "Winne".
Dodaj do sekcji "private" linie:
procedure Winne;
Uzupełnij procedure w ten sposób:
{
Procedura wyswietla okienko w przypadku, gdy ktos
wygral.
}
if Player1.Down then
ShowMessage(Format('Jest OK, wygral gracz %s', [Player1.Caption]))
else
ShowMessage(Format('Jest OK, wygrał gracz %s', [Player2.Caption]));
Nowością w tej procedurze jest funkcja "Format". Najpierw omówię funkcje "Format". Mogłem oczywiście napisać tak:
ShowMessage('Jest OK, wygral gracz ' + Player1.Caption);
Mogłem, ale w tym kursie chodzi o uczenie się nowych rzeczy, a wiec zdecydowałem się użyć funkcji "Format". Spójrz na poniższy kod:
var
I : Integer;
begin
I := 20;
ShowMessage('Tak ta liczba to: ' + IntToStr(i));
end;
W tym wypadku następuje konwersja ze zmiennej "Integer" na "String". Funkcja "Format" robi to samo lecz bez użycia funkcji "IntToStr". Można to napisać tak:
var
I : Integer;
begin
I := 20;
ShowMessage(Format('Tak ta liczba to %d', [i]);
end;
Ta funkcja podobna jest do C++. Po prostu w miejscu gdzie znajduje się znak "%d" ma się znaleźć zmienna "Integer" ( tak to tłumaczy kompilator ).Następnie po przecinku i nawiasie klamrowym wpisana zostanie zmienna, właśnie "Integer". Zamiast znaku "%d" można wstawić:
%d - liczba "Integer"
%s -zmienna "String"
%c - zmienna "Char"
%f - zmienna typu "Double"
Procedura "Winne" jest prosta. W zależności od tego, który przycisk jest wciśnięty wyświetlony zostaje komunikat o wygranej.
Właściwie napisałeś już grę. Możesz teraz już ja uruchomić ( F9 ). Dla poprawienia wyglądu możesz jeszcze w każdym z 9 przycisków zmienić w Inspektor Obiektów właściwość "Flat" na "True". Spowoduje to "spłaszczenie" przycisków. Możesz także zmienić czcionkę na tych 9 przyciskach. W Inspektor Obiektów pod nazwa "Font". Możesz ja pogrubić i zmienić rozmiar.
Jeżeli będą Ci występować błędy, czegoś nie będziesz wiedział to pisz do mnie ( boduch@poland.com ) albo najlepiej ściągnij sobie te grę z Internetu ze strony: www.programowanie.of.pl. [ dział "Źródła" ].
Nie obawiaj się jeżeli czegoś nie rozumiesz. Z czasem pojmiesz o co chodzi - wiesz mi :)
Jak zawsze czekam na listy.