Sunteți pe pagina 1din 22

COLEGIUL NAȚIONAL DE INFORMATICĂ

Piatra Neamț

PROIECT PENTRU ATESTAREA COMPETENȚELOR


PROFESIONALE ÎN INFORMATICĂ

MINESWEEPER

Profesor coordonator: Elev:


Prof. Nour Georgeta Munteanu Cosmin-Bogdan
Clasa a XII-a C

1
SESIUNEA MAI 2019

CUPRINS

ARGUMENT,IDEA JOCULUI……………………………………………………3
LIMBAJUL DE PROGRAMARE…………………………………………………4
PREZENTAREA PROGRAMULUI………………………………....……………5
RULAREA ……………………………………………………...………….…... .17
CONCLUZII………………………………………………………………….…...21
BIBLIOGRAFIE………………………………………………...……….……... .22

2
ARGUMENT

Am decis să abordez această temă pentru atestat datorită


cunoștințelor mele despre limbajul de programare c++, și dorința de a
cunoaște mai multe și de a crea un joc.
Din întâmplare în ziua când am ales aceasta temă eu
redescoperisem acest joc din copilărie așa am început să mă informez
despre cum este creat acesta.

IDEEA JOCULUI

Cum jocul este creat în codeblocks aveam două variante la care


m-am gândit. Prima ar fi cu ajutorul librăriilor SFML, sau o variantă
brut pe care am folosit-o și eu. Țin să menționez că idea nu este
originală, deoarece sunt mulți înaintea mea ce au analizat acest joc, dar
programul este scris în totalitate de mine.
Creăm o matrice de afișare, și una identică cu poziția bombelor,
poziție aleatorie pentru orice compilare. Pentru a recunoaște dacă vrem
să plasăm sau scoatem un steguleț și dacă vrem să verificăm dacă este
liberă căsuța, am utilizat caracterele ‘f’ și ‘o’.
Ideea jocului este să găsești toate bombele din chenar într-un timp
cât mai scurt.

3
LIMBAJUL DE PROGRAMARE

Un limbaj de programare este un set bine definit de expresii și


reguli (sau tehnici) valide de formulare a instrucțiunilor pentru
un computer. Un limbaj de programare are definite un set de reguli
sintactice și semantice. El dă posibilitatea programatorului să specifice
în mod exact și amănunțit acțiunile pe care trebuie să le execute
calculatorul, în ce ordine și cu ce date.
C++ este unul dintre cele mai folosite limbaje de programare
pentru dezvoltarea programelor de tip desktop. Pentru crearea de
programe în C++ este necesar un mediu de dezvoltare integrat
(integrated development environment – IDE) care să uşureze pe deoparte
procesul de programare, iar pe de altă parte, să integreze o serie de
instrumente care să facă posibilă și să eficientizeze crearea de software.
Code::Blocks este un IDE pentru limbajele de programare C++, C
și Fortran ce a fost lansat în versiune stabilă în 2008.
Acesta este gratuit, open-source și cross-platform (compatibil cu
Windows, Mac și Linux), având proprietatea de a suporta folosirea de
multiple compilatoare, inclusiv pe cel specific IDE-ului Microsoft
Visual Studio C++, ceea ce face ca dezvoltatorul să aibă un control mai
mare asupra software-ului creat și asupra portabilității codului sursă de
pe alte IDE-uri.

4
PROGRAMUL
#include<iostream>
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#include<iomanip>

using namespace std;

void show(int, int);


void creare_mine();
void nr_casuta();
void creare_tabel();
void d_casuta();
void game();
void scriere(char);
void ocupa();
void simbol();
bool game_win();
void game();
char t[10][10];
char tmine[10][10];

5
char s;
int steag=0;
int mine_g=0;
bool game_lost=false;
time_t timp=time(0);
time_t game_time;

Aceasta este partea de declarație.


În prima parte avem bibliotecile pentru program: timp, generare de
valori random și afișare.
În a doua parte sunt prezentate toate funcțiile necesare acestui
program.
Iar în a treia parte sunt câteva din variabile folosite.
void creare_mine()
{
int c=0;
srand(time(NULL));
for(int i=0;i<10;i++)
for(int j=0; j<10; j++)
tmine[i][j]='0';
int i=0; int j=0;
while(c<10)
{
int i=rand()%10;
6
int j=rand()%10;
if(tmine[i][j]=='0')
{
tmine[i][j]='X';
nr_casuta(i-1,j);
nr_casuta(i+1,j);
nr_casuta(i,j-1);
nr_casuta(i,j+1);
nr_casuta(i-1,j-1);
nr_casuta(i-1,j+1);
nr_casuta(i+1,j-1);
nr_casuta(i+1,j+1);
c++;
}
}
}
Prima funcție este o creare random de bombe.
Numărul de bombe este dat de variabila ’c’. În while am pus c<10
pentru a avea maxim 10 bombe. Dacă am fi dorit să selectăm noi
numărul de bombe trebuia citit un ’k’ și cât timp c<k să se insereze câte
o bombă în matrice.
Inserare este random, iar pe casuțele alăturate se măresc indicii
pentru a respecta regulile jocului.

7
void nr_casuta(int i,int j)
{
if(i>=0 and i<10 and j>=0 and j<10 and
tmine[i][j]!='X')
tmine[i][j]++;
}

Această funcție este folosită în programul ‘creare_mine()’ pentru a


verifica dacă acea căsuță poate fi utilizată ca număr și o mărește
deoarece are în preajmă o bombă.

void creare_tabel()
{
for(int i=0; i<10; i++)
for(int j=0; j<10; j++)
t[i][j]='*';
}

Această funcție este utilizată la început pentru afișarea matricei cu


necunoscute, deoarce este logic că nu vom afișa aceeași matrice, cu
poziția bombelor .

void scriere(char arr[10][10])


{
cout<<" ";
8
for(int i=0; i<10; i++)
cout<<setw(3)<<i;
cout<<endl<<" ";
for(int i=0; i<32; i++)
cout<<"_";
cout<<endl;
for(int i=0; i<10; i++)
{
cout<<setw(3)<<i<<"|";
for(int j=0; j<10; j++)
cout<<setw(3)<<arr[i][j];
cout<<endl;
}
}
În această funcție afișez matricea cu simboluri unde se vor
descoperi numerele din matricea cu rezolvările sau se vor marca
bombele.
0 1 2 3 4 5 6 7 8 9
________________________________
0| * * * * * * * * * *
1| * * * * * * * * * *
2| * * * * * * * * * *
3| * * * * * * * * * *
4| * * * * * * * * * *
9
5| * * * * * * * * * *
6| * * * * * * * * * *
7| * * * * * * * * * *
8| * * * * * * * * * *
9| * * * * * * * * * *
void show(int i,int j)
{
if (t[i][j]=='*' and tmine[i][j]!='X' and i>=0 and i<10 and
j>=0 and j<10 )
{
t[i][j]=tmine[i][j];
if(tmine[i][j]=='0')
{
show(i,j-1);
show(i,j+1);
show(i-1,j-1);
show(i+1,j-1);
show(i+1,j+1);
show(i-1,j+1);
show(i-1,j);
show(i+1,j);
}
}}

10
Această funcție, folosită în subprogramul ’d_casuta’, verifică dacă
pozițiile introduse sunt corecte, și dacă este ocupată de un număr sau de
o mină.

void simbol()
{
cin>>s;
switch (s)
{
case 'o' : d_casuta(); break;
case 'f' : ocupa(); break;
default : simbol();
}
}
Funcția simbol este cea care testează caracterul primit și ne
apelează funcția corespunzătoare.
Printr-un ’switch’ se verifică dacă caracterul este ’o’ se
apelează ’d_casuta’ respectiv ’ocupă’ pentru ’f’.

void ocupa()
{
int i,j;
do cin>>i>>j;
while(i<0 or i>9 or j<0 or j>9);

11
if (t[i][j]=='*')
{
t[i][j]='F';
steag++;
if(tmine[i][j]=='X')
mine_g++;
}
else if (t[i][j]=='F')
{
t[i][j]='*';
steag--;
if(tmine[i][j]=='X')
mine_g--;
}
}

Funcția ’ocupa’ citește variabilele și marchează în matricea cu


simboluri cu ’F’ o presupusă bombă, dacă pe acea poziție este cu
adevărat o bombă atunci variabila ’mine_g’ se mărește. Deasemenea
subalgoritmul merge și în sens invers .

void d_casuta()
{
int i,j;

12
do cin>>i>>j;
while(i<0 or i>9 or j<0 or j>9);
if(tmine[i][j]=='X')
{
t[i][j]='X';
game_lost=true;
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
if(tmine[i][j]=='X')
t[i][j]='X';
}
else show(i,j);
}

Subprogramul d_casuta citește variabilele, iar dacă în acele poziții


