Joc del Pescamines

Objectiu
Este joc es basa en un tauler on s’amaguen una certa quantitat de mines. L’objectiu és identificar on estan.
Regles del joc
Es preguntarà les dimensions del tauler (files i columes) i la quantitat de mines i després s’anirà preguntant l’acció a fer en un bucle que acabarà quan guanye o perda:
- Picar en una posició. Podrà passar que:
- Hi ha una mina i el joc s’acaba. Es mostra el tauler amb les mines.
- No hi ha mina:
- Es mostra en eixa cel·la un número: la quantitat de mines que hi ha adjacents a eixa cel·la (serà un número entre 1 i 8).
- Si hi ha 0 mines adjacents, vol dir que en cap de les adjacents hi ha mina. Per tant, es destaparan totes les adjacents, recursivament.
- Posar una bandereta en una posició (marcar-la com possible candidata a mina). Aleshores, a la que marquem se li posa una bandereta (caràcter
P). Si posem una bandera on ja n’hi havia una, la llevarem. També es pot picar damunt d’una cel·la amb bandereta.
En diversos moments del joc, el tauler pot ser:

Juga un poc al pescamines que té el Linux o Windows per vore què et farà falta.
Disseny
- Dissenya les estructures de dades necessàries per al joc del buscamines.
- Posa noms coherents.
- Documenta la informació que contindran i el seu significat.
- Pensa que et caldrà un tauler on representar la informació que no es veu: les mines; i altre tauler per a representar la informació que es veu: la quantitat d’adjacents, si la cel·la està destapada, banderetes de bombes, etc.
Funcions
| Funció | Paràmetres | Retorn | Descripció |
|---|---|---|---|
| minar() | - | Quantitat mines posades | - Inicia matrius - Demana la quantitat de mines i les posa aleatòriament |
| minat(int f, int c) | Posició | Si hi ha mina o no | Retorna cert si a la posició (f,c) hi ha mina, fals en cas contrari |
| incorrecte(int f, int c) | Posició | Si la posició és vàlida o no | Retorna cert si la posició (f,c) és vàlida dins del tauler, fals en cas contrari |
| qma(int f, int c) | Posició | Quantitat de mines adjacents | - Retorna la quantitat de mines adjacents a la posició (f,c) |
| destapat(int f, int c) | Posició | Si la posició està destapada o no | Retorna cert si la posició (f,c) està destapada, fals en cas contrari |
| qdestapats() | - | Quantitat de cel·les destapades | Retorna la quantitat de cel·les que estan destapades per comprovar si acaba el joc |
| mostrar_tauler(boolean m) | Si volem mostrar mines o no | - | - Mostra el tauler, amb els números de files i columnes als 4 costats del tauler. - Tapat : X - Bandereta: P - Res : _ -Separador : | Bomba: ¤ (ALT+207) |
| picar(int f, int c) | Posició | Si ha picat una mina o no | Si no hi ha mina, destapa la posició cridant a destapar() |
| bandera(int f, int c) | Posició | - | Posem o llevem una bandereta a la posició (f,c) |
| destapar(int f, int c) | Posició | - | Destapa la posició (f,c), cas de no haver mina. És una funció recursiva: - Casos base: - Posició incorrecta - Ja destapat - Bandereta - Té mines adjacents Cas genèric: - Posar la quantitat d’adjacents en eixa cel·la - Destapar les 8 cel·les adjacents |
Observacions:
- No s’ha de repetir codi: si una funció fa una cosa determinada, cal cridar a eixa funció.
- Per comoditat, posarem les matrius com a globals, per a no passar-les a totes les funcions com a paràmetres. Però no hi haurà més variables globals.
- Usa constants simbòliques per a representar els possibles valors del tauler (TAPAT,BANDERA,RES,MINA)