elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con recursividad y buscaminas.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con recursividad y buscaminas.  (Leído 3,800 veces)
miguel0542

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Problema con recursividad y buscaminas.
« en: 5 Junio 2016, 23:27 pm »

Desde que tenia 13 (creo) no toco este foro xD. Hoy vengo a que me salve de nuevo. Estoy haciendo un buscaminas den c++ con funciones. El problema es que e la parte donde debo destapar todas las casillas adyacentes del cero utilizo una funcion recursiva. el programa crashea lo he hecho de mil y un maneras diferentes pero no me sale. Espero que alguien pueda ayudarme o almenos explicarme por que es que esto sucede. Saludos! :D

Código:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <stdio.h>

using namespace std;
//Variables publicas
int opc, num_mina, i, j, game_over, num1, num2, fil, col;
bool error;
string dificultad;
//Num 1 y Num 2 son variables random necesarias para evitar que se ponga una mina en el mismo lugar.
//Error va a definir cuando un usuario introduce un valor invalido.
//--------------------------------------------------------------------------------------------------
//Matrices
int matriz_log[10][10];
char matriz_user[10][10];
bool matriz_clop[10][10];
//-------------------------
//Funciones a utilizar
void menu();
void iniciar_arays();
void imprimir();
void inp_col();
void inp_fil();
void abrir_casilla();
void perdiste();
void despejar_casillas(int filI, int colJ);
//-----------------------
//Funciones Void desarrolladas
void menu(){
    do{
        system("cls");
        cout << endl << "       elige la dificultad:" << endl;
        cout << "-----------------------------------" << endl;
        cout << " 1-Facil." << endl << " 2-Intermedio" << endl << " 3-Dificil" << endl;
        cout << "-----------------------------------" << endl;
        cout << "                  ";
        cin >> opc;
        switch(opc){
            case 1:
                num_mina=10;
                error=false;
                dificultad="Facil";
                break;
            case 2:
                num_mina=20;
                error=false;
                dificultad="Intermedio";
                break;
            case 3:
                num_mina=50;
                error=false;
                dificultad="Dificil";
                break;
            default:
                error=true;
                break;
        }
    }while(error==true);
}
void iniciar_arrays(){
    //Se inician los valores de las matrices por defecto,
    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
            matriz_clop[i][j]=false;
            matriz_log[i][j]=0;
            matriz_user[i][j]=' ';
        }
    }
    //Se pone las minas al azar y se evita que se repita la casilla.
    srand((unsigned)time(0));
    for(i=0;i<num_mina;i++){
        num1=rand()%9;
        num2=rand()%9;
        if(matriz_log[num1][num2]==9){
            i--;
        }else{
            matriz_log[num1][num2]=9;
        }
    }
    //Las minas pondran un +1 al rededor de ellos.
    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
            if(matriz_log[i][j]==9){
                if(i-1>=0 && matriz_log[i-1][j]!=9){
                    matriz_log[i-1][j]++;
                }
                if(i-1>=0 && j-1>=0 && matriz_log[i-1][j-1]!=9){
                    matriz_log[i-1][j-1]++;
                }
                if(i-1>=0 && j+1<=9 && matriz_log[i-1][j+1]!=9){
                    matriz_log[i-1][j+1]++;
                }
                if(j-1>=0 && matriz_log[i][j-1]!=9){
                    matriz_log[i][j-1]++;
                }
                if(j+1<=9 && matriz_log[i][j+1]!=9){
                    matriz_log[i][j+1]++;
                }
                if(i+1<=9 && matriz_log[i+1][j]!=9){
                    matriz_log[i+1][j]++;
                }
                if(i+1<=9 && j-1>=0 && matriz_log[i+1][j-1]!=9){
                    matriz_log[i+1][j-1]++;
                }
                if(i+1<=9 && j+1<=9 && matriz_log[i+1][j+1]!=9){
                    matriz_log[i+1][j+1]++;
                }
            }
        }
    }
}
void imprimir(){
    //Se imprime la matriz del usuario
    cout << " ";
    for(i=0;i<10;i++){
        cout << "("  << i << ")";
    }
    cout << "                   ";
    for(i=0;i<10;i++){
        cout << "("  << i << ")";
    }
    cout << "                   ";
    for(i=0;i<10;i++){
        cout << "("  << i << ")";
    }
    cout << endl;
    for(i=0;i<10;i++){
        cout << " ";
        for(j=0; j<10;j++){
            cout << "[" << matriz_user[i][j] << "]";
        }
        cout << "(" << i << ")                ";
        for(int y=0; y<10;y++){
            cout << "[" << matriz_log[i][y] << "]";
        }
        cout << "(" << i << ")                ";
        for(int z=0; z<10; z++){
            cout << "[" << matriz_clop[i][z] << "]";
        }
        cout << "(" << i << ")" << endl;
    }

}
void inp_fil(){
    do{
        system("cls");
        cout << endl << "   Buscaminas " << dificultad << ". Minas: " << num_mina << endl;
        cout << "-----------------------------------" << endl;
        imprimir();
        cout << " Fila: ";
        cin>> fil;
        if(fil>9 || fil<0){
            error=0;
        }else{
            error=1;
        }
    }while(error==0);
}
void inp_col(){
    do{
        system("cls");
        cout << endl << "   Buscaminas " << dificultad << ". Minas: " << num_mina << endl;
        cout << "-----------------------------------" << endl;
        imprimir();
        cout << " Fila: " << fil << endl << " Columna: ";
        cin>> col;
        if(col>9 || col<0){
            error=0;
        }else{
            error=1;
        }
    }while(error==0);
}
void abrir_casilla(){
    if(matriz_log[fil][col]==9){
        for(i=0;i<10;i++){
            for(j=0;j<10;j++){
                if(matriz_log[i][j]==9){
                    matriz_user[i][j]='*';
                }
                matriz_user[fil][col]='X';
            }
        }
        game_over=1;
    }else{
        matriz_user[fil][col]='0'+matriz_log[fil][col];
        matriz_clop[fil][col]=true;
        if(matriz_log[fil][col]==0){
            despejar_casillas(fil,col);
        }
    }
}
void perdiste(){
    system("color 4F");
    system("cls");
    cout << endl << "   Buscaminas " << dificultad << ". Minas: " << num_mina << endl;
    cout << "-----------------------------------" << endl;
    imprimir();
    cout << "Fila: " << fil << endl << "Columna: " << col << endl;;
    cout << "-----------------------------------" << endl;
    cout << "               Perdiste." << endl;
    cout << "-----------------------------------" << endl;
}
void despejar_casillas(int filI, int colJ){
    //destapar
    if(filI-1>=0 && matriz_clop[filI-1][colJ]==false){
        matriz_user[filI-1][colJ]='0'+matriz_log[filI-1][colJ];
        matriz_clop[filI-1][colJ]=true;
    }
    if(filI-1>=0 && colJ-1>=0 && matriz_clop[fil-1][colJ-1]==false){
        matriz_user[filI-1][colJ-1]='0'+matriz_log[filI-1][colJ-1];
        matriz_clop[filI-1][colJ-1]=true;
    }
    if(filI-1>=0 && colJ+1<=9 && matriz_clop[fil-1][colJ+1]==false){
        matriz_user[filI-1][colJ+1]='0'+matriz_log[filI-1][colJ+1];
        matriz_clop[filI-1][colJ+1]=true;
    }
    if(colJ-1>=0 && matriz_clop[fil][colJ-1]==false){
        matriz_user[filI][colJ-1]='0'+matriz_log[filI][colJ-1];
        matriz_clop[filI][colJ-1]=true;
    }
    if(colJ+1<=9 && matriz_clop[fil][colJ+1]==false){
        matriz_user[filI][colJ+1]='0'+matriz_log[filI][colJ+1];
        matriz_clop[filI][colJ+1]=true;
    }
    if(filI+1<=9 && matriz_clop[fil+1][colJ]==false){
        matriz_user[filI+1][colJ]='0'+matriz_log[filI+1][colJ];
        matriz_clop[filI+1][colJ]=true;
    }
    if(filI+1<=9 && colJ-1>=0 && matriz_clop[fil+1][colJ-1]==false){
        matriz_user[filI+1][colJ-1]='0'+matriz_log[filI+1][colJ-1];
        matriz_clop[filI+1][colJ-1]=true;
    }
    if(filI+1<=9 && colJ+1<=9 && matriz_clop[fil+1][colJ+1]==false){
        matriz_user[filI+1][colJ+1]='0'+matriz_log[filI+1][colJ+1];
        matriz_clop[filI+1][colJ+1]=true;
    }
    //Recursividad
    if(matriz_log[filI-1][colJ]==0 && filI-1>=0){
        despejar_casillas(filI-1, colJ);
    }
    if(matriz_log[filI+1][colJ]==0 && filI+1<=9){
        despejar_casillas(filI+1, colJ);
    }

}
//-----------------------------------------------
int main()
{
    system("color F0");
    menu();
    iniciar_arrays();
    game_over=0;
    do{
        inp_fil();
        inp_col();
        abrir_casilla();
    }while(game_over==0);
    switch(game_over){
        case 1:
            perdiste();
    }
    return 0;
}



