Strony

poniedziałek, 20 października 2014

Gry matematyczne w Delphi cz 4

Komentarz:

 

1. Zmienne globalne


WYNIK: Integer;            //zmienna przechowująca wynik
Poprawne: Integer;        //zmienna przechowująca ilość poprawnych odpowiedzi
Niepoprawne: Integer;    //zmienna przechowująca ilość niepoprawnych odpowiedzi
Ilosc_plikow: Integer;     //zmienna przechowująca ilość plików w katalogu
Katalog: String;             //zmienna przechowująca ścieżkę dostępu do katalogu


     Poza znanymi nam już zmiennymi globalnymi, deklarujemy dwie nowe, które będzie wykorzystywała nasza procedura „Wylosuj i odtwórz”. Jest to konieczne, ponieważ pliki dźwiękowe znajdują się w różnych katalogach (zmienna Katalog), a każdy z nich zawiera inną liczbę plików (zmienna Ilosc_plikow).


2. Procedura Wylosuj i odtwórz


      Z uwagi na to, iż chcemy, aby program za każdym razem losował swoją wypowiedź jedną z wielu, stąd też na początku naszej procedury musimy uruchomić maszynę losującą (Randomize). W dalszej kolejności następuje losowanie numeru pliku do odtworzenia, dlatego właśnie plikom dźwiękowym nadaliśmy nazwy w postaci liczb. Ponieważ w tej chwili nie wiemy z jakiego katalogu program skorzysta (bo to zależy od rodzaju wypowiedzi), więc w tej ogólnej postaci musimy wprowadzić pierwszą zmienną globalną, czyli Ilosc_plikow, którą wypełnimy bezpośrednio w danej procedurze. Nasza procedura pobierze ten parametr i wstawi u siebie, losując określony plik. Jako drugi parametr zostanie pobrana druga zmienna, Katalog, która będzie zawierać ścieżkę dostępu do konkretnego katalogu z wypowiedziami.

     Po pobraniu potrzebnych informacji następuje uruchomienie odtwarzacza Media Player i wprowadzenie do niego ścieżki dostępu (czyli adresu miejsca na twardym dysku) pliku, która ma zostać odtworzony. Ścieżka ta w naszym przykładzie składa się z trzech części: ścieżki dostępu do katalogu, zmiennej „Plik”, która zawiera numer pliku do odtworzenia i części tekstowej (.mp3), aby powiązać zmienną „Plik” z plikiem dźwiękowym, ponieważ co prawda my nadaliśmy plikowi nazwę liczby, ale pełna nazwa pliku zawiera jeszcze jego rozszerzenie (w naszym przypadku .mp3), stąd też do zmiennej „Plik”, która przechowuje samą liczbę dokładamy końcówkę „.mp3”.

      Mając podaną poprawną ścieżkę dostępu następuje załadowanie pliku do odtwarzacza (MediaPlayer1.Open) i jego odtworzenie (Play). Pomiędzy tymi poleceniami wstawiamy jeszcze polecenie MediaPlayer1.Wait: True, które aktywuje właściwość Wait (czekaj). Dzięki niej Media Player musi czekać z zamknięciem pliku do zakończenia jego odtwarzania. Funkcja ta przydaje się szczególnie mocno, gdy chcemy odtwarzać kilka plików pod rząd. Bez tego polecenia Media Player uruchamiałby kolejne utwory i zaraz je zamykał, nie pozwalając im wybrzmieć.


3. 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
Numer_pliku: Integer;   //zmienna przechowująca numer pliku 'Ile jest'
Znak: String;              //zmienna przechowująca znak działania
Sciezka1: String;        //zmienna przechowująca ścieżkę dostępu do pliku dźwiękowego
Sciezka2: String;        //zmienna przechowująca ścieżkę dostępu do pliku dźwiękowego
Sciezka3: String;        //zmienna przechowująca ścieżkę dostępu do pliku dźwiękowego
Sciezka4: String;        //zmienna przechowująca ścieżkę dostępu do pliku dźwiękowego

      W porównaniu z wersją prostą, w sekcji zmiennych (var) mamy umieszczone dodatkowe cztery zmienne typu string przechowujące ścieżkę dostępu do poszczególnych plików dźwiękowych, oraz zmienną Numer_pliku, która przechowuje numer pliku do odtworzenia dla wypowiedzi „Ile jest”. Na ich podstawie program będzie tworzył swoją wypowiedź według następującego schematu:

                                       (Ile jest) (Liczba1) (znak) (Liczba2)

     Kolejną sekcję, po deklaracjach zmiennych nie komentujemy, ponieważ jest ona taka sama, jak w wersji oryginalnej. Jedyną zmianą jest dodanie linii Numer_pliku:=Random(5). 

    Odpowiada ona za wylosowanie numeru pliku do odtworzenia dla początku wypowiedzi, to znaczy „Ile jest”. Wspominaliśmy już o tym, że robimy to po to, aby bardziej ożywić nasz program. Dzięki losowaniu odpowiedzi jednej z kilku możliwych, uatrakcyjniamy program. W naszym przypadku w katalogu „Policz ile to jest” mamy przygotowanych pięć wariantów tej wypowiedzi, stąd też program losuje plik właśnie z tego przedziału.


                         //przypisz do zmiennych Sciezka ścieżki dostępu do plików
Sciezka1:='c:\Gry\Policz ile jest\'+IntToStr(Numer_pliku)+'.wav';
Sciezka2:= 'c:\Gry\WSPOLNE\Liczby i znaki\'+IntToStr(Liczba1)+'.wav';
Sciezka3:= 'c:\Gry\WSPOLNE\Liczby i znaki\'+Znak+'.wav';
Sciezka4:= 'c:\Gry\WSPOLNE\Liczby i znaki\'+IntToStr(Liczba2)+'.wav';
PlaySound(PChar(Sciezka1),0,SND_FILENAME);     //odtwórz plik Ile jest
PlaySound(PChar(Sciezka2),0,SND_FILENAME);      //odtwórz plik 1 liczba
PlaySound(PChar(Sciezka3),0,SND_FILENAME);     //odtwórz plik Znak działania
PlaySound(PChar(Sciezka4),0,SND_FILENAME);     //odtwórz plik 2 liczba

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


     W przedstawionym powyżej fragmencie kodu, najpierw tworzymy ścieżkę dostępu do odpowiednich katalogów i plików, gdyż funkcja PlaySound nie umożliwia łączenia tekstu ze zmiennymi, a to musimy zrobić chcąc za każdym razem losować inny plik. W normalnych warunkach, w miejsce Pchar(sciezka) moglibyśmy wpisać pełną ścieżkę do pliku, na przykład: „C:\Gry\Policz ile to jest\1.wav”.

      W pierwszej kolejności, do zmiennych „sciezka” przypisujemy ścieżkę dostępu do odpowiedniego katalogu, a następnie za pomocą zadeklarowanych wcześniej zmiennych (Numer_pliku, Liczba1 i 2, Znak) ustalamy konkretny plik do odtworzenia.

      W schemacie wypowiedzi programu mamy cztery części, więc tyle też musimy mieć zmiennych. Zmienna „Sciezka1” przechowuje ścieżkę dostępu do plików odpowiedzialnych za pierwszą część wypowiedzi, czyli „Ile to jest”. Kolejne zmienne przechowują z kolei ścieżkę dostępu do wspólnego katalogu o nazwie „Liczby i znaki”, w którym zawarte są pliki umożliwiające wypowiadanie liczb i znaków matematycznych.

     Mając już ustalone ścieżki dostępu plików do odtworzenia, nie pozostaje nic innego, jak ich załadowanie do funkcji PlaySound i odtworzenie. Przy wprowadzaniu zmiennej musimy użyć funkcji konwertującej PChar, aby typ zmiennej „Sciezka”, czyli string, był zrozumiały dla funkcji PlaySound. Na koniec, tradycyjnie już, ustawiamy kursor (focus) na polu do podawania odpowiedzi.

      Jak widać z tego fragmentu, w porównaniu z wersją prostą programu, jest to tylko wymiana polecenia ShowMessage na zbiór poleceń PlaySound.


4. Gdy naciśniesz przycisk Sprawdź


