środa, 29 października 2014

Kosmiczna galeria cz 2

Mgławica „Carina” (NGC 3372)


     Mgławica emisyjna znajdująca się w gwiazdozbiorze Kila na niebie południowym, niewidocznym w Polsce. Jest odległa od nas o około 7500 lat świetlnych, a jej rozmiary są szacowane na 260 lat świetlnych. Pył i gaz mgławicy są rozgrzewane przez znajdujące się w jej centrum młode gwiazdy. 

    Obserwacje wykonane w podczerwieni wykazały że różne części mgławicy poruszają się w różnych kierunkach z prędkościami dochodzącymi do 230 km/s. Zderzenia obłoków molekularnych poruszających się z tak dużymi prędkościami rozgrzewają materię do wysokiej temperatury. 
 
NGC 3372
Mgławica Carina                                             fot. ESO,T.Preibisch

NGC 3372
Mgławica Carina                                                               fot. NASA


Mgławica Trąba słonia" (fragment gromady gwiazd IC1396)

     Fragment gromady otwartej gwiazd powiązanej z otaczającą ją mgławicą emisyjną. Znajduje się w gwiazdozbiorze Cefeusza. Gromada ta jest jedną z największych widocznych na niebie, jej widoczna średnica kątowa jest prawie trzy razy większa niż średnica kątowa Księżyca. Choć rozciąga się na setki lat świetlnych jest słabo widoczna. Wewnątrz niej możemy znaleźć charakterystyczną ciemną mgławicę pyłową zwaną Trąbą słonia (na zdjęciu). IC 1396, jest aktywnym obszarem gwiazdotwórczym, w którym gwiazdy są skąpane w gorącym wodorze oraz otulone chłodniejszym pyłem. W dalszej przyszłości obszar ten może stać areną dynamicznych procesów gwiazdotwórczych. 
 
     Za przyczynę powstania tej mgławicy odpowiada gwiazda HD 206267, której silne podmuchy wiatru gwiazdowego uformowały z otaczających gwiazdę pyłów tę charakterystyczną strukturę.
 
IC1396
Mgławica "Trąba słonia"                                                 fot. NASA
 


Mgławica „Koński łeb” (fragment mgławicy IC 434)

     Ciemna mgławica znajdująca się w gwiazdozbiorze Oriona i jest częścią znacznie większego Zespołu Obłoków Molekularnych Oriona. Leży w przybliżeniu 1500 lat świetlnych od Ziemi i ma średnicę w przybliżeniu 3,5 lat świetlnych. Czerwony blask pochodzi od gazu wodorowego głównie za Mgławicą Koński Łeb, zjonizowanego przez pobliską gwiazdę sigma Orionis. Ponadto mgławicę tę rozjaśnia znajdująca się za nią mgławica emisyjna IC 434. Ciemność mgławicy Koński Łeb jest spowodowana głównie przez gęstą warstwę pyłu, chociaż dolna część szyi Końskiego Łba rzuca cień na lewo. Jasne punkty przy podstawie mgławicy Koński Łeb to młode gwiazdy w procesie formowania.

IC 434
Mgławica „Koński łeb”                                          fot. Wikimedia

środa, 22 października 2014

Kosmiczna galeria cz 1

     Od zarania dziejów rozgwieżdżone niebo fascynowało ludzi i pobudzało ich twórczą wyobraźnię. Posiadając zdolność abstrakcyjnego myślenia i poczucie piękna człowiek -jako istota rozumna- szybko zachwycił się tysiącem iskrzących punkcików o różnych wielkościach i odcieniach, porozrzucanych po całym niebie. Posiadając te niezwykłe umiejętności bez trudu dostrzegł, że niektóre gwiazdy tworzą razem pewną całość, nadając jej wyimaginowany obraz, który automatycznie tworzy się w wyobraźni. Zaczął więc wielką połać nocnego nieba dzielić na mniejsze całości, grupy gwiazd, które układały mu się w pewien obraz. Nazwał je gwiazdozbiorami. Spójrzcie na gwiazdozbiór o nazwie Korona Północna (poniżej). Jego nazwa oddaje dokładnie to, co widzimy: diadem, z dużym kamieniem szlachetnym, pod postacią najjaśniejszej gwiazdy.

Gwiazdozbiory
Gwiazdozbiór Korona Północna                                fot. Wikimedia
 
     Pomimo tego, iż gwiazdy te nic ze sobą nie łączy, nasz umysł powiązał je od razu w pewną całość. Podobnie jest z flagą Unii Europejskiej: nie ma chyba nikogo, kto by te dwanaście oddzielne gwiazdki nie nazwał kołem. Tak właśnie działa nasz mózg: potrafi dopowiedzieć sobie coś w taki sposób, aby to, co widzi, miało dla niego jakiś sens, tak, jak w tym „słow_e”. Bez problemu mózg dołożył literkę "i", aby ten zbiór liter stał się dla niego sensowny.

flaga europejska
Flaga Unii Europejskiej
 
     Z biegiem czasu takie starożytne narody, jak Egipcjanie, czy Grecy umieścili na firmamencie cały szereg wyimaginowanych obrazów, złożonych z pewnych grup gwiazd. W ten sposób mamy gwiazdozbiory o takich nazwach mitycznych bohaterów jak Herkules, Perseusz, Cefeusz, czy zwierząt jak Baran, Byk, Ryby... Dla innych kultur i narodów te same grupy gwiazd nosiły różne nazwy, ale rzeczywiście: patrząc na rozgwieżdżone niebo, bez trudu wyłonimy w nim gwiazdy, które ułożą się nam w jakiś obraz.

     W czasie, kiedy nocne niebo fascynowało jeszcze filozofów i romantyków, wiedza człowieka o otaczającym go świecie dopiero rozwijała się, a wraz z nią przyszło wynalezienie lunety i teleskopu. Nagle człowiek dostrzegł, że te kilka tysięcy gwiazd, które widzi, to zaledwie mała część tego, co widać przez stworzony przez niego sprzęt optyczny. Pozwalał on dostrzec na niebie obiekty tak słabo świecące, że wręcz niewidoczne dla ludzkiego oka. Jakie było więc jego zdziwienie, gdy przepiękne, jasne smugi Drogi Mlecznej, które zachwycają nas w letnią noc, okazały się być złożone z umieszczonych blisko siebie niezliczonej ilości słabych gwiazd!

Nasza Galaktyka
Droga Mleczna                                                       fot. Wikimedia

     Im większe teleskopy człowiek budował, tym bardziej dziwił się i zachwycał. W końcu teleskopy stały się tak wielkie jak całe domy (fotografia poniżej).

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.

piątek, 17 października 2014

Gry matematyczne w Delphi cz 3

Oto pełny kod programu:

unit Unit1;



interface



uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, MmSystem, MPlayer;



type

TForm1 = class(TForm)

Edit1: TEdit;

Button1: TButton;

Button2: TButton;

MediaPlayer1: TMediaPlayer;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

procedure Button1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure Edit1KeyPress(Sender: TObject; var Key: Char);

procedure Button2Click(Sender: TObject);

procedure Wylosuj_i_odtworz;



private

{ Private declarations }

public

{ Public declarations }

end;



var

Form1: TForm1;

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



implementation



{$R *.dfm}







              //przy uruchomieniu programu wyzeruj punktację

procedure TForm1.FormCreate(Sender: TObject);

   begin

       Poprawne:=0;                 //wyzeruj ilość poprawnych odpowiedzi

       Niepoprawne:=0;            //wyzeruj ilość niepoprawnych odpowiedzi

       Label4.Caption:= '0';       //wyświetl '0' poprawnych odpowiedzi

       Label5.Caption:= '0';       //wyświetl '0' niepoprawnych odpowiedzi

  end;






              //przy zamykaniu programu oceń uzyskane wyniki

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

   begin

      if (Poprawne<Niepoprawne) or (Poprawne=Niepoprawne) then

          begin

             ShowMessage('Musisz jeszcze trochę potrenować');

          end                 //bez średnika

             else             //w przeciwnym wypadku...

                 ShowMessage('Gratuluję! Uzyskałeś dobry wynik');

  end;











//pozwól na wpisywanie tylko liczb, minusa i Backpace w polu odpowiedzi

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

   begin

       if not (Key in ['0'..'9',#45,#8]) then

           begin

               Key:=#0;

               ShowMessage('To nie jest liczba');         //wyświetl komunikat o błędzie

           end;

   end;








               // Procedura losująca i odtwarzająca plik dźwiękowy

var

Plik: Integer;            //zmienna przechowująca numer pliku do odtworzenia



procedure TForm1.Wylosuj_i_odtworz;

    begin

        Randomize;

        Plik:= Random(Ilosc_plikow);    //wylosuj plik z katalogu

        MediaPlayer1.FileName:= Katalog+IntToStr(Plik)+'.mp3';    //odtwórz plik

        MediaPlayer1.Open;               //otwórz pliku

        MediaPlayer1.Wait:=True;       //czekaj aż skończy się wybrzmiewać plik

        MediaPlayer1.Play;                //odtwórz plik

  end;







                     //gdy naciśniesz przycisk START

procedure TForm1.Button1Click(Sender: TObject);

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



begin

    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ę

    Numer_pliku:=Random(5);                   //wylosuj numer pliku Ile jest

    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

        end;


if Dzialanie=0 then

    Znak:= '+';                   //jeżeli wylosowano dodawanie to pokaz znak '+'

if Dzialanie=1 then

    Znak:= '-';                    //jeżeli wylosowano odejmowanie to pokaz znak '-'

if Dzialanie=2 then

    Znak:= 'x';                   //jeżeli wylosowano mnożenie to pokaz znak 'x'

ś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.

środa, 8 października 2014

Gry matematyczne w Delphi cz 1

Policz, ile to jest- wersja trudniejsza


     Poniższy przykład jest trudniejszą wersją poprzednio zaprezentowanej gry (Policz, ile to jest- wersja prosta). W tamtej, działania odbywały się z użyciem dwóch liczb, a w tej, z użyciem aż czterech, na przykład: „Ile to jest: 2 + 8 x 11 – 7 ?”. Wszystkie inne nasze założenia i rozwiązania pozostają bez zmian.

A oto pełny kod programu:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: Tobject);

private
{ Private declarations }
public
{ Public declarations }
end;

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}



                               //przy uruchomieniu programu wyzeruj punktację
procedure TForm1.FormCreate(Sender: TObject);
  begin
    Poprawne:=0;                //wyzeruj ilość poprawnych odpowiedzi
    Niepoprawne:=0;           //wyzeruj ilość niepoprawnych odpowiedzi
    Label4.Caption:= '0';     //wyświetl '0' poprawnych odpowiedzi
    Label5.Caption:= '0';     //wyświetl '0' niepoprawnych odpowiedzi
end;



                          //przy zamykaniu programu oceń uzyskane wyniki
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
   begin
       if (Poprawne<Niepoprawne) or (Poprawne=Niepoprawne) then
          begin
             ShowMessage('Musisz jeszcze trochę potrenować');
          end                        //bez średnika
              else                    //w przeciwnym razie
                   ShowMessage('Gratuluję! Uzyskałeś dobry wynik');
   end;



 //pozwól na wpisywanie tylko liczb, minusa i Backpace w polu odpowiedzi
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
        if not (Key in ['0'..'9',#45,#8]) then
            begin
                Key:=#0;
                ShowMessage('To nie jest liczba'); //wyświetl komunikat o błędzie
            end;
end;


                               //gdy naciśniesz przycisk START
procedure TForm1.Button1Click(Sender: TObject);
var
Liczba1: Integer;        //zmienna przechowująca pierwszą liczbę
Liczba2: Integer;        //zmienna przechowująca drugą liczbę
Liczba3: Integer;        //zmienna przechowująca trzecią liczbę
Liczba4: Integer;        //zmienna przechowująca czwartą liczbę
Dzialanie: Integer;      //zmienna pomocnicza do losowania znaku działania
Znak1: String;           //zmienna przechowująca pierwszy znak działania
Znak2: String;           //zmienna przechowująca drugi znak działania
Znak3: String;           //zmienna przechowująca trzeci znak działania

begin
    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ę
      Liczba3:=Random(21);    //losuj trzecią liczbę
      Liczba4:=Random(21);     //losuj czwartą liczbę

                          //wygeneruj pierwszą część działania
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
    end;

if Dzialanie=0 then
    Znak1:= '+';                 //jeżeli wylosowano dodawanie to pokaż znak '+'
if Dzialanie=1 then
    Znak1:= '-';                  //jeżeli wylosowano odejmowanie to pokaż znak '-'
if Dzialanie=2 then
    Znak1:= 'x';                 //jeżeli wylosowano mnożenie to pokaż znak 'x'


                                   //wygeneruj drugą część działania
Dzialanie:=Random(3);      //losuj znak działania matematycznego
     case Dzialanie of           //gdy zostanie wylosowana dana liczba to...
         0: WYNIK:= WYNIK+Liczba3;      //...wykonaj dodawanie
         1: WYNIK:= WYNIK-Liczba3;      //...wykonaj odejmowanie
         2: WYNIK:= WYNIK*Liczba3;      //...wykonaj mnożenie
     end;

if Dzialanie=0 then
    Znak2:= '+';                 //jeżeli wylosowano dodawanie to pokaż znak '+'
if Dzialanie=1 then
    Znak2:= '-';                 //jeżeli wylosowano odejmowanie to pokaż znak '-'
if Dzialanie=2 then
    Znak2:= 'x';                 //jeżeli wylosowano mnożenie to pokaż znak 'x'


                               //wygeneruj trzecią część działania
Dzialanie:=Random(3);              //losuj znak działania matematycznego
    case Dzialanie of                    //gdy zostanie wylosowana dana liczba to...
       0: WYNIK:= WYNIK+Liczba4;     //...wykonaj dodawanie
       1: WYNIK:= WYNIK-Liczba4;      //...wykonaj odejmowanie
       2: WYNIK:= WYNIK*Liczba4;      //...wykonaj mnożenie
end;

if Dzialanie=0 then
     Znak3:= '+';                 //jeżeli wylosowano dodawanie to pokaż znak '+'
if Dzialanie=1 then
     Znak3:= '-';                 //jeżeli wylosowano odejmowanie to pokaż znak '-'
if Dzialanie=2 then
     Znak3:= 'x';                //jeżeli wylosowano mnożenie to pokaż znak 'x'

                          //wyświetl działanie
Label6.Caption:= ('Ile jest: '+ IntToStr(Liczba1) + ' ' + znak1 + ' ' +IntToStr(Liczba2) + ' ' + znak2 + ' ' + IntToStr(Liczba3) + ' ' + znak3 + ' ' +IntToStr(Liczba4) + ' ?');

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



                         //gdy naciśniesz przycisk Sprawdź
procedure TForm1.Button2Click(Sender: TObject);
   Label KONIEC; //Etykieta do przechodzenia w inne miejsca kodu
      var
          Odp: String;     //zmienna przechowująca naszą odpowiedź

Zakupy: