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.
Plansza tytułowa gry |
Przykładowa rozgrywka |
---|
// M A S T E R M I N D // WERSJA PROCEDURALNA //-------------------------------------------- // (C)2004 mgr Jerzy Wałaszek I LO w Tarnowie program mastermind; 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 //---------------------------------------------------- // Zmienne globalne dla procedur programu //---------------------------------------------------- var z,t : array[0..3] of integer; runda : integer; // Procedura wyświetla planszę tytułową gry //---------------------------------------------------- procedure Tytul; begin TextAttr := $07; ClrScr; GotoXY(1,3); TextAttr := $3b; Centruj(PL(' ')); Centruj(PL(' GRA INTELEKTU ---------------- ')); Centruj(PL(' -------------------MASTER MIND ')); Centruj(PL(' ')); TextAttr := $1f; Centruj(PL(' ')); Centruj(PL(' (C)2004 mgr Jerzy Wałaszek ')); Centruj(PL(' ')); TextAttr := $2e; Centruj(PL(' ')); Centruj(PL(' I Liceum Ogólnokształcące ')); Centruj(PL(' im. Kazimierza Brodzińskiego ')); Centruj(PL(' w Tarnowie ')); Centruj(PL(' ')); TextAttr := $f0; Centruj(PL(' ')); Centruj(PL(' Odgadnij w sześciu kolejkach ')); Centruj(PL(' kod koloru wylosowany przez ')); Centruj(PL(' komputer z 6 różnych barw. ')); Centruj(PL(' ')); TextAttr := $f4; Centruj(PL(' Gdy będziesz gotowy, ')); Centruj(PL(' naciśnij dowolny klawisz ')); Centruj(PL(' ')); TextAttr := $0e; Ramka(23,2,58,23); while ReadKey = #0 do; // Oczekiwanie na dowolny klawisz TextAttr := $07; ClrScr; end; // Procedura losuje kod kolorów z //---------------------------------------------------- procedure Losuj_z; var i : integer; begin for i := 0 to 3 do z[i] := random(6); end; // Procedura drukuje nagłówek gry - nazwę oraz // pierwszy wiersz z zakrytym kodem komputera //---------------------------------------------------- procedure Naglowek; begin TextAttr := $4e; Centruj(' MASTER MIND '); TextAttr := $87; Centruj(' '); Centruj(' ? ? ? ? '); Centruj(' '); end; // Procedura wyświetla w podanym wierszu y zawartość // tablicy t lub z. Jeśli parametr kursor jest równy // true, to wokół pozycji kodu nr x rysowana jest ramka //---------------------------------------------------- procedure Wyswietl(var tz : array of integer; x,y : integer; kursor : boolean); const kolory : array[0..5] of integer = (Black,LightBlue,LightGreen,LightRed,LightMagenta,Yellow); var i : integer; begin TextAttr := $87; GotoXY(1,y); Centruj(' '); GotoXY(31,WhereY); write(runda : 2, ': '); for i := 0 to 3 do begin TextAttr := $80 + kolory[tz[i]]; write(#219' '); end; writeln(' '); TextAttr := $80; Centruj('____________________'); if kursor then begin TextAttr := $84; Ramka(34 + 2 * x, y, 36 + 2 * x, y + 2); end; end; // Procedura odczytuje kod kolorów gracza i umieszcza // go w tablicy t //---------------------------------------------------- procedure Czytaj_t; var x,y,i : integer; c : char; begin y := WhereY; // zapamiętujemy pozycję w pionie for i := 0 to 3 do t[i] := 0; x := 0; repeat Wyswietl(t,x,y,true); repeat c := ReadKey; until c <> #0; Wyswietl(t,x,y,false); case c of #75 : x := (x + 3) mod 4; //strzałka w lewo #77 : x := (x + 1) mod 4; //strzałka w prawo #72 : t[x] := (t[x] + 1) mod 6; //strzałka w górę #80 : t[x] := (t[x] + 5) mod 6; //strzałka w dół end; until c = #13; // klawisz Enter GotoXY(1,y); end; // Procedura ocenia kod wprowadzony przez gracza //---------------------------------------------------- procedure Ocen_t; var kz,kt : array[0..3] of integer; czarne,biale,i,j : integer; begin kz := z; kt := t; czarne := 0; for i := 0 to 3 do if kt[i] = kz[i] then begin inc(czarne); kz[i] := -1; kt[i] := -2; end; biale := 0; for i := 0 to 3 do for j := 0 to 3 do if kt[i] = kz[j] then begin inc(biale); kz[j] := -1; kt[i] := -2; break; end; GotoXY(43,WhereY + 1); TextAttr := $80; for i := 1 to czarne do write('* '); TextAttr := $8f; for i := 1 to biale do write('* '); writeln; writeln; end; // Funkcja sprawdza, czy t jest równe z //---------------------------------------------------- function t_rowne_z : boolean; var test : boolean; i : integer; begin test := true; for i := 0 to 3 do test := test and (t[i] = z[i]); Result := test; end; // Blok główny programu //---------------------------------------------------- var a : integer; begin Randomize; CursorOff; a := TextAttr; repeat Tytul; Losuj_z; runda := 1; Naglowek; repeat Czytaj_t; Ocen_t; if t_rowne_z then begin TextAttr := $0e; Centruj(PL('GRATULACJE - odgadłeś kod komputera!')); break; end; inc(runda); if runda > 6 then begin TextAttr := $0c; Centruj(PL('GRA SKOŃCZONA - nie odgadłeś kodu komputera!')); end; until runda > 6; TextColor(White); Centruj('Zagrasz jeszcze raz ? [T] = Tak, [inny] = Nie'); Wyswietl(z,0,2,false); GotoXY(32,3); write(' '); // usuwamy numer rundy until UpCase(ReadKey) <> 'T'; TextAttr := a; CursorOn; ClrScr; end. |
Gra Master Mind ma strukturę idealną dla projektu obiektowego. Stworzymy prostą hierarchię obiektów. Najpierw zaprojektujemy obiekt kodu komputera o następującej strukturze:
type TKod_z = class tz : array[0..3] of integer; constructor Create; procedure Inicjuj; procedure Wyswietl; procedure Oceniaj(var t : array of integer); end; |
Obiekt posiada metody:
Na podstawie obiektu TKod_z tworzymy
obiekt pochodny TKod_t obsługujący kod gracza.
TKod_t = class(TKod_z) public procedure Inicjuj(runda : integer); procedure Wyswietl(runda,kursor : integer); end; |
W nowym obiekcie pokrywamy metodę Inicjuj, która ma odczytać z klawiatury kod gracza i odpowiednio ustawić dziedziczoną tablicę tz oraz Wyswietl, która przyjmuje dodatkowy parametr sterujący widocznością i pozycją ramki kursora.
W dalszej kolejności tworzymy obiekt gry zawierający w sobie
utworzone wcześniej dwa obiekty:
TMasterMind = class private z : TKod_z; t : TKod_t; runda : integer; procedure Ocen_t; function t_rowne_z : boolean; function KoniecGry : boolean; public constructor Create; procedure StronaTytulowa; procedure Graj; function JeszczeRaz : boolean; end; |
Obiekt ten zawiera kolejno następujące składniki:
// M A S T E R M I N D // WERSJA OBIEKTOWA //-------------------------------------------- // (C)2004 mgr Jerzy Wałaszek I LO w Tarnowie program mastermind; 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 //------------------------------------------------------ // Deklaracje klas //****************************************************** type TKod_z = class tz : array[0..3] of integer; constructor Create; procedure Inicjuj; procedure Wyswietl; procedure Oceniaj(var t : array of integer); end; TKod_t = class(TKod_z) procedure Inicjuj(runda : integer); procedure Wyswietl(runda,kursor : integer); end; TMasterMind = class private z : TKod_z; t : TKod_t; runda : integer; procedure Ocen_t; function t_rowne_z : boolean; function KoniecGry : boolean; public constructor Create; procedure StronaTytulowa; procedure Graj; function JeszczeRaz : boolean; end; // Definicje metod klas //---------------------------------------------------- // Obiekt TKod_z //**************************************************** constructor TKod_z.Create; begin // standardowe działanie end; // Metoda losuje kod kolorów dla komputera i umieszcza // go w tablicy tz obiektu //------------------------------------------------------ procedure TKod_z.Inicjuj; var i : integer; begin for i := 0 to 3 do tz[i] := random(6); end; // Metoda wyświetla na bieżącej pozycji kolejne // kolory zawarte w kodzie tz. Kolory są wyświetlane // w postaci kolorowych prostokątów oddzielonych spacją. //------------------------------------------------------ procedure TKod_z.Wyswietl; const kolory : array[0..5] of integer = (Black,LightBlue,LightGreen,LightRed,LightMagenta,Yellow); var i : integer; begin for i := 0 to 3 do begin TextAttr := $80 + kolory[tz[i]]; write(#219' '); end; end; // Procedura porównuje podany jej w formie tablicy kod // z kodem w polu tz. Wynik jest wyświetlany na bieżącej // pozycji ekranu w postaci gwiazdek czarnych - zgodność // kolorów i pozycji oraz białych - zgodność kolorów //------------------------------------------------------ procedure TKod_z.Oceniaj(var t : array of integer); var kz,kt : array[0..3] of integer; czarne,biale,i,j : integer; begin kz := tz; kt := t; czarne := 0; for i := 0 to 3 do if kt[i] = kz[i] then begin inc(czarne); kz[i] := -1; kt[i] := -2; end; biale := 0; for i := 0 to 3 do for j := 0 to 3 do if kt[i] = kz[j] then begin inc(biale); kz[j] := -1; kt[i] := -2; break; end; TextAttr := $80; for i := 1 to czarne do write('* '); TextAttr := $8f; for i := 1 to biale do write('* '); end; // Obiekt TKod_t //*********************************************************** // Zmodyfikowana procedura wyświetlania kodu tz, // z której korzysta obiekt kodu gracza. Wyświetla // ona w bieżącym wierszu ekranu segment gry, który // oprócz kodu zawierać może dodatkowo kursor, czyli // prostokątną ramkę otaczającą kwadrat koloru na // pozycji kursor. Przed kodem koloru wyświetlony // zostaje numer rundy, który obiekt kodu gracza // otrzymuje z obiektu gry. //------------------------------------------------------ procedure TKod_t.Wyswietl(runda,kursor : integer); var y : integer; begin y := WhereY; // zapamiętujemy pozycję wydruku TextAttr := $87; GotoXY(1,y); Centruj(' '); GotoXY(31,WhereY); write(runda : 2, ': '); inherited Wyswietl; // do wyświetlenia kodu wykorzystujemy // odziedziczoną metodę writeln(' '); TextAttr := $80; Centruj('____________________'); if kursor >= 0 then begin TextAttr := $84; Ramka(34 + 2 * kursor, y, 36 + 2 * kursor, y + 2); end; GotoXY(1,y); // odtwarzamy pozycję wydruku end; // Procedura odczytuje kod koloru gracza. //------------------------------------------------------ procedure TKod_t.Inicjuj(runda : integer); var x,i : integer; c : char; begin for i := 0 to 3 do tz[i] := 0; x := 0; repeat Wyswietl(runda,x); repeat c := ReadKey; until c <> #0; Wyswietl(runda,-1); // to usunie kursor z ekranu case c of #75 : x := (x + 3) mod 4; //strzałka w lewo #77 : x := (x + 1) mod 4; //strzałka w prawo #72 : tz[x] := (tz[x] + 1) mod 6; //strzałka w górę #80 : tz[x] := (tz[x] + 5) mod 6; //strzałka w dół end; until c = #13; // klawisz Enter end; // Obiekt TMasterMind //************************************************************* // Metoda ocenia kod wprowadzony przez gracza. Wydruk // jest przemieszczany do następnego segmentu gry. //------------------------------------------------------ procedure TMasterMind.Ocen_t; begin GotoXY(43, WhereY + 1); // ustawiamy pozycję oceny z.Oceniaj(t.tz); // oceniamy kod gracza writeln; writeln; // przechodzimy do następnego segmentu end; // Metoda porównuje obiekty z i t. Zwraca true, jeśli // zawierają ten sam kod. //------------------------------------------------------ function TMasterMind.t_rowne_z : boolean; var test : boolean; i : integer; begin test := true; for i := 0 to 3 do test := test and (z.tz[i] = t.tz[i]); Result := test; end; // Metoda testuje warunek zakończenia gry. Jeśli gra się // kończy, wypisuje odpowiedni komunikat i zwraca true //------------------------------------------------------ function TMasterMind.KoniecGry : boolean; begin inc(runda); // zwiększamy numer rundy Result := false; // zakładamy, że gra się nie kończy if t_rowne_z then begin TextAttr := $0e; Centruj(PL('GRATULACJE - odgadłeś kod komputera!')); GotoXY(35,3); z.Wyswietl; // wyświetlamy kod komputera Result := true; end else if runda > 6 then begin TextAttr := $0c; Centruj(PL('GRA SKOŃCZONA - nie odgadłeś kodu komputera!')); GotoXY(35,3); z.Wyswietl; Result := true end; end; constructor TMasterMind.Create; begin z := TKod_z.Create; t := TKod_t.Create; end; // Metoda wyświetla stronę tytułową i czeka na // dowolny klawisz, po czym czyści ekran. //------------------------------------------------------ procedure TMasterMind.StronaTytulowa; begin TextAttr := $07; ClrScr; GotoXY(1,3); TextAttr := $3b; Centruj(PL(' ')); Centruj(PL(' GRA INTELEKTU ---------------- ')); Centruj(PL(' -------------------MASTER MIND ')); Centruj(PL(' ')); TextAttr := $1f; Centruj(PL(' ')); Centruj(PL(' (C)2004 mgr Jerzy Wałaszek ')); Centruj(PL(' ')); TextAttr := $2e; Centruj(PL(' ')); Centruj(PL(' I Liceum Ogólnokształcące ')); Centruj(PL(' im. Kazimierza Brodzińskiego ')); Centruj(PL(' w Tarnowie ')); Centruj(PL(' ')); TextAttr := $f0; Centruj(PL(' ')); Centruj(PL(' Odgadnij w sześciu kolejkach ')); Centruj(PL(' kod koloru wylosowany przez ')); Centruj(PL(' komputer z 6 różnych barw. ')); Centruj(PL(' ')); TextAttr := $f4; Centruj(PL(' Gdy będziesz gotowy, ')); Centruj(PL(' naciśnij dowolny klawisz ')); Centruj(PL(' ')); TextAttr := $0e; Ramka(23,2,58,23); while ReadKey = #0 do; // Oczekiwanie na dowolny klawisz TextAttr := $07; ClrScr; end; // Metoda odpowiedzialna za prowadzenie gry. //------------------------------------------------------ procedure TMasterMind.Graj; begin z.Inicjuj; runda := 1; TextAttr := $4e; Centruj(' MASTER MIND '); TextAttr := $87; Centruj(' '); Centruj(' ? ? ? ? '); Centruj(' '); repeat t.Inicjuj(runda); Ocen_t; until KoniecGry; end; // Metoda upewnia się, że gracz ma ochotę na jeszcze // jedną grę. Zwraca w atkim wypadku true. //------------------------------------------------------ function TMasterMind.JeszczeRaz : boolean; begin GotoXY(1,24); TextColor(White); Centruj('Zagrasz jeszcze raz ? [T] = Tak, [inny] = Nie'); Result := (UpCase(ReadKey) = 'T'); end; // Blok główny programu //-------------------------------------------------- var gra : TMasterMind; a : integer; begin a := TextAttr; CursorOff; Randomize; gra := TMasterMind.Create; with gra do repeat StronaTytulowa; Graj; until not JeszczeRaz; TextAttr := a; CursorOn; ClrScr; end. |
// M A S T E R M I N D //-------------------------------------------- // (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 TKod_z { public: int tz[4]; void Inicjuj(); void Wyswietl(); void Oceniaj(int t[]); }; class TKod_t : public TKod_z { public: void Inicjuj(int runda); void Wyswietl(int runda, int kursor); }; class TMasterMind { TKod_z z; TKod_t t; int runda; void Ocen_t(); int t_rowne_z(); int KoniecGry(); public: void StronaTytulowa(); void Graj(); int JeszczeRaz(); }; //---------------------------------------------------- // 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 //---------------------------------------------------- // Obiekt TKod_z //**************************************************** // Metoda losuje kod kolorów dla komputera i umieszcza // go w tablicy tz obiektu //------------------------------------------------------ void TKod_z::Inicjuj() { for(int i = 0; i <= 3; i++) tz[i] = rand() % 6; } // Metoda wyświetla na bieżącej pozycji kolejne // kolory zawarte w kodzie tz. Kolory są wyświetlane // w postaci kolorowych prostokątów oddzielonych spacją. //------------------------------------------------------ void TKod_z::Wyswietl() { const int kolory[6] = {BLACK,LIGHTBLUE,LIGHTGREEN,LIGHTRED,LIGHTMAGENTA,YELLOW}; for(int i = 0; i <= 3; i++) { textattr(0x80 + kolory[tz[i]]); cout << char(219) << ' '; }; } // Procedura porównuje podany jej w formie tablicy kod // z kodem w polu tz. Wynik jest wyświetlany na bieżącej // pozycji ekranu w postaci gwiazdek czarnych - zgodność // kolorów i pozycji oraz białych - zgodność kolorów //------------------------------------------------------ void TKod_z::Oceniaj(int t[]) { int kz[4],kt[4],czarne,biale,i,j; for(i = 0; i <= 3; i++) { kz[i] = tz[i]; kt[i] = t[i]; }; czarne = 0; for(i = 0; i <= 3; i++) if(kt[i] == kz[i]) { czarne++; kz[i] = -1; kt[i] = -2; }; biale = 0; for(i = 0; i <= 3; i++) for(j = 0; j <= 3; j++) if(kt[i] == kz[j]) { biale++; kz[j] = -1; kt[i] = -2; break; }; textattr(0x80); for(i = 1; i <= czarne; i++) cout << "* "; textattr(0x8f); for(i = 1; i <= biale; i++) cout << "* "; } // Obiekt TKod_t //*********************************************************** // Zmodyfikowana procedura wyświetlania kodu tz, // z której korzysta obiekt kodu gracza. Wyświetla // ona w bieżącym wierszu ekranu segment gry, który // oprócz kodu zawierać może dodatkowo kursor, czyli // prostokątną ramkę otaczającą kwadrat koloru na // pozycji kursor. Przed kodem koloru wyświetlony // zostaje numer rundy, który obiekt kodu gracza // otrzymuje z obiektu gry. //------------------------------------------------------ void TKod_t::Wyswietl(int runda, int kursor) { int y; y = wherey(); // zapamiętujemy pozycję wydruku textattr(0x87); gotoxy(1,y); Centruj(" "); gotoxy(31,wherey()); cout << " " << runda << ": "; TKod_z::Wyswietl(); // do wyświetlenia kodu wykorzystujemy // odziedziczoną metodę cout << " \n"; textattr(0x80); Centruj("____________________"); if(kursor >= 0) { textattr(0x84); Ramka(34 + 2 * kursor, y, 36 + 2 * kursor, y + 2); }; gotoxy(1,y); // odtwarzamy pozycję wydruku } // Procedura odczytuje kod koloru gracza. //------------------------------------------------------ void TKod_t::Inicjuj(int runda) { int x,i; char c; for(i = 0; i <= 3; i++) tz[i] = 0; x = 0; do { Wyswietl(runda,x); do { c = getch(); } while(c == '\0'); Wyswietl(runda,-1); // to usunie kursor z ekranu switch(c) { case char(75) : x = (x + 3) % 4; break; //strzałka w lewo case char(77) : x = (x + 1) % 4; break; //strzałka w prawo case char(72) : tz[x] = (tz[x] + 1) % 6; break; //strzałka w górę case char(80) : tz[x] = (tz[x] + 5) % 6; break; //strzałka w dół }; } while(int(c) != 13); // klawisz Enter } // Obiekt TMasterMind //************************************************************* // Metoda ocenia kod wprowadzony przez gracza. Wydruk // jest przemieszczany do następnego segmentu gry. //------------------------------------------------------ void TMasterMind::Ocen_t() { gotoxy(43, wherey() + 1); // ustawiamy pozycję oceny z.Oceniaj(t.tz); // oceniamy kod gracza cout << endl << endl; // przechodzimy do następnego segmentu } // Metoda porównuje obiekty z i t. Zwraca true, jeśli // zawierają ten sam kod. //------------------------------------------------------ int TMasterMind::t_rowne_z() { int test,i; test = true; for(i = 0; i <= 3; i++) test = test && (z.tz[i] == t.tz[i]); return(test); } // Metoda testuje warunek zakończenia gry. Jeśli gra się // kończy, wypisuje odpowiedni komunikat i zwraca true //------------------------------------------------------ int TMasterMind::KoniecGry() { runda++; // zwiększamy numer rundy if(t_rowne_z()) { textattr(0x0e); Centruj(PL("GRATULACJE - odgadłeś kod komputera!")); gotoxy(35,3); z.Wyswietl(); // wyświetlamy kod komputera return(true); } else if(runda > 6) { textattr(0x0c); Centruj(PL("GRA SKOŃCZONA - nie odgadłeś kodu komputera!")); gotoxy(35,3); z.Wyswietl(); return(true); }; return(false); } // Metoda wyświetla stronę tytułową i czeka na // dowolny klawisz, po czym czyści ekran. //------------------------------------------------------ void TMasterMind::StronaTytulowa() { textbackground(0); clrscr(); gotoxy(1,3); textattr(0x3b); Centruj(PL(" ")); Centruj(PL(" GRA INTELEKTU ---------------- ")); Centruj(PL(" -------------------MASTER MIND ")); Centruj(PL(" ")); textattr(0x1f); Centruj(PL(" ")); Centruj(PL(" (C)2004 mgr Jerzy Wałaszek ")); Centruj(PL(" ")); textattr(0x2e); Centruj(PL(" ")); Centruj(PL(" I Liceum Ogólnokształcące ")); Centruj(PL(" im. Kazimierza Brodzińskiego ")); Centruj(PL(" w Tarnowie ")); Centruj(PL(" ")); textattr(0xf0); Centruj(PL(" ")); Centruj(PL(" Odgadnij w sześciu kolejkach ")); Centruj(PL(" kod koloru wylosowany przez ")); Centruj(PL(" komputer z 6 różnych barw. ")); Centruj(PL(" ")); textattr(0xf4); Centruj(PL(" Gdy będziesz gotowy, ")); Centruj(PL(" naciśnij dowolny klawisz ")); Centruj(PL(" ")); textattr(0x0e); Ramka(23,2,58,23); while(getch() == '\0') ; // Oczekiwanie na dowolny klawisz textattr(0x07); clrscr(); } // Metoda odpowiedzialna za prowadzenie gry. //------------------------------------------------------ void TMasterMind::Graj() { z.Inicjuj(); runda = 1; textattr(0x4e); Centruj(" MASTER MIND "); textattr(0x87); Centruj(" "); Centruj(" ? ? ? ? "); Centruj(" "); do { t.Inicjuj(runda); Ocen_t(); } while(!KoniecGry()); } // Metoda upewnia się, że gracz ma ochotę na jeszcze // jedną grę. Zwraca w atkim wypadku true. //------------------------------------------------------ int TMasterMind::JeszczeRaz() { gotoxy(1,24); textcolor(WHITE); Centruj("Zagrasz jeszcze raz ? [T] = Tak, [inny] = Nie"); return(toupper(getch()) == 'T'); } // Blok główny programu //-------------------------------------------------- int main() { TMasterMind gra; srand((unsigned)time(NULL)); CursorOff(); do { gra.StronaTytulowa(); gra.Graj(); } while(gra.JeszczeRaz()); textattr(0x07); CursorOn(); clrscr(); 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