Odp:= Edit1.Text;             //odczytaj podaną odpowiedź i przypisz ją do zmiennej
     if Odp='' then              //gdy nie podano odpowiedzi monituj o wpisaniu wyniku
         begin 
           PlaySound('c:\Gry\WSPOLNE\Komunikaty\WpiszLiczbe.wav',0,SND_FILENAME);
              Edit1.SetFocus;   //ustaw focus w Polu do Odpowiedzi
              goto KONIEC;     //pomiń poniższy kod i przejdź od razu na koniec procedury


     W sekcji tej wymieniamy tylko komunikat tekstowy (ShowMessage) na głosowy (PlaySound). Z uwagi na to, że komunikat ten rzadko kiedy będzie wykorzystywany, więc przygotowaliśmy tylko jedną jego wersję. Może to być proste stwierdzenie typu „Wpisz najpierw wynik” lub podobne. Skoro mamy tylko jeden plik do odtworzenia, więc w funkcji PlaySound wpiszemy pełną ścieżkę dostępu, nie zapominając, że musi się ona znaleźć pomiędzy apostrofami.


if Odp=(IntToStr(WYNIK)) then    //jeżeli odpowiedź jest poprawna to ...
    begin
        Ilosc_plikow:=7;                   //liczba plików w katalogu
        Katalog:='c:\Gry\WSPOLNE\Komunikaty\Dobrze\'; //ścieżka dostępu
        Wylosuj_i_odtworz;             //włącz procedurę odtwarzającą plik
        Poprawne:=Poprawne + 1;   //dodaj punkt do poprawnych odpowiedzi
    end                                       //bez średnika

else                                          //w przeciwnym wypadku ...

begin
    Ilosc_plikow:=8;                              //liczba plików w katalogu
    Katalog:='c:\Gry\WSPOLNE\Komunikaty\Zle\'; //ścieżka dostępu
     Wylosuj_i_odtworz;                        //włącz procedurę odtwarzającą plik
     Niepoprawne:=Niepoprawne + 1;     //dodaj punkt do niepoprawnych odpowiedzi
end;


     Podobnie, jak w poprzednim przypadku, w sekcji tej następuje tylko wymiana rodzaju komunikatu z tekstowego na głosowy. W tym jednak przypadku zastosujemy odtwarzacz MediaPlayer, aby móc skorzystać z plików mp3. Za każdym razem, chcąc z niego skorzystać będziemy wykorzystywać stworzoną przez nas procedurę Wylosuj_i_odtworz. Wymaga ona podania dwóch parametrów: ścieżki dostępu do odpowiedniego katalogu, oraz podania informacji, ile w tym katalogu znajduje się plików, toteż na początku deklarujemy obie zmienne globalne, a następnie wydajemy polecenie, aby program uruchomił naszą procedurę odtwarzającą. Wykona się ona poprawnie, ponieważ w zmiennych globalnych znajdzie potrzebne dla swego działania dane. Bez ich wcześniejszego zadeklarowania program zgłosiłby błąd.

      Deklarując zmienną „Ilosc_plikow” musimy już wiedzieć, ile tych plików w danym katalogu jest. Musimy zatem przygotować je wcześniej, przed przystąpieniem do pisania kodu. Jeżeli do katalogu dołożymy nowe pliki, już po napisaniu kodu, program nie skorzysta z nich, ponieważ w swoim kodzie będzie posiadał stare dane. W tym przypadku będziemy musieli zmodyfikować kod, wpisując zaktualizowane deklaracje, ile w tej chwili znajduje się plików w katalogu, a następnie od nowa skompilować program.

      W przykładzie rozwinięcia podstawowej wersji programu jaki tutaj zaprezentowaliśmy, wymieniliśmy tylko część komunikatów na ich głosowe odpowiedniki. Nic jednak nie stoi na przeszkodzie, aby w sposób pokazany wyżej nie pozamieniać pozostałych komunikatów, chociażby tych, które przy wyłączeniu programu oceniają nasze wyniki. Możemy także nadać programowi cechę, aby po udzielonej odpowiedzi informował, jaki jest aktualny wynik lub wprowadzić inne elementy i rozwiązania, które zwiększą komfort pracy lub możliwości programu. Wszystko zależy od naszych oczekiwań.



< Wstecz    4/4

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

poradnik programowania Delphi

Brak komentarzy:

Prześlij komentarz