Recorrer matrices

Iniciado por Ana_10, 7 Febrero 2014, 06:27 AM

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

Ana_10

ya lo solucione gracias =)

BlackM4ster

#1
Publico ésto como debería ir:

Bueno, mi duda es la siguiente:
Tengo mi proyecto algo parecido al candy crush, el juego recorre la matriz hecha con numeros aleatorios y cuando encuentra 3 numeros o 4 iguales ya sea fila o columna le avisa al usuario en que columna y fila están. Eso me sale.

El problema que tengo es el siguiente: los numeros encontrados ya sean en fila o columna se deben intercambiar con numeros aleatorios, pero solo los numeros aleatorios cambian, el resto de la matriz se mantiene igual

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define MAXFIL 9
#define MAXCOL 9

void tablero (int matriz[MAXFIL][MAXCOL]);
int mensajes();
int validarCasilla(int f1,int c1,int f2, int c2);
void cambiarCasilla (int matriz[MAXFIL][MAXCOL],int f1,int c1,int f2,int c2);
int buscarCaramelosVertical (int matriz[MAXFIL][MAXCOL],int puntos);
int buscarCaramelosHorizontal (int matriz[MAXFIL][MAXCOL],int puntos);
int bajarCaramelosHori(int matriz[MAXFIL][MAXCOL],int f, int c);
int bajar4CaramelosVerti(int matriz[MAXFIL][MAXCOL],int f, int c);
int bajar3CaramelosVerti(int matriz[MAXFIL][MAXCOL],int f, int c);

void tablero (int matriz[MAXFIL][MAXCOL]){ // cambai numeros por simbolos
int i,j,e;
      printf("        1       2       3       4       5       6       7       8       9 \n");
      printf("-----------------------------------------------------------------------------");
  for (i=0;i<MAXFIL;i++){
     printf("\n");
     printf("%i -- ", i+1);
     for (j=0;j<MAXCOL;j++){
         
        if (matriz[j]==1)
        {
           e=1;
           printf("\t%c",e);
        }
        if (matriz[j]==2)
        {
           e=2;
           printf("\t%c",e);
        }
        if (matriz[j]==3)
        {
           e=4;
           printf("\t%c",e);
        }
        if (matriz[j]==4)
        {
           e=5;
           printf("\t%c",e);
        }
        if (matriz[j]==5)
        {
           e=15;
           printf("\t%c",e);
        }
     }
     printf("\n");
  }
  getch();  
}


int mensajes(){
  printf("\n\n................|| Bienvenido al Primer Nivel ||................\n\n");
   printf("----->>Recuerde: \n\n");
   printf(">>Tiene 40 movimientos\n\n");
   printf(">>Las Filas son Horizontales\n\n");
  printf(">>Las Columnas son Verticales\n\n");
  printf("------------------------------------------------------------------------------\n\n\n");
  system("pause");
  return 0;
}



int validarCasilla(int f1,int c1,int f2, int c2){ // valida  fila y columna que ingresa el ususario  f1 y c1 son las filas y las clomunas donde se encuentra el numero y f2 y c2 son las casillas a donde quiere mover el usuario
 
     if((f1<1||f2<1)||(f1>9||f2>9)||(c1<1||c2<1)||(c1>9||c2>9)){
        printf("\n\n                   >>Ingrese numeros del 1 al 9\n\n");
        return 1;
       
     }
 
      if ((f1<=9 && f2<=9) && (f1>=1 && f2>=1) && (c1<=9 && c2<=9) && (c1>=1 && c2>=1)){
         if ((f1==f2)&&(c1==c2)){
            printf("\n\n               >>Ingrese Coordenadas DIFERENTES\n\n");
           return 1;
             
          }
        return 0;
     }
}

void cambiarCasilla (int matriz[MAXFIL][MAXCOL],int f1,int c1,int f2,int c2){
  int i,j,aux; // aux es un valor temporal para guardar la casilla
  for (i=0;i<MAXFIL;i++){
     for (j=0;j<MAXCOL;j++){
        aux=matriz[f2-1][c2-1];
        matriz[f2-1][c2-1]=matriz[f1-1][c1-1]; //le resto 1 xk los numero que ingresa el usuario son del 1 al 9 y la matriz toma en cuenta el cero
        matriz[f1-1][c1-1]=aux;
     }
  }
  printf("\n");
 
getch();  
}

int buscarCaramelosVertical (int matriz[MAXFIL][MAXCOL],int puntos){
  printf("\n\n------------------>> BUSQUEDA VERTICAL:\n\n");
  int contador=1;
  int f=0; // es la fila en donde se encuentra el ultimo caramelo repetido
  int c=0; // es la columna en donde se encuentra el ultimo caramelo repetido
  int i,j;
  for (j=0;j<MAXCOL;j++){
     for (i=0;i<7;i++){
             if (matriz[j]==matriz[i+1][j]){
                contador++;
              f=i+1;// la fila de referencia en donde se encuentra el ult caramelo repetido aumenta en uno
              c=j+1;// la columna de referencia en donde se encuentra el ult caramelo repetido aumenta en uno
             }
     
           else if (matriz[j]!=matriz[i+1][j]){
                 contador=1;
           }
           
           if (contador==3 && i<=6 && (matriz[i+1][j]==matriz[i+2][j])){  // esta linea no se si este bien .-.
              f=i+3; // se queda en la utlima posicion donde encontro el caramelo
              printf("\n\n ENCONTRO 4 CARAMELOS EN LA COLUMNA: %d  DESDE LA FILA %d A LA FILA %d \n",c,f-3,f);
              puntos=puntos+7;
              bajar4CaramelosVerti(matriz,f,c);
              break;
             }
             
             else if (contador==3 && i<=7){
               f=i+2;
                  printf("\n\n ENCONTRO 3 CARAMELOS EN LA COLUMNA: %d  DESDE LA FILA %d A LA FILA %d \n",c,f-2,f);
                  puntos=puntos+5;
                  bajar3CaramelosVerti(matriz,f,c);
              break;
           }  
             
           
     }
  }
  return puntos;
}

int buscarCaramelosHorizontal (int matriz[MAXFIL][MAXCOL],int puntos){ //
  printf("\n\n------------------>> BUSQUEDA HORIZONTAL:\n\n");
  int contador=1;
  int f=0; //fila de refecrencia
  int c=0; //columna de referencia
  int i,j;
  for(i=0;i<MAXFIL;i++){
     for(j=0;j<7;j++){
        if (matriz[j]== matriz[j+1])
           contador=contador+1;
           f=i+1;
           c=j+1;
           puntos=puntos;

        if (matriz[j]!=matriz[j+1])
           contador=1;
           puntos=puntos;
           
           if (contador==3 && j<=6 && (matriz[j+1]==matriz[j+2])){
              c=j+3;
              printf("\n\n ENCONTRO 4 CARAMELOS DESDE LA COLUMNA: %d  HASTA LA COLUMNA %d EN LA FILA %d \n",c-3,c,f); //muestra la columan y la fila donde se encuentra
               puntos=puntos+7;
               matriz[j]=bajarCaramelosHori(matriz,f,c); //llama funcion para cambiar caramelos
               matriz[j]=bajarCaramelosHori(matriz,f,c-1);
               matriz[j]=bajarCaramelosHori(matriz,f,c-2);
               matriz[j]=bajarCaramelosHori(matriz,f,c-3);
           break;
           }
           
           if (contador==3 && j<=7){
              c=j+2;
              printf("\n\n ENCONTRO 3 CARAMELOS DESDE LA COLUMNA: %d  HASTA LA COLUMNA %d EN LA FILA %d \n",c-2,c,f);
               puntos=puntos+5;
               matriz[j]=bajarCaramelosHori(matriz,f,c);
               matriz[j]=bajarCaramelosHori(matriz,f,c-1);
               matriz[j]=bajarCaramelosHori(matriz,f,c-2);
           break;
           }
     }
  }
return puntos;

}

