Wyjście Spis treści Poprzedni Następny
Prezentowane materiały są przeznaczone dla uczniów szkół ponadgimnazjalnych. Autor: mgr Jerzy Wałaszek, wersja 3.0 |
©2008 mgr
Jerzy Wałaszek |
W tym rozdziale: | Podrozdziały: |
Prezentowane poniżej programy utworzono w następujących środowiskach programowania:
Jeśli stosujesz inne środowiska, to prawdopodobnie będziesz musiał przetworzyć odpowiednio kod programów.
Na podstawie opisanego algorytmu tworzymy program w języku Pascal. Poniżej przedstawiamy przykładowe zrzuty zawartości okienka konsoli oraz kod źródłowy programu.
Strona tytułowa gry |
Przykładowa rozgrywka |
---|
// G R A W P I Ę T N A S T K Ę // WERSJA FUNKCYJNA //-------------------------------------------- // (C)2004 mgr Jerzy Wałaszek I LO w Tarnowie program Gra15; uses Crt; //---------------------------------------------------- // PROCEDURY I FUNKCJE POMOCNICZE //---------------------------------------------------- // Funkcja PL konwertuje tekst ze standardu Windows 1250 // na standard konsoli znakowej Latin II //------------------------------------------------------ function PL(s : string) : string; var i : integer; c : char; begin for i := 1 to length(s) do begin case s[i] of 'ą' : c := #165; 'ć' : c := #134; 'ę' : c := #169; 'ł' : c := #136; 'ń' : c := #228; 'ó' : c := #162; 'ś' : c := #152; 'ż' : c := #190; 'ź' : c := #171; 'Ą' : c := #164; 'Ć' : c := #143; 'Ę' : c := #168; 'Ł' : c := #157; 'Ń' : c := #227; 'Ó' : c := #224; 'Ś' : c := #151; 'Ż' : c := #189; 'Ź' : c := #141; else c := s[i]; end; s[i] := c; end; Result := s; end; // Procedura centruje w bieżącym wierszu // tekst podany jako parametr //---------------------------------------------------- procedure Centruj(t : string); begin GotoXY(1 + (80-length(t)) div 2, WhereY); writeln(t); end; // Procedura rysuje pojedynczą ramkę ze znaków // tabelek. Parametry określają współrzędne // lewego górnego i prawego dolnego narożnika //---------------------------------------------------- procedure Ramka(xp,yp,xk,yk : integer); var i : integer; begin GotoXY(xp,yp); write(#218); GotoXY(xp,yk); write(#192); GotoXY(xk,yp); write(#191); GotoXY(xk,yk); write(#217); for i := xp + 1 to xk - 1 do begin GotoXY(i,yp); write(#196); GotoXY(i,yk); write(#196); end; for i := yp + 1 to yk - 1 do begin GotoXY(xp,i); write(#179); GotoXY(xk,i); write(#179); end; end; //------------------------------------------------------ // PROGRAM GRY //------------------------------------------------------ const cplansza : string[16] = 'ABCDEFGHIJKLMNO '; var plansza : string[16]; // przechowuje planszę gry // Procedura wyświetla stronę tytułową, czeka na dowolny // klawisz i czyści ekran //------------------------------------------------------ procedure StronaTytulowa; begin TextAttr := $07; ClrScr; GotoXY(1,4); TextAttr := $8f; Centruj(PL(' ')); Centruj(PL(' G R A W P I Ę T N A S T K Ę ')); Centruj(PL(' ============================= ')); Centruj(PL(' ')); TextAttr := $1b; Centruj(PL(' ')); Centruj(PL(' (C)2004 mgr Jerzy Wałaszek ')); Centruj(PL(' ')); TextAttr := $e4; Centruj(PL(' ')); Centruj(PL(' I Liceum Ogólnokształcące ')); Centruj(PL(' im. Kazimierza Brodzińskiego ')); Centruj(PL(' w Tarnowie ')); Centruj(PL(' ')); TextAttr := $f1; Centruj(PL(' ')); Centruj(PL(' Czy potrafisz logicznie myśleć ? ')); Centruj(PL(' ')); TextAttr := $f4; Centruj(PL(' Gdy będziesz gotowy, ')); Centruj(PL(' naciśnij dowolny klawisz ')); Centruj(PL(' ')); TextAttr := $0a; Ramka(23,3,58,22); while ReadKey = #0 do; // Oczekiwanie na dowolny klawisz TextAttr := $07; ClrScr; end; // Procedura wyświetla planszę //------------------------------------------------------ procedure WyswietlPlansze; var k,w,i,j : integer; begin for i := 1 to 16 do begin if plansza[i] = ' ' then // określamy kolor segmentu TextAttr := $00 else begin if plansza[i] = cplansza[i] then TextAttr := $2f else TextAttr := $e4; end; k := 33 + 4*((i - 1) mod 4); // wyznaczamy położenie segmentu w := 6 + 4*((i - 1) div 4); // w oknie konsoli for j := 0 to 2 do // wyświetlamy segment begin GotoXY(k,w + j); if j = 1 then write(' ',plansza[i],' ') else write(' '); end; end; TextAttr := $1b; Ramka(31,4,49,22); end; // Procedura znajduje puste miejsce i ustawia zmienne // przekazane jej jako parametry: // p - pozycja pustego miejsca w zmiennej plansza // x,y - pozycja pustego miejsca na planszy gry //------------------------------------------------------ procedure Oblicz_pxy(var p,x,y : integer); begin p := Pos(' ',plansza); // znajdujemy pozycję pustego miejsca x := 1 + (p - 1) mod 4; // obliczamy współrzędne na planszy y := 1 + (p - 1) div 4; end; // Procedura przesuwa segment w prawo, o ile to jest // możliwe. Jeśli nie, segment nie jest przesuwany. //------------------------------------------------------ procedure Segment_w_prawo; var p,x,y : integer; begin Oblicz_pxy(p,x,y); if x > 1 then begin plansza[p] := plansza[p - 1]; plansza[p - 1] := ' '; end; end; // Procedura przesuwa segment w lewo, o ile to jest // możliwe. Jeśli nie, segment nie jest przesuwany. //------------------------------------------------------ procedure Segment_w_lewo; var p,x,y : integer; begin Oblicz_pxy(p,x,y); if x < 4 then begin plansza[p] := plansza[p + 1]; plansza[p + 1] := ' '; end; end; // Procedura przesuwa segment w górę, o ile to jest // możliwe. Jeśli nie, segment nie jest przesuwany. //------------------------------------------------------ procedure Segment_w_gore; var p,x,y : integer; begin Oblicz_pxy(p,x,y); if y < 4 then begin plansza[p] := plansza[p + 4]; plansza[p + 4] := ' '; end; end; // Procedura przesuwa segment w dół, o ile to jest // możliwe. Jeśli nie, segment nie jest przesuwany. //------------------------------------------------------ procedure Segment_w_dol; var p,x,y : integer; begin Oblicz_pxy(p,x,y); if y > 1 then begin plansza[p] := plansza[p - 4]; plansza[p - 4] := ' '; end; end; // Procedura tworzy planszę dla gry //------------------------------------------------------ procedure GenerujPlansze; var i : integer; begin plansza := cplansza; for i := 1 to 1000 do case random(4) of 0 : Segment_w_prawo; 1 : Segment_w_lewo; 2 : Segment_w_gore; 3 : Segment_w_dol; end; WyswietlPlansze; end; // Procedura wykonuje ruch na planszy //------------------------------------------------------ procedure WykonajRuch; var c : char; begin repeat c := ReadKey; until c <> #0; case c of #75 : Segment_w_lewo; //strzałka w lewo #77 : Segment_w_prawo; //strzałka w prawo #72 : Segment_w_gore; //strzałka w górę #80 : Segment_w_dol; //strzałka w dół end; WyswietlPlansze; end; // Funkcja sprawdza, czy segmenty są ułożone //------------------------------------------------------ function Ulozone : boolean; begin if plansza = cplansza then begin TextAttr := $0c; GotoXY(1,2); Centruj('G R A T U L A C J E'); Result := true; end else Result := false; end; // Funkcja sprawdza, czy gracz chce zakończyć grę //------------------------------------------------------ function Koniec : boolean; begin GotoXY(1,24); TextAttr := $0f; Centruj('Jeszcze raz ? [T] = Tak, [Inny] = Nie'); Result := UpCase(ReadKey) <> 'T'; end; var a : integer; begin Randomize; a := TextAttr; CursorOff; repeat StronaTytulowa; GenerujPlansze; repeat WykonajRuch; until Ulozone; until Koniec; TextAttr := a; CursorOn; ClrScr; end. |
Wersja obiektowa prawie niczym nie musi się różnić od wersji funkcyjnej. W sumie obiekty też tworzymy często metodą zstępującą. Zaletą programowania obiektowego jest mocniejsze powiązanie danych z operującymi na nich procedurami. Zwróć uwagę, iż obiekt ukrywa swoją implementację udostępniając na zewnątrz jedynie najistotniejsze procedury. Zasada taka nosi nazwę enkapsulacji (zawarcia w pigułce) - aby oglądać telewizor wystarczy znać funkcje klawiszy na odbiorniku. Nie jest nam potrzebna wiedza, co w środku odbiornika się właściwie dzieje, gdy dany klawisz zostaje naciśnięty.
// G R A W P I Ę T N A S T K Ę // WERSJA OBIEKTOWA //-------------------------------------------- // (C)2004 mgr Jerzy Wałaszek I LO w Tarnowie program Gra15; uses Crt; //---------------------------------------------------- // PROCEDURY I FUNKCJE POMOCNICZE //---------------------------------------------------- // Funkcja PL konwertuje tekst ze standardu Windows 1250 // na standard konsoli znakowej Latin II //------------------------------------------------------ function PL(s : string) : string; var i : integer; c : char; begin for i := 1 to length(s) do begin case s[i] of 'ą' : c := #165; 'ć' : c := #134; 'ę' : c := #169; 'ł' : c := #136; 'ń' : c := #228; 'ó' : c := #162; 'ś' : c := #152; 'ż' : c := #190; 'ź' : c := #171; 'Ą' : c := #164; 'Ć' : c := #143; 'Ę' : c := #168; 'Ł' : c := #157; 'Ń' : c := #227; 'Ó' : c := #224; 'Ś' : c := #151; 'Ż' : c := #189; 'Ź' : c := #141; else c := s[i]; end; s[i] := c; end; Result := s; end; // Procedura centruje w bieżącym wierszu // tekst podany jako parametr //---------------------------------------------------- procedure Centruj(t : string); begin GotoXY(1 + (80-length(t)) div 2, WhereY); writeln(t); end; // Procedura rysuje pojedynczą ramkę ze znaków // tabelek. Parametry określają współrzędne // lewego górnego i prawego dolnego narożnika //---------------------------------------------------- procedure Ramka(xp,yp,xk,yk : integer); var i : integer; begin GotoXY(xp,yp); write(#218); GotoXY(xp,yk); write(#192); GotoXY(xk,yp); write(#191); GotoXY(xk,yk); write(#217); for i := xp + 1 to xk - 1 do begin GotoXY(i,yp); write(#196); GotoXY(i,yk); write(#196); end; for i := yp + 1 to yk - 1 do begin GotoXY(xp,i); write(#179); GotoXY(xk,i); write(#179); end; end; //------------------------------------------------------ // PROGRAM GRY //------------------------------------------------------ type TGra = class private cplansza : string[16]; plansza : string[16]; a : integer; procedure GenerujPlansze; function Koniec : boolean; procedure Oblicz_pxy(var p,x,y : integer); procedure Segment_w_dol; procedure Segment_w_gore; procedure Segment_w_lewo; procedure Segment_w_prawo; procedure StronaTytulowa; function Ulozone : boolean; procedure WykonajRuch; procedure WyswietlPlansze; public constructor Utworz; procedure Graj; procedure Zakoncz; end; //------------------------------------------------------ // Definicje metod obiektu gry //------------------------------------------------------ // Procedura wyświetla stronę tytułową, czeka na dowolny // klawisz i czyści ekran //------------------------------------------------------ procedure TGra.StronaTytulowa; begin TextAttr := $07; ClrScr; GotoXY(1,4); TextAttr := $8f; Centruj(PL(' ')); Centruj(PL(' G R A W P I Ę T N A S T K Ę ')); Centruj(PL(' ============================= ')); Centruj(PL(' ')); TextAttr := $1b; Centruj(PL(' ')); Centruj(PL(' (C)2004 mgr Jerzy Wałaszek ')); Centruj(PL(' ')); TextAttr := $e4; Centruj(PL(' ')); Centruj(PL(' I Liceum Ogólnokształcące ')); Centruj(PL(' im. Kazimierza Brodzińskiego ')); Centruj(PL(' w Tarnowie ')); Centruj(PL(' ')); TextAttr := $f1; Centruj(PL(' ')); Centruj(PL(' Czy potrafisz logicznie myśleć ? ')); Centruj(PL(' ')); TextAttr := $f4; Centruj(PL(' Gdy będziesz gotowy, ')); Centruj(PL(' naciśnij dowolny klawisz ')); Centruj(PL(' ')); TextAttr := $0a; Ramka(23,3,58,22); while ReadKey = #0 do; // Oczekiwanie na dowolny klawisz TextAttr := $07; ClrScr; end; // Procedura wyświetla planszę //------------------------------------------------------ procedure TGra.WyswietlPlansze; var k,w,i,j : integer; begin for i := 1 to 16 do begin if plansza[i] = ' ' then // określamy kolor segmentu TextAttr := $00 else begin if plansza[i] = cplansza[i] then TextAttr := $2f else TextAttr := $e4; end; k := 33 + 4*((i - 1) mod 4); // wyznaczamy położenie segmentu w := 6 + 4*((i - 1) div 4); // w oknie konsoli for j := 0 to 2 do // wyświetlamy segment begin GotoXY(k,w + j); if j = 1 then write(' ',plansza[i],' ') else write(' '); end; end; TextAttr := $1b; Ramka(31,4,49,22); end; // Procedura znajduje puste miejsce i ustawia zmienne // przekazane jej jako parametry: // p - pozycja pustego miejsca w zmiennej plansza // x,y - pozycja pustego miejsca na planszy gry //------------------------------------------------------ procedure TGra.Oblicz_pxy(var p,x,y : integer); begin p := Pos(' ',plansza); // znajdujemy pozycję pustego miejsca x := 1 + (p - 1) mod 4; // obliczamy współrzędne na planszy y := 1 + (p - 1) div 4; end; // Procedura przesuwa segment w prawo, o ile to jest // możliwe. Jeśli nie, segment nie jest przesuwany. //------------------------------------------------------ procedure TGra.Segment_w_prawo; var p,x,y : integer; begin Oblicz_pxy(p,x,y); if x > 1 then begin plansza[p] := plansza[p - 1]; plansza[p - 1] := ' '; end; end; // Procedura przesuwa segment w lewo, o ile to jest // możliwe. Jeśli nie, segment nie jest przesuwany. //------------------------------------------------------ procedure TGra.Segment_w_lewo; var p,x,y : integer; begin Oblicz_pxy(p,x,y); if x < 4 then begin plansza[p] := plansza[p + 1]; plansza[p + 1] := ' '; end; end; // Procedura przesuwa segment w górę, o ile to jest // możliwe. Jeśli nie, segment nie jest przesuwany. //------------------------------------------------------ procedure TGra.Segment_w_gore; var p,x,y : integer; begin Oblicz_pxy(p,x,y); if y < 4 then begin plansza[p] := plansza[p + 4]; plansza[p + 4] := ' '; end; end; // Procedura przesuwa segment w dół, o ile to jest // możliwe. Jeśli nie, segment nie jest przesuwany. //------------------------------------------------------ procedure TGra.Segment_w_dol; var p,x,y : integer; begin Oblicz_pxy(p,x,y); if y > 1 then begin plansza[p] := plansza[p - 4]; plansza[p - 4] := ' '; end; end; // Procedura tworzy planszę dla gry //------------------------------------------------------ procedure TGra.GenerujPlansze; var i : integer; begin plansza := cplansza; for i := 1 to 1000 do case random(4) of 0 : Segment_w_prawo; 1 : Segment_w_lewo; 2 : Segment_w_gore; 3 : Segment_w_dol; end; WyswietlPlansze; end; // Procedura wykonuje ruch na planszy //------------------------------------------------------ procedure TGra.WykonajRuch; var c : char; begin repeat c := ReadKey; until c <> #0; case c of #75 : Segment_w_lewo; //strzałka w lewo #77 : Segment_w_prawo; //strzałka w prawo #72 : Segment_w_gore; //strzałka w górę #80 : Segment_w_dol; //strzałka w dół end; WyswietlPlansze; end; // Funkcja sprawdza, czy segmenty są ułożone //------------------------------------------------------ function TGra.Ulozone : boolean; begin if plansza = cplansza then begin TextAttr := $0c; GotoXY(1,2); Centruj('G R A T U L A C J E'); Result := true; end else Result := false; end; // Funkcja sprawdza, czy gracz chce zakończyć grę //------------------------------------------------------ function TGra.Koniec : boolean; begin GotoXY(1,24); TextAttr := $0f; Centruj('Jeszcze raz ? [T] = Tak, [Inny] = Nie'); Result := UpCase(ReadKey) <> 'T'; end; constructor TGra.Utworz; begin Randomize; a := TextAttr; CursorOff; cplansza := 'ABCDEFGHIJKLMNO '; end; procedure TGra.Graj; begin repeat StronaTytulowa; GenerujPlansze; repeat WykonajRuch; until Ulozone; until Koniec; end; procedure TGra.Zakoncz; begin TextAttr := a; CursorOn; ClrScr; end; //------------------------------------------------------ // Program główny //------------------------------------------------------ var Gra : TGra; begin Gra := TGra.Utworz; Gra.Graj; Gra.Zakoncz; end. |
Program uruchomiono w środowisku Dev-C++.
// G R A W P I Ę T N A S T K Ę //-------------------------------------------- // (C)2004 mgr Jerzy Wałaszek I LO w Tarnowie #include <conio.h> #include <windows.h> #include <strings.h> #include <iostream> using namespace std; //---------------------------------------------------- // Deklaracja klasy gry //---------------------------------------------------- class TGra { string cplansza,plansza; void GenerujPlansze(); int Koniec(); void Oblicz_pxy(int * p, int * x, int * y); void Segment_w_dol(); void Segment_w_gore(); void Segment_w_lewo(); void Segment_w_prawo(); void StronaTytulowa(); int Ulozone(); void WykonajRuch(); void WyswietlPlansze(); public: TGra(); ~TGra(); void Graj(); }; //---------------------------------------------------- // PROCEDURY I FUNKCJE POMOCNICZE //---------------------------------------------------- const int BLACK = 0; const int BLUE = 1; const int GREEN = 2; const int CYAN = 3; const int RED = 4; const int MAGENTA = 5; const int BROWN = 6; const int LIGHTGRAY = 7; const int DARKGRAY = 8; const int LIGHTBLUE = 9; const int LIGHTGREEN = 10; const int LIGHTCYAN = 11; const int LIGHTRED = 12; const int LIGHTMAGENTA = 13; const int YELLOW = 14; const int WHITE = 15; static int __BACKGROUND = BLACK; static int __FOREGROUND = LIGHTGRAY; // Procedura ustawia pozycję wydruku w oknie konsoli //---------------------------------------------------- void gotoxy(int x, int y) { COORD c; c.X = x - 1; c.Y = y - 1; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c); } // Procedura ustawia kolor tła wydruku //---------------------------------------------------- void textbackground(int color) { __BACKGROUND = color; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), __FOREGROUND + (color << 4)); } // Procedura ustawia kolor tekstu //---------------------------------------------------- void textcolor(int color) { __FOREGROUND = color; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color + (__BACKGROUND << 4)); } // Procedura ustawia atrybuty koloru tekstu i tła //---------------------------------------------------- void textattr(int _attr) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), _attr); } // Funkcja zwraca aktualną pozycję x kursora //---------------------------------------------------- int wherex() { CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info); return info.dwCursorPosition.X + 1; } // Funkcja zwraca aktualną pozycję y kursora //---------------------------------------------------- int wherey() { CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info); return info.dwCursorPosition.Y + 1; } // Procedura czyści zawartość okna konsoli //---------------------------------------------------- void clrscr() { DWORD written; FillConsoleOutputAttribute(GetStdHandle (STD_OUTPUT_HANDLE), __FOREGROUND + (__BACKGROUND << 4), 2000, (COORD){0, 0}, &written); FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), ' ', 2000, (COORD){0, 0}, &written); gotoxy(1, 1); } // Procedura ukrywa kursor okienka konsoli //------------------------------------------------------ void CursorOff() { CONSOLE_CURSOR_INFO Info; GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &Info); Info.bVisible = 0; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &Info); }; // Procedura przywraca kursor okienka konsoli //------------------------------------------------------ void CursorOn() { CONSOLE_CURSOR_INFO Info; GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &Info); Info.bVisible = -1; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &Info); }; // Funkcja PL konwertuje tekst ze standardu Windows 1250 // na standard konsoli znakowej Latin II //------------------------------------------------------ string PL(string s) { int i; char c; for(i = 0; i < s.length(); i++) { switch(s[i]) { case 'ą' : c = char(165); break; case 'ć' : c = char(134); break; case 'ę' : c = char(169); break; case 'ł' : c = char(136); break; case 'ń' : c = char(228); break; case 'ó' : c = char(162); break; case 'ś' : c = char(152); break; case 'ż' : c = char(190); break; case 'ź' : c = char(171); break; case 'Ą' : c = char(164); break; case 'Ć' : c = char(143); break; case 'Ę' : c = char(168); break; case 'Ł' : c = char(157); break; case 'Ń' : c = char(227); break; case 'Ó' : c = char(224); break; case 'Ś' : c = char(151); break; case 'Ż' : c = char(189); break; case 'Ź' : c = char(141); break; default: c = s[i]; }; s[i] = c; }; return(s); } // Procedura centruje w bieżącym wierszu // tekst podany jako parametr //---------------------------------------------------- void Centruj(string t) { gotoxy(1 + (80 - t.length()) / 2, wherey()); cout << t << endl; } // Procedura rysuje pojedynczą ramkę ze znaków // tabelek. Parametry określają współrzędne // lewego górnego i prawego dolnego narożnika //---------------------------------------------------- void Ramka(int xp,int yp,int xk,int yk) { int i; gotoxy(xp,yp); putch(char(218)); gotoxy(xp,yk); putch(char(192)); gotoxy(xk,yp); putch(char(191)); gotoxy(xk,yk); putch(char(217)); for(i = xp + 1; i <= xk - 1; i++) { gotoxy(i,yp); putch(char(196)); gotoxy(i,yk); putch(char(196)); }; for(i = yp + 1; i <= yk - 1; i++) { gotoxy(xp,i); putch(char(179)); gotoxy(xk,i); putch(char(179)); }; } //---------------------------------------------------- // Definicje metod klasy gry //---------------------------------------------------- // Procedura wyświetla stronę tytułową, czeka na dowolny // klawisz i czyści ekran //------------------------------------------------------ void TGra::StronaTytulowa() { textbackground(0); clrscr(); gotoxy(1,4); textattr(0x8f); Centruj(PL(" ")); Centruj(PL(" G R A W P I Ę T N A S T K Ę ")); Centruj(PL(" ============================= ")); Centruj(PL(" ")); textattr(0x1b); Centruj(PL(" ")); Centruj(PL(" (C)2004 mgr Jerzy Wałaszek ")); Centruj(PL(" ")); textattr(0xe4); Centruj(PL(" ")); Centruj(PL(" I Liceum Ogólnokształcące ")); Centruj(PL(" im. Kazimierza Brodzińskiego ")); Centruj(PL(" w Tarnowie ")); Centruj(PL(" ")); textattr(0xf1); Centruj(PL(" ")); Centruj(PL(" Czy potrafisz logicznie myśleć ? ")); Centruj(PL(" ")); textattr(0xf4); Centruj(PL(" Gdy będziesz gotowy, ")); Centruj(PL(" naciśnij dowolny klawisz ")); Centruj(PL(" ")); textattr(0x0a); Ramka(23,3,58,22); while(getch() == 0); // Oczekiwanie na dowolny klawisz textattr(0x07); clrscr(); } // Procedura wyświetla planszę //------------------------------------------------------ void TGra::WyswietlPlansze() { int k,w,i,j; for(i = 1; i <= 16; i++) { if(plansza[i] == ' ') // określamy kolor segmentu textattr(0x00); else { if(plansza[i] == cplansza[i]) textattr(0x2f); else textattr(0xe4); }; k = 33 + 4 * ((i - 1) % 4); // wyznaczamy położenie segmentu w = 6 + 4 * ((i - 1) / 4); // w oknie konsoli for(j = 0; j <= 2; j++) // wyświetlamy segment { gotoxy(k,w + j); if(j == 1) cout << " " << plansza[i] << " "; else cout << " "; }; }; textattr(0x1b); Ramka(31,4,49,22); } // Procedura znajduje puste miejsce i ustawia zmienne // przekazane jej jako parametry: // p - pozycja pustego miejsca w zmiennej plansza // x,y - pozycja pustego miejsca na planszy gry //------------------------------------------------------ void TGra::Oblicz_pxy(int * p, int * x, int * y) { int i; for(i = 1; plansza[i] != ' '; i++); * p = i; // znajdujemy pozycję pustego miejsca * x = 1 + (* p - 1) % 4; // obliczamy współrzędne na planszy * y = 1 + (* p - 1) / 4; } // Procedura przesuwa segment w prawo, o ile to jest // możliwe. Jeśli nie, segment nie jest przesuwany. //------------------------------------------------------ void TGra::Segment_w_prawo() { int p,x,y; Oblicz_pxy(&p,&x,&y); if(x > 1) { plansza[p] = plansza[p - 1]; plansza[p - 1] = ' '; }; } // Procedura przesuwa segment w lewo, o ile to jest // możliwe. Jeśli nie, segment nie jest przesuwany. //------------------------------------------------------ void TGra::Segment_w_lewo() { int p,x,y; Oblicz_pxy(&p,&x,&y); if(x < 4) { plansza[p] = plansza[p + 1]; plansza[p + 1] = ' '; }; } // Procedura przesuwa segment w górę, o ile to jest // możliwe. Jeśli nie, segment nie jest przesuwany. //------------------------------------------------------ void TGra::Segment_w_gore() { int p,x,y; Oblicz_pxy(&p,&x,&y); if(y < 4) { plansza[p] = plansza[p + 4]; plansza[p + 4] = ' '; }; } // Procedura przesuwa segment w dół, o ile to jest // możliwe. Jeśli nie, segment nie jest przesuwany. //------------------------------------------------------ void TGra::Segment_w_dol() { int p,x,y; Oblicz_pxy(&p,&x,&y); if(y > 1) { plansza[p] = plansza[p - 4]; plansza[p - 4] = ' '; }; } // Procedura tworzy planszę dla gry //------------------------------------------------------ void TGra::GenerujPlansze() { int i; plansza = cplansza; for(i = 1; i <= 1000; i++) switch(rand() % 4) { case 0 : Segment_w_prawo(); break; case 1 : Segment_w_lewo(); break; case 2 : Segment_w_gore(); break; case 3 : Segment_w_dol(); break; }; WyswietlPlansze(); } // Procedura wykonuje ruch na planszy //------------------------------------------------------ void TGra::WykonajRuch() { char c; while((c = getch()) == '\0') ; switch(c) { case char(75) : Segment_w_lewo(); break; case char(77) : Segment_w_prawo(); break; case char(72) : Segment_w_gore(); break; case char(80) : Segment_w_dol(); break; }; WyswietlPlansze(); } // Funkcja sprawdza, czy segmenty są ułożone //------------------------------------------------------ int TGra::Ulozone() { if(plansza == cplansza) { textattr(0x0c); gotoxy(1,2); Centruj("G R A T U L A C J E"); return(true); } else return(false); } // Funkcja sprawdza, czy gracz chce zakończyć grę //------------------------------------------------------ int TGra::Koniec() { gotoxy(1,24); textattr(0x0f); Centruj("Jeszcze raz ? [T] = Tak, [Inny] = Nie"); return(toupper(getch()) != 'T'); } TGra::TGra() // konstruktor { srand((unsigned)time(NULL)); CursorOff(); cplansza = "?ABCDEFGHIJKLMNO "; } TGra::~TGra() // destruktor { CursorOn(); clrscr(); } void TGra::Graj() { do { StronaTytulowa(); GenerujPlansze(); do { WykonajRuch(); } while(!Ulozone()); } while(!Koniec()); } //------------------------------------------------------ // Program główny //------------------------------------------------------ int main() { TGra Gra; Gra.Graj(); return 0; } |
I Liceum Ogólnokształcące |
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe