Strony

środa, 15 października 2014

Gry matematyczne w Delphi cz 2

Policz, ile to jest- wersja audio

     Przedstawiamy jeszcze jedno rozwinięcie zabawy o nazwie „Policz, ile to jest”. Zmiana, jakiej dokonamy będzie polegała na zamianie komunikatów tekstowych na słowne. Sprawimy, że program będzie z nami komunikował się używając ludzkiej mowy. Będzie to z pewnością duże udogodnienie i atrakcja, zwłaszcza dla osób samotnych, którym brakuje rozmów z drugim człowiekiem. Przynajmniej komputer będzie do nich mówił...


     Wracając do podstawowego kodu, czyli gry „Policz, ile to jest- wersja prosta”, musimy dokonać pewnych zmian. Przede wszystkim, z uwagi na to, że teraz program będzie zadawał nam pytania ludzkim głosem, możemy pozbyć się etykiety Label6, na której owe zadanie było wyświetlane. Musimy także umieścić na formie komponent TMediaPlayer, który będzie odtwarzał odpowiednie pliki dźwiękowe. Oprócz niego skorzystamy także z prostszego odtwarzacza dźwięków, jakim jest PlaySound. Poznamy dzięki temu oba sposoby odtwarzania dźwięków w Delphi, a ponadto, wykorzystamy ich właściwości. Scharakteryzujmy zatem oba sposoby:




PlaySound




    Jest to prosty odtwarzacz dźwięków, bez możliwości zarządzania tym dźwiękiem z pozycji programu. Kolejną jego wadą jest ograniczenie odtwarzanych formatów jedynie do plików wav. Trudno zatem używać go do bardziej rozbudowanych projektów, z uwagi na duży rozmiar tych plików w porównaniu z formatem mp3. Zazwyczaj stosuje się go do odtwarzania krótkich tam, gdzie nie ma potrzeby używania bardziej rozbudowanego odtwarzacza. Tutaj też jest jego największa zaleta: jako mniej rozbudowany odtwarzacz, uruchamia się on znacznie szybciej niż MediaPlayer. Jeżeli tworzymy wypowiedź programu za pomocą kilku oddzielnych plików (tak, jak w naszym przypadku) PlaySound szybciej i bardziej płynnie odtworzy je kolejno.




TMediaPlayer




     Jako bardziej rozbudowany odtwarzacz, umożliwia on nie tylko odtwarzanie plików wav, czy mp3, ale także zarządzanie dźwiękiem z pozycji programu, czyli na przykład Start, Stop, Pauza, Następny itp. Dużym mankamentem w przypadku plików mp3 jest brak regulacji siły głosu, stąd też do odtwarzania plików mp3 stosuje się często inne komponenty, które nie wchodzą w skład środowiska Delphi, trzeba je sobie osobno doinstalować. 
 

     Wracając do naszego programu, po umieszczeniu na formie komponentu TMediaPlayer, kompilator sam umieści odpowiednią informację o tym w sekcji uses dodając moduł MPlayer. W przypadku korzystania z PlaySound sami musimy w tej sekcji umieścić informację, że będziemy korzystać z przeznaczonego do tego modułu. Dopisujemy zatem po przecinku nazwę MmSystem.


     Jako, że program ma mówić ludzką mową, musimy więc przygotować dla niego odpowiednie pliki dźwiękowe, z których będzie korzystał. Jakie pliki będą nam potrzebne? Po pierwsze, musimy posiadać pliki, z których będą wypowiadane liczby: dwadzieścia jeden oddzielnych plików, każdy przechowujący jedną liczbę, od zera do dwudziestu. Po drugie, musimy mieć trzy pliki określające działanie: plus, minus i razy. Musimy jeszcze mieć początek zdania, czyli formę zapytania „Ile jest?”, oraz pliki z oceną naszej odpowiedzi: „Dobrze” i „Źle”.


     W przypadku początku pytania, gdy za każdym razem program będzie mówił swoje „Ile jest”, prędzej czy później znudzi się nam ta monotonia. Wprowadzamy zatem założenie, że program będzie miał przygotowanych kilka różnych wersji tego pytania, nie tylko formę „Ile jest”, ale także inne, podobne wypowiedzi, na przykład takie: „Powiedz mi, ile jest”, „Ile to jest”, „Podaj mi wynik działania”, „Policz, ile to jest”. Przy każdorazowym uruchomieniu przycisku START program wylosuje jedną z tych form i odtworzy ją. Nada to większej „żywości” naszemu programowi. Programista może sobie przygotować znacznie szerszy wybór wypowiedzi, pamiętając jednak o tym, że w swoim programie musi podać ile tych plików przygotował, aby program wiedział z jakiego zakresu ma losować. Podobny zabieg możemy wykonać w przypadku wypowiedzi oceniającej naszą odpowiedź, a więc nie tylko „Dobrze”, ale także „Bardzo dobrze”, „Świetnie”, „Wyśmienicie”; tak samo: nie tylko „Źle”, ale i „Niestety źle”, „To nie jest dobra odpowiedź”, „Pomyliłeś się”, itp. Im więcej wariantywnych wypowiedzi, tym zabawa będzie mniej monotonna i nudna.


     Odpowiednie pliki możemy nagrać za pomocą swojego głosu lub poprosić koleżankę o miłym głosie, aby użyczyła go na potrzeby programu. Poszczególne kwestie nagrywamy do osobnych plików dźwiękowych: liczby, znaki i początek pytania tworzymy w formacie wav, a komunikaty i oceny możemy stworzyć w formacie mp3, aby zaoszczędzić miejsca na dysku.


     Do przygotowania plików dźwiękowych możemy wykorzystać także odpowiedni program komputerowy, zwany syntezatorem mowy (np. Expressivo), który po wpisaniu w jego oknie tekstu, zamienia go na ludzką mowę, a następnie umożliwia zapisanie wypowiedzi w formie pliku dźwiękowego. Obecne syntezatory są już na tyle doskonałe, że wypowiadane przez nie słowa naprawdę niewiele różnią się od ludzkiej mowy.


     Jeżeli planujemy wykorzystać możliwość mówienia programu do innych gier i zabaw, dobrze jest umieścić część plików dźwiękowych we wspólnym katalogu, na przykład o nazwie właśnie „WSPÓLNE”. Jakie będą to pliki? Ano wszystkie te, które powtarzają się w innych zabawach, a więc: liczby, znaki, komunikaty, oceny itp. Specyficzne wypowiedzi, które występują tylko dla jednej gry, umieszczamy w katalogu głównym lub jakimś innym konkretnej gry. Nazwy plików muszą być liczbami (począwszy od zera), ponieważ ułatwią one programowi losowanie pliku: Wystarczy, że program wylosuje jakąś liczbę i już wiadomo, jaki plik odtworzyć- oczywiście o tej samej liczbie w nazwie.