int bajarCaramelosHori(int matriz[MAXFIL][MAXCOL],int f, int c){
  int i;
  if(f==1&&c<=9){
     matriz[0][c-1]=1+(rand()%5); // le resto 1 xk f y c estan con 1 aumentado para que al imprimirse se presenten desde el 1 al 9
  }
  else if(f==2&&c<=9){
     matriz[1][c-1]=matriz[f-2][c-1];
     matriz[0][c-1]=1+(rand()%5);
  }
  else if(f>=3&&c<=9){
     for (i=f-1;i>=1;i--){
        matriz[c-1]=matriz[i-1][c-1];
     }
     matriz[0][c-1]=1+(rand()%5);
  }
}


int bajar4CaramelosVerti(int matriz[MAXFIL][MAXCOL],int f, int c){ // esta funcion si no me sale
  int i,j;
  if (f==4){ // revisa si f se encuentra en la fila 4
     for (i=0;i<4;i++){
        if (j==c){ // c no cambia xk es vertical por loq ue se manitene en la msima columna solo varia fila
           matriz[c-1]=1+(rand()%5);
        }
     }
  }
  if (f==5){
     matriz[f-1][c-1]=matriz[0][c-1];
     for (i=0;i<4;i++){
        if (j==c){
           matriz[c-1]=1+(rand()%5);
        }
     }
  }
  if (f==6){
     matriz[f-1][c-1]=matriz[1][c-1];
     matriz[f-2][c-1]=matriz[0][c-1];
     for (i=0;i<4;i++){
        if (j==c){
           matriz[c-1]=1+(rand()%5);
        }
     }
  }
  if (f==7){
     matriz[f-1][c-1]=matriz[2][c-1];
     matriz[f-2][c-1]=matriz[1][c-1];
     matriz[f-3][c-1]=matriz[0][c-1];
     for (i=0;i<4;i++){
        if (j==c){
           matriz[c-1]=1+(rand()%5);
        }
     }
  }
  if (f==8){
     matriz[f-1][c-1]=matriz[3][c-1];
     matriz[f-2][c-1]=matriz[2][c-1];
     matriz[f-3][c-1]=matriz[1][c-1];
     matriz[f-4][c-1]=matriz[0][c-1];
     for (i=0;i<4;i++){
        if (j==c){
           matriz[c-1]=1+(rand()%5);
        }
     }
  }
  if (f==9){
     matriz[f-1][c-1]=matriz[4][c-1];
     matriz[f-2][c-1]=matriz[3][c-1];
     matriz[f-3][c-1]=matriz[2][c-1];
     matriz[f-4][c-1]=matriz[1][c-1];
     matriz[f-5][c-1]=matriz[0][c-1];
     for (i=0;i<4;i++){
        if (j==c){
           matriz[c-1]=1+(rand()%5);
        }
     }
  }                          
}

