Matriz Dinamica en c++. Como rellenarla en coordenadas especificas?

Iniciado por xuhipoint, 8 Marzo 2014, 04:43 AM

0 Miembros y 1 Visitante están viendo este tema.

Yoel Alejandro

Cita de: yoel_alejandro en  9 Marzo 2014, 21:27 PM
Hola María. Compatriota!!!, entiendo tu situación pues también soy de Vzla y es triste la situación que vivimos. Los poderosos explotando a los débiles  >:(, no importa el lado político en que se midan.

Leo, lo que quiero decir más específicamente es que el totalitarismo de derecha (Pinochet, Franco, Mussolini) y el de izquierda (Stalin, Fidel, Chávez) son lo mismo; al final sólo pisotear y explotar al pueblo. Robar a manos llenas, porque TODOS sin importar su lado político se hacen ricos y amasan enormes fortunas en el exterior, mientras el pueblo pasa trabajo. Aunque seas un profesional, igual no te alcanza para vivir. En Venezuela estamos mal, mal, mal .... la GN reprime y maltrata a la gente, a algunos los han lesionado, quemado, golpeado, secuestrado, perdido un ojo, y otros han perdido la vida. No hay comida. No se puede salir del país porque no hay Aerolíneas (el gobierno les debe una fortuna y suspendieron el servicio) y es un problema para otorgar los dólares o euros. Así que ni soñar con visitar un días las Canarias. Por cierto, ¿cómo es la situación allá? Espero que mejor que aquí, y si pensabas venir algún día a Vzla no lo hagas en este momento porque al saber que eres extranjero capaz y te acusan de agente de la CIA y te llevan preso.

Y agradezco la solidaridad de ustedes los Canarios, yo creo que la cultura Hispana, Canaria y Latinoamericana se parece mucho. Por cierto, ¿Canarios y Españoles peninsulares se llevan bien o mal entre sí?

Respecto al buscaminas pareces adivinar porque justamente tuve que buscar en google ya que se me había olvidado como se jugaba, jaja. Corrí tu programa y perfecto!!!, ahora sólo hace falta la parte dónde se desarrolla el juego en sí, o sea, se van descubriendo las minas. Por eso le pregunté a María si se puede usar getch() ya que en ese caso el juego sería más interactivo y nos podemos ir  desplazando por directamente por las casillas en lugar que estar preguntando coordenadas  :huh:
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

xuhipoint

hola yoe, querido compatriota, pues si la situación de Venezuela no esta facil, creo que estamos en el peor momento. Yo solo rezo porque todo termina bien y no sigan aumentando los números de muertos, que aunque no los conozca me duelen porque son mis hermanos. Y bueno referente al proyecto solo puedo utilizar iostream y string, tengo que crear una matriz dinamica, luego ingresar el numero de minas y las coordenadas donde estaran las mismas, cubrir mi matriz y luego destaparla segun la posicion del usuario, hasta el momento este es mi codigo pero no logro poner
Código (cpp) [Seleccionar]
#include <iostream>


using namespace std;

void imprimir (char **Matriz,int dim);
void colocar_minas (char **Matriz,int dim);


int main(void) {
   
  int dim,n;
  char ch=35,sin_bomba=48;

  cout << "Introduzca la dimension de la matriz: ";
  cin >> dim;
  char **Matriz = new char *[dim];
  for (int j = 0; j < dim; j++)
    Matriz[j] = new char [dim];
  for (int i = 0; i < dim; i++)
    for (int j = 0; j < dim; j++)
      Matriz[i][j]=sin_bomba;
     
  colocar_minas  (Matriz,dim);


for (int i = 0; i < dim; i++)
    for (int j = 0; j < dim; j++){
      n = 1 ;
      if (n<2 && Matriz[i][j]=='0')
        Matriz[i][j]=ch;
      else if (n==2 || n==3)
        Matriz[i][j]='*';
    }
 
}

void imprimir (char **Matriz,int dim) {

    for (int i = 0; i < dim; i++) {
      cout << "\t\t" ;
      for (int j = 0; j < dim; j++){
        cout << ' '  << Matriz[i][j] << ' ' ;
      }
      cout << "\n\n";
    }
    cout << "\n\n";
}


void colocar_minas (char **Matriz,int dim){
  int **cont,bomba=42;
  cont = new int *[dim];
  for (int j = 0; j < dim; j++)
    cont[j] = new int [dim];
  for (int i = 0; i < dim; i++)
    for (int j = 0; j < dim; j++)
      cont[i][j]=0;
  int numero,fil,col,k,l,contador=0;
  cout << "minas:";
  cin >> numero;
  for (int i = 0; i < numero; i++){
     
    do{
      cout << "Introduzca fila ";
      cin >> fil;
    }while(fil<1 || fil>dim);
    fil=fil-1;

    do{
      cout << "Introduzca columna ";
      cin >> col;
    }while(col<1 || col>dim);
    col=col-1;
    Matriz[fil][col]=bomba;
   
    cout<<"\tM["<<fil+1<<","<<col+1<<"]="<<Matriz[fil][col]<< "\n\n";
  }
  imprimir (Matriz,dim);

  for ( fil = 0 ;fil < dim; fil++) {
    for ( col = 0; col < dim; col++){
    contador=0;
      for ( k = -1; k < 2; k++) {
        for ( l = -1; l < 2; l++){
          if (fil+k < 0 || col+l < 0 || fil+k > dim-1 || col+l > dim-1)
            continue;
          else{
            contador+=(Matriz[fil+k][col+l]-'0');
          }
        }
      }
      cont[fil][col]=contador;
    }
  }

}

leosansan

Cita de: xuhipoint en 10 Marzo 2014, 02:11 AM
...........................................................
hasta el momento este es mi codigo pero no logro poner
.................................................

¿Qué no logras poner?.

Sabemos algo de C e incluso de C++ pero no somos pitonisos.............

¡¡¡¡ Saluditos! ..... !!!!



xuhipoint

Ya he modificado un poco el codigo, pero donde esta colocada la mina en vez de salir unos a su alrededor siguen saliendo asteriscos.
Código (cpp) [Seleccionar]
#include <iostream>


using namespace std;

void imprimir (char **Matriz,int dim);
void colocar_minas (char **Matriz,int dim);


int main(void) {

  int dim;
  char ch=35;

  cout << "Introduzca la dimension de la matriz: ";
  cin >> dim;
  char **Matriz = new char *[dim];
  for (int j = 0; j < dim; j++)
    Matriz[j] = new char [dim];
  for (int i = 0; i < dim; i++)
    for (int j = 0; j < dim; j++)
      Matriz[i][j]='0';
  colocar_minas  (Matriz,dim);
  imprimir (Matriz,dim);

  for (int i = 0; i < dim; i++)
    for (int j = 0; j < dim; j++){
       
      if (Matriz[i][j]=='0')
        Matriz[i][j]=ch;
      if (Matriz[i][j]=='*' )
        Matriz[i][j]=ch;
    }
imprimir (Matriz,dim);

}

void imprimir (char **Matriz,int dim) {
    for (int i = 0; i < dim; i++) {
      cout << "\t\t" ;
      for (int j = 0; j < dim; j++){
        cout << ' '  << Matriz[i][j] << ' ' ;
      }
      cout << "\n\n";
    }
    cout << "\n\n";
}


void colocar_minas (char **Matriz,int dim){
  int **cont;
  cont = new int *[dim];
  for (int j = 0; j < dim; j++)
    cont[j] = new int [dim];
  for (int i = 0; i < dim; i++)
    for (int j = 0; j < dim; j++)
      cont[i][j]=0;
  int numero,fil,col,k,l,contador=0;
  cout << "Ingrese minas:";
  cin >> numero;
  for (int i = 0; i < numero; i++){
   
    do{
      cout << "Introduzca fila: ";
      cin >> fil;
    }while(fil<1 || fil>dim);
    fil=fil-1;

    do{
      cout << "Introduzca columna: ";
      cin >> col;
    }while(col<1 || col>dim);
    col=col-1;
    Matriz[fil][col]='*';
   
    cout<<Matriz[fil][col]<< "\n\n";
  }
  imprimir (Matriz,dim);

  for ( fil = 0 ;fil < dim; fil++) {
    for ( col = 0; col < dim; col++){
    contador=0;
      for ( k = -1; k < 2; k++) {
        for ( l = -1; l < 2; l++){
          if (fil+k < 0 || col+l < 0 || fil+k > dim-1 || col+l > dim-1)
            continue;
          else{
            contador+=(Matriz[fil+k][col+l]-'0');
          }
        }
      }
      cont[fil][col]=contador;
    }
  }
  for ( fil = 0 ;fil < dim; fil++)
    for ( col = 0; col < dim; col++)
      Matriz[fil][col]=cont[fil][col]+48;

}

eferion

Código (cpp) [Seleccionar]

  Matriz[fil][col]='*';

  // ...

  for ( fil = 0 ;fil < dim; fil++)
    for ( col = 0; col < dim; col++)
      Matriz[fil][col]=cont[fil][col]+48;


Ese bucle borra, literalmente, la posición de las minas. Deberías comprobar, antes de machacar el valor de Matriz, que la posición no contiene una mina.

Código (cpp) [Seleccionar]
cout << "\n\n";

Hay una constante definida en el espacio de nombres std que es endl. Tiene la ventaja de que es portable, ya que la STL en linux implementa su versión de endl y Windows hace lo propio.

Es más portable usar lo siguiente:

Código (cpp) [Seleccionar]
cout << endl << endl;

Más cosas...

Código (cpp) [Seleccionar]

for ( fil = 0 ;fil < dim; fil++) {
    for ( col = 0; col < dim; col++){
    contador=0;
      for ( k = -1; k < 2; k++) {
        for ( l = -1; l < 2; l++){
          if (fil+k < 0 || col+l < 0 || fil+k > dim-1 || col+l > dim-1)
            continue;
          else{
            contador+=(Matriz[fil+k][col+l]-'0');
          }
        }
      }
      cont[fil][col]=contador;
    }
  }


contador += ¿¿que??
A ver, si en Matriz las minas se representan con asteriscos... por qué no buscas asteriscos para contarlos?? la transformación que estás haciendo ahí no tiene ningún sentido. Dicho de otra forma:

'*'-'0' == '#'

¿Te suena el caracter '#' si solo pones una mina? Ya sabes de dónde sale.

leosansan

#15
Se te fue un gazapo en el código:

Código (cpp) [Seleccionar]

do{
     cout << "Introduzca columna: ";
     cin >> col;
   }while(col<1 || col>dim);
   col=col-1;
   Matriz[fil][col]='*'; /* <==AQUI */ /*ES ==>  */Matriz[fil][col]='1';

   cout<<Matriz[fil][col]<< "\n\n";



¡¡¡¡ Saluditos! ..... !!!!




eferion

Cita de: leosansan en 10 Marzo 2014, 13:43 PM
Se te fue un gazapo en el código:

Código (cpp) [Seleccionar]

do{
      cout << "Introduzca columna: ";
      cin >> col;
    }while(col<1 || col>dim);
    col=col-1;
    Matriz[fil][col]='*'; /* <==AQUI */ /*ES ==>  */Matriz[fil][col]='1';

    cout<<Matriz[fil][col]<< "\n\n";



¡¡¡¡ Saluditos! ..... !!!!





Pero ese cambio tiene un problema... que luego cuando vaya a contar... cómo identifica la posición original de la mina??

Pongamos el caso:


1 1 0
0 0 0
0 0 0
0 0 0


Después de calcular las minas se tiene


1 1 1
1 1 1
0 0 0


Eso es incorrecto porque lo lógico es que la salida fuese


1 * 1
1 1 1
0 0 0


Si no marcas dónde están las minas mal vamos.

leosansan

#17
Amigo eferion habrá que repasar el juego del buscaminas y, por favor, no tergiversar o copiar bien el código que cuelgo.

De acuerdo a mi código, un par de mensajes anteriores a este, una salida sería:


Citar
Introduzca la dimension de la matriz: 3

Introduzca numero de minas (numero):2

Colocando la mina : 1
Introduzca fila (1-numero): 1
Introduzca columna (1-numero): 1
       M[1,1]=1


Colocando la mina : 2
Introduzca fila (1-numero): 1
Introduzca columna (1-numero): 2
       M[1,2]=1

                1  1  0

                0  0  0

                0  0  0



                2  2  1

                2  2  1

                0  0  0


               
               2  *  1

               2  2  *

               █  *  *
*



Otro ejemplo:


1  0  0  0  0

1  0  0  0  0

0  0  0  0  1

0  0  0  0  0

0  0  0  0  0



2  2  0  0  0

2  2  0  1  1

1  1  0  1  1

0  0  0  1  1

0  0  0  0  0



2  2  █  █  █

*  2  *  *  *

*  1  █  1  1

*  *  *  *  1

*  █  █  *  █




En la matriz del juego cada casilla se obtiene sumando las minas que tiene alrededor.

La primera matriz anterior es donde están colocadas las minas, la segunda matriz es la que resulta de sumar a cada casilla las ocho, como máximo, que le rodean y la tercera fue una improvisación de ocultar algunas de las casillas. Como ves las matrices tienen toda su lógica con arreglo a las reglas del juego.



¡¡¡¡ Saluditos! ..... !!!!



REEDITADIDO:

Cita de: eferion en 10 Marzo 2014, 13:27 PM
.................................................................
contador += ¿¿que??
A ver, si en Matriz las minas se representan con asteriscos... por qué no buscas asteriscos para contarlos?? la transformación que estás haciendo ahí no tiene ningún sentido. Dicho de otra forma:

'*'-'0' == '#'

¿Te suena el caracter '#' si solo pones una mina? Ya sabes de dónde sale.[/size]

* Los asteriscos no representan las minas sino los 1 de la matriz inicial. Los asteriscos son para ocultar información.

* El cuadrado que sale es porque en el juego parte del tablero no es seleccionable.

* contador+= él más los que tiene alrededor.

*  '#' no es '*'-'0' sino el caracter '35' que xuhipoint estimó coger, no sé por qué diablos lo hizo.


Observar la siguiente captura de un juego del buscaminas:


Se ve que en ciertas casillas salen números, las minas totales de él y los que le rodean, otras casillas están levantadas y serían el equivalente a los ateriscos, hay que seleccionar y que no te estalle una mina y, por último, hay otras casillas que son planas, las que no intervienen en el juego, no se puede picar en ellas, o sí se puede pero no aportan nada.


eferion

Cita de: leosansan en 10 Marzo 2014, 14:11 PM
Se ve que en ciertas casillas salen números, las minas totales de él y los que le rodean, ...

Dudo mucho que en el buscaminas puedas encontrar una casilla con el número 9 ( 8 que le rodean más la mina de la propia casilla )

leosansan

#19
Cita de: eferion en 10 Marzo 2014, 15:06 PM
Dudo mucho que en el buscaminas puedas encontrar una casilla con el número 9 ( 8 que le rodean más la mina de la propia casilla )



Fíjate en los ejemplos, los números son más bien bajos.

Es un juego y si lo haces entrando a mano las minas "puede" darse el caso, aunque sería tonto ya que declaras a todas las que le rodean como minas. Por eso se eligen las minas más separadas, lo que da como resultado números  bajos para crear mayor incertidumbre.



¡¡¡¡ Saluditos! ..... !!!!