En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Problema con recursividad y buscaminas.
« Respuesta #1 en: 5 Junio 2016, 23:49 pm »

¡Buenas!

No he leído el código completo porque como no lo he escrito yo me parecía un coñazo, pero el algoritmo que buscas sería el siguiente:

Código:
void despejar(int fila, int columna, tabla)
{
    si(coordenadas_correctas(fila,columna))
    {
        si(condicion para despejar tabla[i,j])
        {
            marcar tabla[fila,columna] como despejada;
            //dejamos la casilla marcada para no entrar en una recursion infinita

            despejar(fila - 1 , columna); //arriba
            despejar(fila + 1 , columna); //abajo
            despejar(fila , columna + 1); //derecha
            despejar(fila , columna - 1); //izquierda
        }
        //sino no se dan las condiciones para seguir y volvemos
        return;
    }

    //sino las coordenadas no son correctas
    return;
}

¡Saludos!

Te dejo un código que, aunque no hace lo que pides, maneja el mismo concepto. La función que te interesa empieza en la línea 18:
Código
  1. #include <stdio.h>
  2.  
  3. #define FILAS 21
  4.  
  5. void mostrar_tabla(char tabla[][FILAS + 1], int filas)
  6. {
  7.    int i;
  8.  
  9.    for(i = 0 ; i < filas ; i++)
  10.        printf("%s\n",tabla[i]);
  11. }
  12.  
  13. int coordenadas_correctas(int fila, int columna)
  14. {
  15.    return fila>= 0 && columna >= 0 && fila < FILAS && columna < FILAS;
  16. }
  17.  
  18. void rellenar(char tabla[][FILAS + 1], int fila, int columna, char relleno)
  19. {
  20.    char caracter_actual;
  21.  
  22.    //nos aseguramos de que en la primera llamada estamos dentro de la tabla
  23.    if(coordenadas_correctas(fila,columna))
  24.    {
  25.        //guardamos el caracter que hay en la posicion dada antes de sobreescribirlo con el de relleno
  26.        caracter_actual = tabla[fila][columna];
  27.        tabla[fila][columna] = relleno;
  28.  
  29.        //si las coordenadas hacia arriba son correctas y el caracter es el mismo que el actual
  30.        if(coordenadas_correctas(fila - 1,columna) && tabla[fila - 1][columna] == caracter_actual)
  31.            rellenar(tabla, fila - 1, columna, relleno); //rellenamos
  32.  
  33.        //...
  34.        if(coordenadas_correctas(fila + 1,columna) && tabla[fila + 1][columna] == caracter_actual)
  35.            rellenar(tabla, fila + 1, columna, relleno);
  36.  
  37.        if(coordenadas_correctas(fila, columna + 1) && tabla[fila][columna + 1] == caracter_actual)
  38.            rellenar(tabla, fila, columna + 1, relleno);
  39.  
  40.        if(coordenadas_correctas(fila, columna - 1) && tabla[fila][columna - 1] == caracter_actual)
  41.            rellenar(tabla, fila, columna - 1, relleno);
  42.    }
  43.  
  44.    return;
  45. }
  46.  
  47. int main(int argc, char *argv[])
  48. {
  49.    char tabla[FILAS][FILAS + 1];
  50.    int i,j;
  51.  
  52.    //rellenamos la tabla con oes
  53.    for(i = 0 ; i < FILAS ; i++)
  54.    {
  55.        for(j = 0 ; j < FILAS ; j++)
  56.            tabla[i][j] = 'o';
  57.  
  58.        tabla[i][j] = '\0';
  59.    }
  60.  
  61.    //hacemos una cruz con cruces
  62.    for(i = 0 ; i < FILAS ; i++)
  63.        tabla[FILAS / 2][i] = tabla[i][FILAS / 2] = '+';
  64.  
  65.    mostrar_tabla(tabla,FILAS);
  66.  
  67.    printf("Pulsar intro para continuar...");
  68.    while(getchar() != '\n');
  69.  
  70.    //dibujamos rayas hacia el origen en cada cuadrante
  71.    rellenar(tabla, FILAS / 4, FILAS / 4, '\\'); //segundo cuadrante
  72.    rellenar(tabla, 3 * FILAS / 4, FILAS / 4, '/'); //tercer cuadrante
  73.    rellenar(tabla, FILAS / 4, 3 * FILAS / 4, '/'); //primer cuadrante
  74.    rellenar(tabla, 3 * FILAS / 4, 3 * FILAS / 4, '\\'); //cuarto cuadrante
  75.  
  76.    mostrar_tabla(tabla,FILAS);
  77.  
  78.    printf("Pulsar intro para continuar...");
  79.    while(getchar() != '\n');
  80.  
  81.    return 0;
  82. }
  83.  


« Última modificación: 6 Junio 2016, 01:06 am por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema de recursividad
Java
lexoazul 6 4,691 Último mensaje 8 Febrero 2010, 22:31 pm
por lexoazul
problema de recursividad????
Java
optimus1007 1 2,645 Último mensaje 18 Marzo 2010, 17:46 pm
por Castiblanco
[C] - Recursividad problema « 1 2 »
Programación C/C++
cbug 10 6,802 Último mensaje 4 Julio 2010, 18:39 pm
por cbug
Problema de entendimiento recursividad.
Programación C/C++
axeelcs 7 5,103 Último mensaje 20 Agosto 2011, 21:34 pm
por BlackZeroX
Problema de recursividad en VB
.NET (C#, VB.NET, ASP)
Anabel3 0 2,313 Último mensaje 26 Junio 2012, 07:17 am
por Anabel3
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines