![]() |
Wyjście Spis treści Poprzedni Następny
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 |
![]() Przykładowa rozgrywka |
// P O L E M I N O W E
// WERSJA PROCEDURALNA
//--------------------------------------------
// (C)2004 mgr Jerzy Wałaszek I LO w Tarnowie
program PoleMinowe;
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
PM_MAX_Y = 19; // określa wysokość pola minowego
PM_MAX_X = 77; // określa szerokość pola minowego
var
pm : array[0..PM_MAX_Y,0..PM_MAX_X] of char;
// Procedura wyświetla stronę tytułową, czeka na dowolny
// klawisz i czyści ekran
//------------------------------------------------------
procedure StronaTytulowa;
begin
TextAttr := $07; ClrScr;
GotoXY(1,4);
TextAttr := $4e;
Centruj(PL(' '));
Centruj(PL(' GRA DLA SAPERÓW--------------- '));
Centruj(PL(' -------------------POLE MINOWE '));
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(' Czy pokonasz pole pełne min? '));
Centruj(PL(' '));
TextAttr := $f4;
Centruj(PL(' Gdy będziesz gotowy, '));
Centruj(PL(' naciśnij dowolny klawisz '));
Centruj(PL(' '));
TextAttr := $0e; Ramka(23,3,58,22);
while ReadKey = #0 do; // Oczekiwanie na dowolny klawisz
TextAttr := $07; ClrScr;
end;
// Procedura inicjuje tablice tm[]
//------------------------------------------------------
procedure UstawPoleMinowe;
var
i,j,x,y : integer;
begin
for i := 0 to PM_MAX_Y do
for j := 0 to PM_MAX_X do
pm[i,j] := ' ';
for i := 1 to 100 do
begin
x := random(PM_MAX_X + 1);
y := random(PM_MAX_Y + 1);
pm[y,x] := '*';
end;
pm[PM_MAX_Y,0] := '-';
pm[0,PM_MAX_X] := '+';
end;
// Procedura wyświetla planszę gry z polem minowym.
// Widocznością min steruje parametr miny
//------------------------------------------------------
procedure Plansza(miny : boolean);
var
i,j : integer;
begin
for i := 0 to PM_MAX_Y do
begin
GotoXY(2,i+2);
for j := 0 to PM_MAX_X do
case pm[i,j] of
'*' : begin // mina
TextAttr := $20;
if miny then write('*') else write(' ');
end;
' ' : begin // puste
TextAttr := $20; write(' ');
end;
'.' : begin // ślad przejścia
TextAttr := $a0; write(' ');
end;
'-' : begin // punkt startu
TextAttr := $70; write(' ');
end;
'+' : begin // punkt docelowy
TextAttr := $e0; write(' ');
end;
end;
end;
end;
// Funkcja zwraca true, jeśli gracz nie ma ochoty na
// kolejną rozgrywkę.
//------------------------------------------------------
function KoniecGry : boolean;
begin
GotoXY(1,23); TextAttr := $0f;
Centruj('Jeszcze raz ? [T] = Tak, [Inny] = Nie');
Result := UpCase(ReadKey) <> 'T';
end;
// Funkcja steruje ruchami gracza. Obsługuje naciśnięcia
// klawiszy kursora i przemieszcza pozycję gracza na nowe
// pole. Sprawdza rodzaj pola na którym znalazł się po
// ruchu gracz. Jeśli jest to mina lub pole docelowe,
// kończy grę z odpowiednim komunikatem. Pole gry jest
// wtedy ponownie wyświetlane, ale z widocznymi minami.
//------------------------------------------------------
function KoncowyRuch(var x,y : integer) : boolean;
var
c : char;
begin
Result := false;
GotoXY(x+2,y+2); TextAttr := $8f; write(#207);
repeat
c := ReadKey;
until c <> #0;
GotoXY(x+2,y+2); TextAttr := $8f; write(' ');
case c of
#75 : if x > 0 then dec(x); //strzałka w lewo
#77 : if x < PM_MAX_X then inc(x); //strzałka w prawo
#72 : if y > 0 then dec(y); //strzałka w górę
#80 : if y < PM_MAX_Y then inc(y); //strzałka w dół
end;
GotoXY(1,22);
case pm[y,x] of
'*' : begin
TextAttr := $0c;
Centruj(PL('P O L E G Ł E Ś N A P O L U M I N O W Y M'));
Plansza(true);
GotoXY(x+2,y+2); TextAttr := $4e; write('+');
Result := true;
end;
'+' : begin
TextAttr := $0e;
Centruj(PL('GRATULACJE - POKONAŁEŚ POLE MINOWE'));
Plansza(true);
GotoXY(x+2,y+2); TextAttr := $e1; write(#207);
Result := true;
end;
'-' : ;
else
pm[y,x] := '.'; // Pozostawiamy ślad przejścia
end;
end;
// Procedura sprawdza, czy wokół pozycji gracza są miny.
// Wyświetla odpowiedni komunikat.
//------------------------------------------------------
procedure SprawdzMiny(x,y : integer);
var
i,j : integer;
mina : boolean;
begin
GotoXY(1,23);
mina := false;
for i := y - 1 to y + 1 do
for j := x - 1 to x + 1 do
if (i >= 0) and (i <= PM_MAX_Y) and
(j >= 0) and (j <= PM_MAX_X) and
(pm[i,j] = '*') then mina := true;
if mina then
begin
TextAttr := $ce; Centruj(' UWAGA - MINY! ');
end
else
begin
TextAttr := $1f; Centruj(' NIE MA MIN ');
end;
end;
// Główny blok programu.
//------------------------------------------------------
var
a,px,py : integer;
begin
Randomize;
a := TextAttr; CursorOff;
repeat
StronaTytulowa;
UstawPoleMinowe;
Plansza(false);
px := 0; py := PM_MAX_Y;
repeat
SprawdzMiny(px,py);
until KoncowyRuch(px,py);
until KoniecGry;
TextAttr := a; CursorOn; ClrScr;
end. |
// P O L E M I N O W E
// WERSJA OBIEKTOWA
//--------------------------------------------
// (C)2004 mgr Jerzy Wałaszek I LO w Tarnowie
program PoleMinowe;
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
PM_MAX_Y = 19; // określa wysokość pola minowego
PM_MAX_X = 77; // określa szerokość pola minowego
type
TPoleMinowe = class
private
pm : array[0..PM_MAX_Y,0..PM_MAX_X] of char;
px,py : integer;
procedure InicjujGre;
procedure Plansza(miny : boolean);
procedure SprawdzMiny;
procedure StronaTytulowa;
procedure UstawPoleMinowe;
function KoncowyRuch : boolean;
function KoniecGry : boolean;
public
constructor Create;
procedure Graj;
end;
// Definicje metod obiektowych
//------------------------------------------------------
constructor TPoleMinowe.Create;
begin
// tylko standardowe działanie
end;
// Metoda obsługuje całą rozgrywkę
//------------------------------------------------------
procedure TPoleMinowe.Graj;
var
a : integer;
begin
Randomize;
a := TextAttr; CursorOff;
repeat
StronaTytulowa;
InicjujGre;
repeat
SprawdzMiny;
until KoncowyRuch;
until KoniecGry;
TextAttr := a; CursorOn; ClrScr;
end;
// Procedura inicjuje grę ustawiając pole minowe,
// współrzędne gracza oraz wyświetlając planszę gry.
//------------------------------------------------------
procedure TPoleMinowe.InicjujGre;
begin
UstawPoleMinowe;
px := 0; py := PM_MAX_Y;
Plansza(false);
end;
// Procedura wyświetla planszę gry
//------------------------------------------------------
procedure TPoleMinowe.Plansza(miny : boolean);
var
i,j : integer;
begin
for i := 0 to PM_MAX_Y do
begin
GotoXY(2,i+2);
for j := 0 to PM_MAX_X do
case pm[i,j] of
'*' : begin // mina
TextAttr := $20;
if miny then write('*') else write(' ');
end;
' ' : begin // puste
TextAttr := $20; write(' ');
end;
'.' : begin // ślad przejścia
TextAttr := $a0; write(' ');
end;
'-' : begin // punkt startu
TextAttr := $70; write(' ');
end;
'+' : begin // punkt docelowy
TextAttr := $e0; write(' ');
end;
end;
end;
end;
// Procedura sprawdza, czy wokół pola gracza znajdują
// się jakieś miny. O obu wypadkach wyświetlany jest
// odpowiedni komunikat
//------------------------------------------------------
procedure TPoleMinowe.SprawdzMiny;
var
i,j : integer;
mina : boolean;
begin
GotoXY(1,23);
mina := false;
for i := py - 1 to py + 1 do
for j := px - 1 to px + 1 do
if (i >= 0) and (i <= PM_MAX_Y) and
(j >= 0) and (j <= PM_MAX_X) and
(pm[i,j] = '*') then mina := true;
if mina then
begin
TextAttr := $ce; Centruj(' UWAGA - MINY! ');
end
else
begin
TextAttr := $1f; Centruj(' NIE MA MIN ');
end;
end;
// Procedura wyświetla stronę tytułową, czeka na dowolny
// klawisz i czyści ekran
//------------------------------------------------------
procedure TPoleMinowe.StronaTytulowa;
begin
TextAttr := $07; ClrScr;
GotoXY(1,4);
TextAttr := $4e;
Centruj(PL(' '));
Centruj(PL(' GRA DLA SAPERÓW--------------- '));
Centruj(PL(' -------------------POLE MINOWE '));
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(' Czy pokonasz pole pełne min? '));
Centruj(PL(' '));
TextAttr := $f4;
Centruj(PL(' Gdy będziesz gotowy, '));
Centruj(PL(' naciśnij dowolny klawisz '));
Centruj(PL(' '));
TextAttr := $0e; Ramka(23,3,58,22);
while ReadKey = #0 do; // Oczekiwanie na dowolny klawisz
TextAttr := $07; ClrScr;
end;
// Procedura inicjuje pole gry.
//------------------------------------------------------
procedure TPoleMinowe.UstawPoleMinowe;
var
i,j,x,y : integer;
begin
for i := 0 to PM_MAX_Y do
for j := 0 to PM_MAX_X do
pm[i,j] := ' ';
for i := 1 to 100 do
begin
x := random(PM_MAX_X + 1);
y := random(PM_MAX_Y + 1);
pm[y,x] := '*';
end;
pm[PM_MAX_Y,0] := '-';
pm[0,PM_MAX_X] := '+';
end;
// Funkcja steruje ruchami gracza. Obsługuje naciśnięcia
// klawiszy kursora i przemieszcza pozycję gracza na nowe
// pole. Sprawdza rodzaj pola na którym znalazł się po
// ruchu gracz. Jeśli jest to mina lub pole docelowe,
// kończy grę z odpowiednim komunikatem. Pole gry jest
// wtedy ponownie wyświetlane, ale z widocznymi minami.
//------------------------------------------------------
function TPoleMinowe.KoncowyRuch : boolean;
var
c : char;
begin
Result := false;
GotoXY(px+2,py+2); TextAttr := $8f; write(#207);
repeat
c := ReadKey;
until c <> #0;
GotoXY(px+2,py+2); TextAttr := $8f; write(' ');
case c of
#75 : if px > 0 then dec(px); //strzałka w lewo
#77 : if px < PM_MAX_X then inc(px); //strzałka w prawo
#72 : if py > 0 then dec(py); //strzałka w górę
#80 : if py < PM_MAX_Y then inc(py); //strzałka w dół
end;
GotoXY(1,22);
case pm[py,px] of
'*' : begin
TextAttr := $0c;
Centruj(PL('P O L E G Ł E Ś N A P O L U M I N O W Y M'));
Plansza(true);
GotoXY(px+2,py+2); TextAttr := $4e; write('+');
Result := true;
end;
'+' : begin
TextAttr := $0e;
Centruj(PL('GRATULACJE - POKONAŁEŚ POLE MINOWE'));
Plansza(true);
GotoXY(px+2,py+2); TextAttr := $e1; write(#207);
Result := true;
end;
'-' : ;
else
pm[py,px] := '.'; // Pozostawiamy ślad przejścia
end;
end;
// Funkcja zwraca true, jeśli gracz nie ma ochoty na
// kolejną rozgrywkę.
//------------------------------------------------------
function TPoleMinowe.KoniecGry : boolean;
begin
GotoXY(1,23); TextAttr := $0f;
Centruj('Jeszcze raz ? [T] = Tak, [Inny] = Nie');
Result := UpCase(ReadKey) <> 'T';
end;
//------------------------------------------------------
// Blok główny programu
//------------------------------------------------------
var
gra : TPoleMinowe;
begin
gra := TPoleMinowe.Create;
gra.Graj;
end. |
Program uruchomiono w środowisku Dev-C++.
// P O L E M I N O W E
//--------------------------------------------
// (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
//----------------------------------------------------
const int PM_MAX_X = 77;
const int PM_MAX_Y = 19;
class TPoleMinowe
{
char pm[PM_MAX_Y+1][PM_MAX_X+1];
int px,py;
void InicjujGre();
void Plansza(int miny);
void SprawdzMiny();
void StronaTytulowa();
void UstawPoleMinowe();
int KoncowyRuch();
int KoniecGry();
public:
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
//----------------------------------------------------
// Metoda obsługuje całą rozgrywkę
//------------------------------------------------------
void TPoleMinowe::Graj()
{
srand((unsigned)time(NULL));
CursorOff();
do
{
StronaTytulowa();
InicjujGre();
do
{
SprawdzMiny();
} while(!KoncowyRuch());
} while(!KoniecGry());
textattr(7); CursorOn(); clrscr();
}
// Procedura inicjuje grę ustawiając pole minowe,
// współrzędne gracza oraz wyświetlając planszę gry.
//------------------------------------------------------
void TPoleMinowe::InicjujGre()
{
UstawPoleMinowe();
px = 0; py = PM_MAX_Y;
Plansza(false);
}
// Procedura wyświetla planszę gry
//------------------------------------------------------
void TPoleMinowe::Plansza(int miny)
{
int i,j;
for(i = 0; i <= PM_MAX_Y; i++)
{
gotoxy(2,i+2);
for(j = 0; j <= PM_MAX_X; j++)
{
switch(pm[i][j])
{
case '*' : // mina
textattr(0x20);
if(miny) cout << "*"; else cout << " ";
break;
case ' ' : // puste
textattr(0x20); cout << " "; break;
case '.' : // ślad przejścia
textattr(0xa0); cout << " "; break;
case '-' : // punkt startu
textattr(0x70); cout << " "; break;
case '+' : // punkt docelowy
textattr(0xe0); cout << " "; break;
};
cout.flush();
};
};
}
// Procedura sprawdza, czy wokół pola gracza znajdują
// się jakieś miny. O obu wypadkach wyświetlany jest
// odpowiedni komunikat
//------------------------------------------------------
void TPoleMinowe::SprawdzMiny()
{
int i,j,mina;
gotoxy(1,23);
mina = false;
for(i = py - 1; i <= py + 1; i++)
for(j = px - 1; j <= px + 1; j++)
if((i >= 0) && (i <= PM_MAX_Y) &&
(j >= 0) && (j <= PM_MAX_X) && (pm[i][j] == '*')) mina = true;
if(mina)
{
textattr(0xce); Centruj(" UWAGA - MINY! ");
}
else
{
textattr(0x1f); Centruj(" NIE MA MIN ");
};
}
// Procedura wyświetla stronę tytułową, czeka na dowolny
// klawisz i czyści ekran
//------------------------------------------------------
void TPoleMinowe::StronaTytulowa()
{
textbackground(0); clrscr();
gotoxy(1,4); textattr(0x4e);
Centruj(PL(" "));
Centruj(PL(" GRA DLA SAPERÓW--------------- "));
Centruj(PL(" -------------------POLE MINOWE "));
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(" Czy pokonasz pole pełne min? "));
Centruj(PL(" "));
textattr(0xf4);
Centruj(PL(" Gdy będziesz gotowy, "));
Centruj(PL(" naciśnij dowolny klawisz "));
Centruj(PL(" "));
textattr(0x0e); Ramka(23,3,58,22);
while(getch() == '\0') ; // Oczekiwanie na dowolny klawisz
textattr(0x07); clrscr();
}
// Procedura inicjuje pole gry.
//------------------------------------------------------
void TPoleMinowe::UstawPoleMinowe()
{
int i,j,x,y;
for(i = 0; i <= PM_MAX_Y; i++)
for(j = 0; j <= PM_MAX_X; j++) pm[i][j] = ' ';
for(i = 1; i <= 100; i++)
{
x = rand() % (PM_MAX_X + 1);
y = rand() % (PM_MAX_Y + 1);
pm[y][x] = '*';
};
pm[PM_MAX_Y][0] = '-';
pm[0][PM_MAX_X] = '+';
}
// Funkcja steruje ruchami gracza. Obsługuje naciśnięcia
// klawiszy kursora i przemieszcza pozycję gracza na nowe
// pole. Sprawdza rodzaj pola na którym znalazł się po
// ruchu gracz. Jeśli jest to mina lub pole docelowe,
// kończy grę z odpowiednim komunikatem. Pole gry jest
// wtedy ponownie wyświetlane, ale z widocznymi minami.
//------------------------------------------------------
int TPoleMinowe::KoncowyRuch()
{
char c;
gotoxy(px+2,py+2); textattr(0x8f); cout << char(207);
while((c = getch()) == '\0') ;
gotoxy(px+2,py+2); textattr(0x8f); cout << ' ';
switch(c)
{
case char(75) : if(px > 0) px--; break; //strzałka w lewo
case char(77) : if(px < PM_MAX_X) px++; break; //strzałka w prawo
case char(72) : if(py > 0) py--; break; //strzałka w górę
case char(80) : if(py < PM_MAX_Y) py++; break; //strzałka w dół
};
gotoxy(1,22);
switch(pm[py][px])
{
case '*' : textattr(0x0c);
Centruj(PL("P O L E G Ł E Ś N A P O L U M I N O W Y M"));
Plansza(true);
gotoxy(px+2,py+2); textattr(0x4e); cout << "+";
return(true);
case '+' : textattr(0x0e);
Centruj(PL("GRATULACJE - POKONAŁEŚ POLE MINOWE"));
Plansza(true);
gotoxy(px+2,py+2); textattr(0xe1); cout << char(207);
return(true);
case '-' : break;
default : pm[py][px] = '.'; // Pozostawiamy ślad przejścia
break;
};
return(false);
}
// Funkcja zwraca true, jeśli gracz nie ma ochoty na
// kolejną rozgrywkę.
//------------------------------------------------------
int TPoleMinowe::KoniecGry()
{
gotoxy(1,23); textattr(0x0f);
Centruj("Jeszcze raz ? [T] = Tak, [Inny] = Nie");
return(toupper(getch()) != 'T');
}
//------------------------------------------------------
// Blok główny programu
//------------------------------------------------------
int main()
{
TPoleMinowe gra;
gra.Graj();
} |
![]() | 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