Sei sulla pagina 1di 4

C:\Users\Arturo\Downloads\Minesweeper.

cpp 1
#include <iostream>
#include <conio.h>
#include <time.h>

using namespace std;

void mostrarMenu() {
system("cls");

cout
<< "(1) Tengo mucho miedo (10 minas en un tablero de 9 x 9)" << endl
<< "(2) Estoy listo (40 minas en un tablero de 16 x 16)" << endl
<< "(3) Soy un demente (80 minas en un tablero de 16 x 16)" << endl
<< endl
<< "(0) Salir, mi mama no me dio permiso" << endl
<< endl
<< ": ";
}

int** crearTablero(int s) {
int **n = new int *[s];
for (int x=0; x<s; x++) { n[x] = new int[s]; for (int y=0; y<s; y++) { n[x][y] = 0; } }
return n;
}

void ponerMinas(int **&tablero, int s, int m) {


srand((int)time(0));

while (m > 0) {
int x = rand()%s;
int y = rand()%s;
if (tablero[x][y] == 0) {
tablero[x][y] = 9;
m--;
}
}
}

int estadoCelda(int n) {
int r = 0;

if (n == 0) { r = 1; } // cerrado vacio
else if ((n >= 1) & (n <= 8)) { r = 2; } // cerrado pista
else if (n == 9) { r = 3; } // cerrado mina

else if (n == 10) { r = 4; } // abierto vacio


else if ((n >= 11) & (n <= 18)) { r = 5; } // abierto pista
else if (n == 19) { r = 6; } // abierto mina

else if (n == 100) { r = 7; } // marcado vacio


else if ((n >= 101) & (n <= 108)) { r = 8; } // marcado pista
else if (n == 109) { r = 9; } // marcado mina

else if (n == 1000) { r = 10; } // ubicado cerrado vacio


else if ((n >= 1001) & (n <= 1008)) { r = 11; } // ubicado cerrado pista
else if (n == 1009) { r = 12; } // ubicado cerrado mina

else if (n == 1010) { r = 13; } // ubicado abierto vacio


else if ((n >= 1011) & (n <= 1018)) { r = 14; } // ubicado abierto pista
else if (n == 1019) { r = 15; } // ubicado abierto mina

else if (n == 1100) { r = 16; } // ubicado marcado vacio


else if ((n >= 1101) & (n <= 1108)) { r = 17; } // ubicado marcado pista
else if (n == 1109) { r = 18; } // ubicado marcado mina

return r;
C:\Users\Arturo\Downloads\Minesweeper.cpp 2
}

bool validarPosicion(int x, int y, int s) { return ((x >= 0) & (x <= s-1) & (y >= 0) & (y <= s-1)); }
bool estaCerrado(int c) { return (estadoCelda(c) >= 10) & (estadoCelda(c) <= 12); }
bool estaMarcado(int c) { return (estadoCelda(c) >= 16) & (estadoCelda(c) <= 18); }
bool estaConMina(int c) { return (estadoCelda(c) == 3) | (estadoCelda(c) == 6) | (estadoCelda(c) == 9) |
(estadoCelda(c) == 12) | (estadoCelda(c) == 15) | (estadoCelda(c) == 18); }

void ponerPistas(int **&tablero, int s) {


for (int x = 0; x < s; x++) {
for (int y = 0; y < s; y++) {
if (tablero[x][y] == 9) {
for (int tx = x-1; tx <= x+1; tx++) {
for (int ty = y-1; ty <= y+1; ty++) {
if (validarPosicion(tx, ty, s)) if (tablero[tx][ty] < 9) tablero[tx][ty]++;
}
}
}
}
}
}

void mover(int **&tablero, int s, int m, int &x, int &y) {


switch (m) {
case 75: if (validarPosicion(x, y-1, s)) { if (tablero[x][y] >= 1000) { tablero[x][y] -= 1000; } y
-= 1; tablero[x][y] += 1000; } break;
case 72: if (validarPosicion(x-1, y, s)) { if (tablero[x][y] >= 1000) { tablero[x][y] -= 1000; } x
-= 1; tablero[x][y] += 1000; } break;
case 77: if (validarPosicion(x, y+1, s)) { if (tablero[x][y] >= 1000) { tablero[x][y] -= 1000; } y
+= 1; tablero[x][y] += 1000; } break;
case 80: if (validarPosicion(x+1, y, s)) { if (tablero[x][y] >= 1000) { tablero[x][y] -= 1000; } x
+= 1; tablero[x][y] += 1000; } break;
}
}

void marcarCelda(int **&tablero, int x, int y) {


int v = tablero[x][y];
if (estaCerrado(v)) { tablero[x][y] -= 900; }
else if (estaMarcado(v)) { tablero[x][y] -= 1100; }
}