din matricea cu simboluri este o bombă atunci se afisează toate bombele
și se incheie jocul. Dacă nu, se continuă afișarea și jocul.

bool game_win()
{
if(steag==10 and mine_g==10) return 1;
else return 0;
}

13
Subprogramul game_win este folosit pentru a verifica dacă jocul
este sau nu câstigat comparând numărul de steaguri puse cu numărul de
bombe găsite.

int main()
{
cout<<"Reguli:" <<endl;
cout<<"Introdu 'o' , apoi valoarea lui i si j pentru a deschide
casuta[i][j].";
cout<<endl<<"Introdu 'f' , apoi valoarea lui i si j pentru a pune un
stegulet sau scoate unul din casuta [i][j]"
cout <<endl<<endl;
game();
return 0;
}

În main se afișează regulile jocului la început, apoi se apelează


funcția game care face toată treaba.

14
void game()
{
creare_tabel();
creare_mine();
while(!game_lost and !game_win())
{
game_time=time(0);
scriere(t);
/**cout<<endl<<"Mine gasite:"<<mine_g<<endl;**/
cout<<endl<<"Steaguri:"<<steag<<endl;
cout<<"Timp:"<<game_time-timp<<endl;
simbol();
system("cls");
}
if(game_lost)
{ scriere(t);
cout<<endl<<"GAME OVER"<<endl;
}
else if(game_win())
{
cout<<"Timpul tau:"<<game_time-timp<<endl;
cout<<endl<<"YOU WIN!"<<endl;
}}

15
„Game” este cea mai lungă funcție din program, și de aceea am
împărțit-o în 2 parți. Pentru început se apelează funcțiile de creare de
tabel cu simboluri și tabelul cu rezolvarea într-un while verificând de
fiecare dată dacă jocul s-a terminat. În interiorul acestui while afișăm
timpul care il actualizăm la început și numărul de steaguri plasate, iar
dacă dorim putem afișa și numărul de mine găsite. La final prin funcția
„system(„cls”)” curațăm ecranul.
A doua parte din funcția „game” este verificarea. Dacă jocul este
câștigat atunci se afișeaza timpul și mesajul „YOU WIN” , dacă nu se
execută funcția normală de scriere a matricei și mesajul „GAME
OVER”.

16
RULARE

1) Primă rulare a programului. Nu am introdus nimic.

17
2)Introducând valoarea ’o 0 0’ am nimerit o mină, iar jocul s-a încheiat.

18
3)După mai multe inserări .

19
4)La final, când am completat toata matricea de simboluri.

20
CONCLUZII

Prin acest proiect c++ am reușit să îmi dezvolt anumite


calitați referitoare la programare, rulare, și de a întelege în ce
constă munca din spatele unui joc. Deasemenea am învățat
structuri, funcții, și noi metode de utilizare ale acestora.
Totodată pentru a mă informa am analizat și alte forme de
MINESWEEPER in alte limbaje precum c#, java, unity și
python. De aici a început să mă intereseze învățarea unui nou
limbaj de programare.
Am început cu c# deoarece este un limbaj asemănător cu
c++. C# este un limbaj de programare orientat-obiect conceput
de Microsoft la sfârșitul anilor 90. A fost conceput ca un
concurent pentru limbajul Java. Ca și acesta, C# este un derivat
al limbajului de programare C++.
În prezent, am observat posibilitățile și avantajele aduse de
python și intenționez să învăț și să ajung un creez cât mai multe
în această lume virtuală.

21
BIBLIOGRAFIE

 https://en.wikipedia.org/wiki/Minesweeper_(video_game)
 https://www.google.com/search?q=minesweeper+c%2B%2B&rlz=
1C1GGRV_enRO751RO752&oq=mi&aqs=chrome.0.69i59l2j69i6
0l2j69i57j69i60.2018j1j7&sourceid=chrome&ie=UTF-8
 https://www.youtube.com/watch?v=c8wswUEfnrQ
 https://www.youtube.com/watch?v=DkjOZ_Hlqbs
 https://codereview.stackexchange.com/questions/141717/mineswe
eper-in-c
 http://www.cplusplus.com/reference/ctime/time/?kw=time
 http://www.cplusplus.com/forum/beginner/15809/
 http://www.cplusplus.com/reference/cstdlib/rand/
 http://www.cplusplus.com/reference/iomanip/setw/?kw=setw
 http://www.cplusplus.com/forum/general/69782/

22

S-ar putea să vă placă și