Własna procedura w Delphi




     Z racji tego, że kod obsługujący odtwarzacz dźwięków zawiera wiele linii kodu, a ponadto za każdym razem linie te będą się powtarzać, więc, aby zmniejszyć ilość linii i zwiększyć przejrzystość kodu, utworzymy własną procedurę, którą nazwiemy „Wylosuj i odtwórz”. Będzie ona pobierała parametry z programu (ścieżkę dostępu do katalogu z plikami i ilość plików w tym katalogu) i na ich podstawie będzie odtwarzać określony plik. 
 

     Aby nasza procedura mogła być przez program wykorzystywana, musimy ją zadeklarować w sekcji „type”. W tym celu dopisujemy naszą deklarację (procedure) do innych procedur, podając jej nazwę. My, swoją procedurę nazwaliśmy „Wylosuj i odtwórz”, ale w tej postaci Delphi nam odrzuci. Wszelkie nazwy procedur muszą mieć postać jednoczłonową, stąd też deklarujemy naszą procedurę pod nazwą „Wylosuj_i_odtworz”. Nie trzeba chyba nikomu przypominać, że w kodzie nie korzystamy z polskich znaków dielektrycznych, możemy to zrobić jedynie w komentarzu. Opisem tej funkcji zajmiemy się w dalszej części, teraz, kończąc temat, dopowiemy jeszcze jaki jest sens stosowania takich własnych procedur.


     Wyobraźmy sobie program podobny do naszego, tylko bardziej rozbudowany, który wszelką komunikację z użytkownikiem prowadzi za pomocą plików dźwiękowych. Chcąc odtworzyć taki plik w komponencie MediaPlayer, musielibyśmy wpisać następujący kod:

MediaPlayer1.FileName:= 'C:\Katalog\Plik.mp3';

MediaPlayer1.Open;

MediaPlayer1.Wait:=True;

MediaPlayer1.Play;

     Kod ten musielibyśmy powtarzać za każdym razem, gdy będziemy generowali wypowiedź programu. Jest to dosyć czasochłonna praca, bardzo powiększająca ogólną objętość kodu. Lepiej więc taki kod zawrzeć w stworzonej przez nas procedurze, a potem odnosić się bezpośrednio do niej z różnych miejsc kodu. Teraz wystarczy tylko wpisać nazwę naszej procedury, czyli Wylosuj_i_odtworz, a program wykona przypisany do niej kod. Zabieg ten odchudzi nasz kod i uczyni go bardziej przejrzystym.




                   < Wstecz    2/4    Dalej >

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