void abrirMinas(int **&tablero, int s) {


for (int x = 0; x < s; x++) {
for (int y = 0; y < s; y++) {
if (estaConMina(tablero[x][y])) tablero[x][y] = 19;
}
}
}

void abrirCelda(int **&tablero, int s, int x, int y) {


if (estaCerrado(tablero[x][y])) {
tablero[x][y] -= 990;
if (estadoCelda(tablero[x][y]) == 4) {
if (validarPosicion(x-1, y, s)) { if (estadoCelda(tablero[x-1][y]) == 1) { tablero[x-1][y] =
1000; abrirCelda(tablero, s, x-1, y); } }
if (validarPosicion(x, y-1, s)) { if (estadoCelda(tablero[x][y-1]) == 1) { tablero[x][y-1] =
1000; abrirCelda(tablero, s, x, y-1); } }
if (validarPosicion(x, y+1, s)) { if (estadoCelda(tablero[x][y+1]) == 1) { tablero[x][y+1] =
1000; abrirCelda(tablero, s, x, y+1); } }
if (validarPosicion(x+1, y, s)) { if (estadoCelda(tablero[x+1][y]) == 1) { tablero[x+1][y] =
1000; abrirCelda(tablero, s, x+1, y); } }
} else if (estadoCelda(tablero[x][y]) == 6) {
abrirMinas(tablero, s);
}
}
}
C:\Users\Arturo\Downloads\Minesweeper.cpp 3

int estadoJuego(int **&tablero, int s) {


for (int x = 0; x < s; x++) {
for (int y = 0; y < s; y++) {
if (estadoCelda(tablero[x][y]) == 6) return 2; // perdido
}
}

for (int x = 0; x < s; x++) {


for (int y = 0; y < s; y++) {
if (estadoCelda(tablero[x][y]) <= 2) return 0; // jugando
}
}

return 1; // ganado
}

void mostrarCelda(int c) {
int e = estadoCelda(c);
if (e <= 3) { cout << char(219); } // cerrado
else if (e == 4) { cout << char(176); } // vacio
else if (e == 5) { cout << c-10; } // pista
else if (e == 6) { cout << char(15); } // mina
else if ((e >= 7) & (e <= 9)) { cout << char(240); } // marcado
else if ((e >= 10) & (e <= 18)) { cout << char(254); } // ubicado
}

void mostrarTablero(int **&tablero, int s) {


system("CLS");
for (int x = 0; x < s; x++) {
for (int y = 0; y < s; y++) {
mostrarCelda(tablero[x][y]);
}
cout << endl;
}
cout << endl;
cout << "Rese" << char(164) << "a: " << char(219) << " Cerrado " << char(176) << " Vacio " << char
(15) << " Mina " << char(240) << " Marca [1-8] Pista" << endl;
cout << endl;
cout << "Teclas: [" << char(27) << char(24) << char(26) << char(25) << "] Movimientos [ENTER] Abrir
[SPACE] Marcar [ESC] Salir" << endl;
cout << endl;

switch (estadoJuego(tablero, s)) {


case 2: cout << endl << " > > > > > > > > > > P E R D I S T E < < < < < < < < < <" << endl << endl
<< endl << "PRECIONA UNA TECLA PARA CONTINUAR..."; break;
case 1: cout << endl << " > > > > > > > > > > G A N A S T E ! < < < < < < < < < <" << endl << endl
<< endl << "PRECIONA UNA TECLA PARA CONTINUAR..."; break;
}
}

void borrarTablero(int **&tablero, int s) {


for (int x = 0; x < s; x++)
{
delete[] tablero[x];
}
delete[] tablero;
tablero = NULL;
}

int main() {
int k = 0;
int s = 0;
int m = 0;

int **tablero;
C:\Users\Arturo\Downloads\Minesweeper.cpp 4

mostrarMenu();

do {
k = _getch();

if ((k == '1') | (k == '2') | (k == '3')) {


if (k == '1') { s = 9; m = 10; }
if (k == '2') { s = 16; m = 40; }
if (k == '3') { s = 16; m = 80; }

tablero = crearTablero(s);
ponerMinas(tablero, s, m);
ponerPistas(tablero, s);

int tx = 0;
int ty = 0;
tablero[tx][ty] += 1000;
mostrarTablero(tablero, s);

do {
k = _getch();
switch (k) {
case 75: case 72: case 77: case 80: mover(tablero, s, k, tx, ty); mostrarTablero
(tablero, s); break;
case 32: marcarCelda(tablero, tx, ty); mostrarTablero(tablero, s); break;
case 13: abrirCelda(tablero, s, tx, ty); mostrarTablero(tablero, s); break;
}
if (estadoJuego(tablero, s) >= 1) { _getch(); k = 27; }
} while (k != 27);

borrarTablero(tablero, s);

mostrarMenu();
}

} while (k != '0');

return 0;
}

Potrebbero piacerti anche