int bajar3CaramelosVerti(int matriz[MAXFIL][MAXCOL],int f, int c){ // esta toampoco sale .-.
  int i,j;
  if (f==3){
     for (i=0;i<3;i++){
        if(j==c){
           matriz[c-1]=1+(rand()%5);
        }
     }
  }
  if (f==4){
     matriz[f-1][c-1]=matriz[0][c-1];
     for (i=0;i<3;i++){
        if (j==c){
           matriz[c-1]=1+(rand()%5);
        }
     }
  }
  if (f==5){
     matriz[f-1][c-1]=matriz[1][c-1];
     matriz[f-2][c-1]=matriz[0][c-1];
     for (i=0;i<3;i++){
        if (j==c){
           matriz[c-1]=1+(rand()%5);
        }
     }
  }
  if (f==6){
     matriz[f-1][c-1]=matriz[2][c-1];
     matriz[2][c-1]=1+(rand()%5);
     matriz[f-2][c-1]=matriz[1][c-1];
     matriz[1][c-1]=1+(rand()%5);
     matriz[f-3][c-1]=matriz[0][c-1];
     matriz[0][c-1]=1+(rand()%5);
  }
  if (f==7){
     matriz[f-1][c-1]=matriz[3][c-1];
     matriz[3][c-1]=matriz[0][c-1];
     matriz[f-2][c-1]=matriz[2][c-1];
     matriz[f-3][c-1]=matriz[1][c-1];
     for (i=0;i<3;i++){
        if (j==c){
           matriz[c-1]=1+(rand()%5);
        }
     }
  }
  if (f==8){
     matriz[f-1][c-1]=matriz[3][c-1];
     matriz[f-2][c-1]=matriz[2][c-1];
     matriz[f-3][c-1]=matriz[1][c-1];
     matriz[f-4][c-1]=matriz[0][c-1];
     for (i=0;i<3;i++){
        if (j==c){
           matriz[c-1]=1+(rand()%5);
        }
     }
  }
  if (f==9){
     matriz[f-1][c-1]=matriz[5][c-1];
     matriz[5][c-1]=matriz[2][c-1];
     matriz[f-2][c-1]=matriz[4][c-1];
     matriz[4][c-1]=matriz[1][c-1];
     matriz[f-3][c-1]=matriz[3][c-1];
     matriz[3][c-1]=matriz[0][c-1];
     for (i=0;i<3;i++){
        if (j==c){
           matriz[c-1]=1+(rand()%5);
        }
     }
  }              
}


int main(){
  mensajes();
  system("cls");
  srand(time(NULL));
  printf("\n\n\t\t.....|| Cargando Colores ||....\n\n\n\n");
  int i,j;
  int matriz[MAXFIL][MAXCOL]={0}; // llena matriz de ceros
  for(i=0;i<MAXFIL;i++){
     for(j=0;j<MAXCOL;j++){
        matriz[j]=1+(rand()%5); // genera numeros aleatorios
     }
  }
  tablero (matriz);
  int f1,f2,c1,c2;
  printf("\n\n....................>> Primera Coordenada:\n\n");
  printf(">>Ingrese fila:"); // donde se encuentra el caramelo
  scanf("%d",&f1);
  printf(">>Ingrese columna:");
  scanf("%d",&c1);
  printf("\n\n....................>> Segunda Coordenada:\n\n");
  printf(">>Ingrese fila:"); // posicion donde desea mover el caramelo
  scanf("%d",&f2);
  printf(">>Ingrese columna:");
  scanf("%d",&c2);
  int puntos=0;
  validarCasilla(f1,c1,f2,c2); // verifica si los numeros ingresados por el usuario estan correctos
  if (validarCasilla(f1,c1,f2,c2)==0){ // si la funcion es verdadera
     printf("\n\n\t\t.....|| MEZCLA DE COLORES ||....\n\n\n\n");
     cambiarCasilla (matriz,f1,c1,f2,c2); // cambia las casillas
     tablero(matriz);
     printf("\n\n------------------------------------------------------------------------------\n\n\n");
     printf("\n\n\t\t.....|| BUSQUEDA DE COLORES ||....\n\n\n\n");
     puntos=buscarCaramelosVertical (matriz,puntos)+buscarCaramelosHorizontal (matriz,puntos); // suma los putnos
     printf("\n\n------------------->>Usted posee %d puntos \n\n",puntos);
     printf("\n\n------------------------------------------------------------------------------\n\n\n");
     printf("\n\n\t\t.....|| BAJANDO COLORES ||....\n\n\n\n");
     tablero (matriz);
  }
} ;)


Cuando llegue a casa, le echo un vistazo.
Edito: Limpia un poco tu código, por favor, ni siquiera me compila
- Pásate por mi web -
https://codeisc.com

Ana_10

Gracias =) lo que he hecho en el codigo es de lo que he buscado así que perdona cualquier barbaridad .-.