Strony

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

begin
     Odp:= Edit1.Text; //odczytaj podaną odpowiedź i przypisz ją do zmiennej
 if Odp='' then //gdy nie podano odpowiedzi monituj o wpisaniu wyniku
       begin
          ShowMessage('Wpisz najpierw wynik');    //wyświetl komunikat informujący
           Edit1.SetFocus;   //ustaw focus w Polu do Odpowiedzi
          goto KONIEC;     //pomiń poniższy kod i przejdź od razu na koniec procedury
      end;

if Odp=(IntToStr(WYNIK)) then     //jeżeli odpowiedź jest poprawna to ...
    begin
       ShowMessage('Bardzo dobrze!'); //wyświetl komunikat o poprawnej odpowiedzi
       Label6.Caption:= 'Ile jest:'; //wyczyść działanie
       Poprawne:=Poprawne + 1; //dodaj punkt do poprawnych odpowiedzi
   end           //bez średnika

else            //w przeciwnym wypadku ...

begin
    ShowMessage('Niestety źle'); //wyświetl komunikat o złej odpowiedzi
    Niepoprawne:=Niepoprawne + 1; //dodaj punkt do niepoprawnych odpowiedzi
end;

Edit1.Clear;              //wyczyść pole do podawania Odpowiedzi)
Edit1.SetFocus;       //ustaw focus w Polu do Odpowiedzi

Label4.Caption:= IntToStr(Poprawne);         //wyświetl ilość poprawnych odpowiedzi
Label5.Caption:= IntToStr(Niepoprawne);    //wyświetl ilość niepoprawnych odpowiedzi

KONIEC: //etykieta do której przechodzi kod, gdy ktoś nie wpisze żadnej liczby
end;
end.



Komentarz:

     W tej części pomijamy te elementy wraz z komentarzem, które zostały już opisane w poprzedniej wersji. Omówimy tylko te elementy, które się zmieniają.


Gdy naciśniemy przycisk START


     Najważniejszą zmianą, jaką wprowadzamy to ilość liczb. Zamiast dwóch, mamy je teraz cztery. Sytuacja generalnie jednak nie zmienia się: wartość każdej z nich wyznaczamy losowo z przedziału od 0 do 20 za pomocą instrukcji Random(21). Nie zmienia się także procedura wyznaczająca znak działania, musimy ją tylko zastosować trzy razy, ponieważ tyle znaków będziemy potrzebować na obsługę czterech liczb. Każdy znak działania przypisujemy do innej zmiennej tekstowej (Znak1, Znak2, Znak3), dzięki czemu całe działanie będziemy mogli wyświetlić na etykiecie Label6.

     Procedura dla przycisku „Sprawdź” nie zmienia się, gdyż w dalszym ciągu będzie ona sprawdzała wpisany przez nas wynik działania, bez względu na to, jakie działanie wygeneruje procedura przycisku START.

      W następnym przykładzie ożywimy nieco nasz program i sprawimy, że przemówi on do nas ludzkim głosem.



                              Strona    1/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