/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Flood-It (Un juego, Tengo una semana)

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
RodrigoVedder



Registrado: 17 May 2011
Mensajes: 5

MensajePublicado: 17/05/2011 4:42 pm
Título: Flood-It (Un juego, Tengo una semana)

Que tal, vengo a pedir ayuda por que estoy shockeado, no se que mas hacer.
El juego se llama inundación, me lo encargaron hace poco es mi proyecto final.
Consiste en un cuadro de colores de diferentes tamaños, 14 filas x 14 columnas el Small, 21 filas x 21 columnas el Medium y 28 filas x 28 columnas el Large.
Tienes que llenar todo el cuadro de un solo color, llenando los cuadritos que tienes alrededor con un color de esos y así sucesivamente.
Esta en igoogle es un gadget.. aquí les dejo el link:
{%22N%22:14}

Duda 1: Tengo 6 colores y no se como hacer que esos 6 numeros fijos, se revuelvan con el random.. NO quiero generar numeros aleatorios, si no revolver los numeros que ya tengo.
Duda 2: Como llenar los cuadritos del color anterior o bueno el color que seleccionó el usuario con el arreglo bidimencional.. con for? if?.

Aclaración:Lo estoy haciendo en Dev-C++.
Sistema Operativo: Windows 7.
Esto es lo que llevo del código:

Código:
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>

main(){
       
       int b,c,i,j,g,h,cp=0;
       
       srand(time(NULL));
       
       do{ 
       printf("Este juego se llama Inundación, consiste en llenar todo el cuadro de un solo\ncolor, empezando por el primer cuadrito.\nSeleccione un color que este alrededor del mostrado para ir llenando los demás\ncuadritos");
       printf("%cCon que Tama%co desea Jugar?\nPresione 1 para Chico\nPresione 2 para Mediano\nPresione 3 para Grande\n", 168,164);
       scanf("%d", &g);
       
       if (g==1){
       
            b=14;
            c=14; 
            int a[b][c];
           
         system("cls");
       for (i=0; i<b; i++){
       for (j=0 ;j<c; j++){
           a[i][j]=1+rand()%6; /*Genera numeros del 1 al 6 pero los numeros de los colores son diferentes*/
           }
           }
           
        do{   
       for (i=0; i<b; i++){
       for (j=0 ;j<c; j++){
           
       textbackground(a[i][j]);
       printf("   ",a[i][j]);
       }
       printf("\n");
       } 
       
       do{     
          textbackground(BLACK);
          printf("1.- Rosado\n");
          printf("2.- Azul\n");
          printf("3.- Amarillo\n");
          printf("4.- Rojo\n");   
          printf("5.- Celeste\n");
          printf("6.- Verde\n");
          printf("Presione un numero del 1 al 6");
          scanf("%d", &h);
           
          switch(h){
          case 1:
               a[i][j]=13; /* Rosa */
          break;
          case 2:
               a[i][j]=9; /* Azul */
          break;
          case 3:
               a[i][j]=14; /* Amarillo */
          break;
          case 4:
               a[i][j]=12; /* Rojo */
          break;
          case 5:
               a[i][j]=11; /* Celeste */
          break;
          case 6:
               a[i][j]=6; /* Verde */
          break;
          default:
                  printf("Ingrese un color del 1 al 6");
          }
          system("cls");
          }
          while(h>6);
          cp++;
          }
       while(cp<25);
       
       }
       cp=0;
     
       if (g==2){
     
            b=21;
            c=21;   
            int a[b][c];
           
         system("cls");
        for (i=0; i<b; i++){
        for (j=0; j<c; j++){
        a[i][j]=1+rand()%6;
        }
        }
        do{
       for (i=0; i<b; i++){
       for (j=1; j<c; j++){
       textbackground(a[i][j]);
       printf("  ");
       }
       printf("\n");
       }
       do{
          textbackground(BLACK);
          printf("1.- Rosado\n");
          printf("2.- Azul\n");
          printf("3.- Amarillo\n");
          printf("4.- Rojo\n");   
          printf("5.- Celeste\n");
          printf("6.- Verde\n");
          printf("Presione un numero del 1 al 6");
          scanf("%d", &h);
           
          switch(h){
          case 1:
          break;
          case 2:
          break;
          case 3:
          break;
          case 4:
          break;
          case 5:
          break;
          case 6:
          break;
          }
          system("cls");
          }
          while(h>6);
          cp++;
          }
       while(cp<35);
          }
           
          cp=0;
       if (g==3){

            b=28;
            c=28;   
            int a[b][c];
           
         system("cls");
        for (i=0; i<b; i++){
        for (j=0; j<c; j++){
        a[i][j]=1+rand()%6;
        }
        }
        do{ 
       for (i=0; i<b; i++){
       textbackground(a[i][j]);
       printf("  ");
       for (j=1; j<c; j++){
       textbackground(a[i][j]);
       printf("  ");
       }
       printf("\n");
       }
       do{
          textbackground(BLACK);
          printf("1.- Rosado\n");
          printf("2.- Azul\n");
          printf("3.- Amarillo\n");
          printf("4.- Rojo\n");   
          printf("5.- Celeste\n");
          printf("6.- Verde\n");
          printf("Presione un numero del 1 al 6");
          scanf("%d", &h);
             
          switch(h){
          case 1:
          break;
          case 2:
          break;
          case 3:
          break;
          case 4:
          break;
          case 5:
          break;
          case 6:
          break;
          }
          system("cls");
          }
          while(h>6);
          cp++;
          }
       while(cp<50);
       }
       printf("Escriba un numero del 1 al 3");
       getche();
       system("cls");   
       }
       while(g>3);
       
       getch();
}


PD: Los case están incompletos, ahi es donde se supone que selecciona un numero o sea el color y empiezo a rellenar el siguiente cuadrito y así sucesivamente.
Shocked
Volver arriba
Cifuentes678



Registrado: 18 May 2011
Mensajes: 1

MensajePublicado: 18/05/2011 5:57 am
Título: Juego

Solo por preguntar, ¿eres de la UANL?
Volver arriba
polly



Registrado: 19 Jul 2007
Mensajes: 618

MensajePublicado: 18/05/2011 9:02 am
Título:

En cuanto a la primera pregunta: necesitas un algoritmo de "desordenar". Hay muchos en la red.

La segunda pregunta no la entiendo.

S2
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7527
Ubicación: Mexico

MensajePublicado: 18/05/2011 10:56 am
Título:

Un problema con el programa es el uso de conio, eso reduce el numero de usuarios de los foros que tal vez puedan ayudarte (debido a que necesitan un compilador con soporte de esa biblioteca).

Un detalle importante es, en C estandar no puedes declarar un array indicando su numero de elementos mediante variables como es tu caso con:
Código:
int a[b][c];

En su lugar se deben utilizar constantes. Por ejemplo y por simplicidad se puede declarar un array con el tamaño maximo y, ya con el programa en ejecucion, utilizar si es el caso solo una parte de el.

Y si revisas con cuidado cada uno de los tres casos (para los tableros de juego) te daras cuenta que solo se diferencian en el numero de filas, columnas y la variable "cp" (honestamente no entiendo su uso).

En base a eso el programa se puede reducir a:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

#define MAX_FILAS  28
#define MAX_COLS   28

#define ROSA      13
#define AZUL       9
#define AMARILLO  14
#define ROJO      12
#define CELESTE   11
#define VERDE      6

int main(void)
{
   int a[MAX_FILAS][MAX_COLS];
   int b;
   int c;
   int i;
   int j;
   int g;
   int h;
   int cp;
   int cp_limite;
   
   srand((unsigned) time(NULL));
   
   do {
      printf(
         "Este juego se llama Inundación, consiste en llenar todo el cuadro "
         "de un solo\ncolor, empezando por el primer cuadrito.\nSeleccione un "
         "color que este alrededor del mostrado para ir llenando los demás\n"
         "cuadritos"
      );
      printf(
         "%cCon que Tama%co desea Jugar?\n"
         "Presione 1 para Chico\n"
         "Presione 2 para Mediano\n"
         "Presione 3 para Grande\n",
         168,
         164
      );
      scanf("%d", &g);
     
      switch (g){
      case 1:
         b = 14;
         c = 14;
         cp_limite = 25;
         break;
      case 2:
         b = 21;
         c = 21;
         cp_limite = 35;
         break;
      case 3:
         b = 28;
         c = 28;
         cp_limite = 50;
         break;
      }
     
      for (i = 0; i < b; i++) {
         for (j = 0 ; j < c; j++) {
            /*
            ** Genera numeros del 1 al 6 pero los
            ** numeros de los colores son diferentes
            */
            a[i][j] = 1 + rand() % 6;
         }
      }
     
      cp = 0;
      do {
         system ("cls");
         
         for (i = 0; i < b; i++) {
            for (j = 0 ; j < c; j++) {
               textbackground (a[i][j]);
               printf ("  ");
            }
            printf("\n");
         }
         
         do {
            textbackground (BLACK);
            printf("1.- Rosa\n");
            printf("2.- Azul\n");
            printf("3.- Amarillo\n");
            printf("4.- Rojo\n");
            printf("5.- Celeste\n");
            printf("6.- Verde\n");
            puts("Presione un numero del 1 al 6:");
            scanf("%d", &h);
           
            switch (h){
            case 1:
               a[i][j] = ROSA;
               break;
            case 2:
               a[i][j] = AZUL;
               break;
            case 3:
               a[i][j] = AMARILLO;
               break;
            case 4:
               a[i][j] = ROJO;
               break;
            case 5:
               a[i][j] = CELESTE;
               break;
            case 6:
               a[i][j] = VERDE;
               break;
            default:
               printf ("Ingrese un color del 1 al 6");
            }
            system ("cls");
         } while (h > 6);
         
         cp++;
      }while (cp < cp_limite);
     
      puts("Continuar? (1 == si, 0 == no)");
      scanf("%d", &g);
   }while (g == 1);
   
   return EXIT_SUCCESS;
}


Falta agregar la parte donde seleccionas colores al azar (eso lo debes decribir con mas detalle), si se trata de elegir elementos no repetidos dos temas donde se describe esa operacion son:
mostrar aleatoriamente valores de un arreglo
Generar valores aleatorios sin repetir ninguno

Tambien falta cambiar el color de la casilla, para ello se necesita el vinculo a una pagina donde se muestre el juego o una explicacion del mismo.

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
RodrigoVedder



Registrado: 17 May 2011
Mensajes: 5

MensajePublicado: 19/05/2011 7:35 am
Título: Flood-It (Un juego, Tengo una semana)

Gracias rir3760 por el código. Very Happy
Pero no solucionaste el problema, por que creo que no me explique bien.
Con ese asunto del arreglo y los indices con variables, mi maestro me explicó que si se puede, por eso lo puse así ya que B y C son iguales a 14. Supongo que sería lo mismo si pongo 14 indices en las filas y las columnas.
El link del juego lo escribi al principio, es un gadget de igoogle y se llama inundación.
Les dejo este link: http://www.google.com/ig/directory?hl=es&type=gadgets&url=www.labpixies.com/campaigns/flood/flood.xml
Añadir ahora -> Le dan donde dice Igoogle (la imagen arribita) -> Jugar Ahora -> Listo!.

El problema que mas me interesa es:
El juego empieza con un cuadro de 14 filas x 14 columnas con colores Aleatorios.
Si.. aleatorios pero solo son 6 colores.. no salen todos los colores que se pueden manejar en dev c y con conio.
Solo necesito 6 colores.
Significa que son 6 numeros. Cada numero correspondiente a su respectivo color.
VERDE=6
AZUL=9
CELESTE=11
ROJO=12
ROSA=13
AMARILLO=14
Esos son los numeros de los colores, segun investigué los probe y en efecto esos son.
Pero pasa que no tengo idea de como hacer que esos numeros, salgan aleatoriamente.
Con este código: a[i][j]=1+rand()%6; Genera numeros aleatorios del 1 al 6. Lo que quiero es darle los 6 numeros y que los revuelva, que no salgan en la misma posición cada vez.
He estado leyendo bastante y no encuentro información de como hacer eso con el rand.
Mi maestro me dijo que.. tomara los colores.. los definiera como 1, 2, 3, 4, 5 y 6 respectivamente y que el rand genere numeros del 1 al 6.
Pero tampoco tengo idea de como definir los colores a numeros que yo quiero.
El otro problema es: en el cuadro salen muchos colores (solo 6 recuerden pero revueltos) salen desordenados, empiezas por la fila 1 y la columna 1 en dev c seria 0 y 0 supongo. Supongamos que es de color Rojo y alrededor de ese cuadrito tengo otros colores.. por ejemplo Azul, Amarillo y Verde. Entonces selecciono el verde y el primer cuadrito junto con el verde que estaba proximo se hacen de ese color y así sucesivamente.
Hasta llenar el cuadro de Un solo color.
Mi idea es que si el usuario esta en la posicion 0,0 y el color que tiene en la posicion 0,1 es por ejemplo el 14 (amarillo) que la posición 0,0 se convierta en la 0,1... y así sucesivamente. Pero NO tengo ídea de como hacer eso.
Se me ocurre barrer el arreglo, o sea poner dos for en cada case y hacer que el arreglo pase por sus indices y si encuentra el color que presione próximo al actual.. o al anterior.
Que rellene el siguiente de ese color y así. Pero creo que con los for se llenarían todos los que son del color donde estoy. Es algo complicado.

Enserio espero que entren a la página que puse y jueguen ese gadget, para que me entiendan mejor.
Si estudio en la UANL por cierto.
De nuevo Gracias rir por tomarte la molestia y el tiempo^^ si me puedes seguir ayudando sería fantástico. Saludos. Very Happy
PD: LA VARIABLE CP es para contar los pasos que tienes como límite para llenar el cuadro. En el tamaño Chico o Small tienes 25 pasos, en el Medium tienes 35 y en el Large 50.
Por eso la variable cp se va incrementando.
Pero observé que eso ya lo pusiste en cada case, así que no importa.
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7527
Ubicación: Mexico

MensajePublicado: 19/05/2011 10:59 am
Título:

OK. Por partes.

* Tal vez sea correcto (mas bien posible) en tu caso declarar un array mediante variables, por ejemplo:
Código:
b = 14;
c = 14;
int a[b][c];

Solo hay que tener cuidado si se cambia de compilador ya que es una caracteristica del "relativamente" nuevo estandar (ISO-C99) y no todos los compiladores la soportan.

* Para seleccionar uno de los seis colores al azar es facil. Solo tienes que almacenarlos en un array y generar el indice con "rand() % 6". Un programa de ejemplo:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROSA      13
#define AZUL       9
#define AMARILLO  14
#define ROJO      12
#define CELESTE   11
#define VERDE      6

int main(void)
{
   int color[] = {
      ROSA,
      AZUL,
      AMARILLO,
      ROJO,
      CELESTE,
      VERDE
   };
   int num_colores = 6;
   int i;
   int j;
   
   srand((unsigned) time(NULL));
   
   /* Seleccionamos dies veces los colores al azar */
   for (i = 0; i < 10; i++){
      /* Generamos el indice al azar */
      j = rand() % num_colores;
     
      switch (color[j]){
      case ROSA:
         puts("Rosa");
         break;
      case AZUL:
         puts("Azul");
         break;
      case AMARILLO:
         puts("Amarillo");
         break;
      case ROJO:
         puts("Rojo");
         break;
      case CELESTE:
         puts("Celeste");
         break;
      case VERDE:
         puts("Verde");
         break;
      }
   }
   
   return EXIT_SUCCESS;
}

No es el ejemplo mas corto pero su objetivo es que la idea este tan clara como sea posible.

* El tercer punto es el dificil. Aqui vas a necesitar de un buen algoritmo para verificar como cambia el color de las casillas agrupadas a partir de la esquina superior izquierda. El punto clave a resolver es detectar cuales casillas pertenecen a ese grupo.

Aqui lo mejor que puedes hacer es pedir orientacion a tu profesor o esperar que algun otro de los usuarios de los foros te de una recomendacion sobre el algoritmo a utilizar.

No recuerdo algoritmos para reconocer un area irregular en una red (supongo estan relacionados con los laberintos sin solucion). El unico que me viene a la mente es el "Hoshen-Kopelman" pero tal vez sea un desperdicio ya que es para la deteccion de todos los racimos en una red.

Mejor preguntale a ver que pasa.

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
RodrigoVedder



Registrado: 17 May 2011
Mensajes: 5

MensajePublicado: 19/05/2011 5:14 pm
Título:

De nuevo rir muchas gracias, si entendí la idea del rand y lo probre en dev c y en efecto corre muy bien, también le agregue los colores y sí los muestra diferentes cada vez.
Mi problema es que no ocupo un arreglo unidimensional, ocupo un arreglo Bidimensional y no se como asignarle los colores al arreglo bidimensional y tampoco estoy seguro si como lo tengo sea correcto.
Es obvio que no corre por que no se como darle los valores a los índices.
Ya lo que está abajo donde imprime los colores no se si esté bien pero básicamente esa es la ídea que tengo.
Por que forzosamente necesito que imprima, un cuadrito, no toda una fila, o toda una columna, como quien dice que imprima el indice [0][0] y de ahi el [0][1] hasta llegar a las 14 filas x 14 columnas.

Código:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

#define MAX_FILAS  28
#define MAX_COLS   28

#define ROSA      13
#define AZUL       9
#define AMARILLO  14
#define ROJO      12
#define CELESTE   11
#define VERDE      6

int main(void)
{
   int a[MAX_FILAS][MAX_COLS];
   int b;
   int c;
   int i=0;
   int j=0;
   int g;
   int h;
   int m=3;
   int n=3;
   int cp;
   int cp_limite;
 /*Problema numero 1, al asignar los colores no me deja y no se que mas hacer ya intenté darle indices con numeros pero al momento de imprimir, imprime mal*/ 
   int color[m][n]={{ROSA,AZUL,AMARILLO},{ROJO,CELESTE,VERDE}};
   int num=6;
   
   srand((unsigned)time(NULL));
   
   do {
      printf(
         "Este juego se llama Inundación, consiste en llenar todo el cuadro "
         "de un solo\ncolor, empezando por el primer cuadrito.\nSeleccione un "
         "color que este alrededor del mostrado para ir llenando los demás\n"
         "cuadritos"
      );
      printf("%cCon que Tama%co desea Jugar?\n"
         "Presione 1 para Chico\n"
         "Presione 2 para Mediano\n"
         "Presione 3 para Grande\n" ,168,164);
         scanf("%d", &g);
     
      switch (g){
      case 1:
         b = 14;
         c = 14;
         cp_limite = 25;
         break;
      case 2:
         b = 21;
         c = 21;
         cp_limite = 35;
         break;
      case 3:
         b = 28;
         c = 28;
         cp_limite = 50;
         break;
      }
     
      for (i = 0; i < b; i++) {
         for (j = 0 ; j < c; j++) {
            /*
            ** Genera numeros del 1 al 6 pero los
            ** numeros de los colores son diferentes
            */
           a[i][j]=rand()% num;
         }
      }
     
      cp = 0;
      do {
         system ("cls");
         
         for (i = 0; i < b; i++) { 
            for (j = 0 ; j < c; j++) {
                switch (color[i][j]){ /*Problema numero 2, puse color[i][j] por que depende de lo que se almacene en los índices [i] y [j] que se supone tienen los numeros de los colores, Segun YO es así pero el arreglo color no logro asignarle los colores y que sea de dos dimensiones*/
      case ROSA:
           textbackground(13); 
           printf ("  ");
         break;
      case AZUL:
           textbackground(9);
           printf ("  ");
         break;
      case AMARILLO:
           textbackground(14);
           printf ("  ");
         break;
      case ROJO:
           textbackground(12);
           printf ("  ");
         break;
      case CELESTE:
           textbackground(11);
           printf ("  ");
         break;
      case VERDE:
           textbackground(6);
           printf ("  ");
         break;
               }
            }
            printf("\n");
         }

Si me miro exigente, disculpenme Embarassed , o que no quiera buscar más pero enserio no se como y googleo y salen puras respuestas vagas.
Esta es mi ídea de como tiene que ser para que ímprima colores revueltos y solo los que le asigné.
Jaja el problema es que mi maestro no enseña nada, solo encarga tareas, creo que por eso no tengo ídea de los usos correctos de ciertas funciones o cosas, todo lo he investigado.
Chau Very Happy.
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7527
Ubicación: Mexico

MensajePublicado: 19/05/2011 6:58 pm
Título:

No necesitas de un array "bidimensional" (para ser correctos un array de arrays) para almacenar los colores ya que lo unico que haces con ellos es almacenarlos en el tablero de juego (esa es la unica "red" que necesitas).

Solo debes generar los colores, todo el planteamiento del programa original esta (casi) bien. Este con las actualizaciones:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

#define MAX_FILAS  28
#define MAX_COLS   28

#define ROSA        13
#define AZUL         9
#define AMARILLO    14
#define ROJO        12
#define CELESTE     11
#define VERDE        6
#define NUM_COLORES  6

int color[] = {
   ROSA,
   AZUL,
   AMARILLO,
   ROJO,
   CELESTE,
   VERDE
};

int actualizar(int a[][MAX_COLS], int num_filas, int num_cols, int nuevo_color);

int main(void)
{
   int a[MAX_FILAS][MAX_COLS];
   int b;
   int c;
   int i;
   int j;
   int g;
   int cp;
   int cp_limite;
   int estado;
   
   srand((unsigned) time(NULL));
   
   do {
      printf(
         "Este juego se llama Inundación, consiste en llenar todo el cuadro "
         "de un solo\ncolor, empezando por el primer cuadrito.\nSeleccione un "
         "color que este alrededor del mostrado para ir llenando los demás\n"
         "cuadritos"
      );
      printf(
         "%cCon que Tama%co desea Jugar?\n"
         "Presione 1 para Chico\n"
         "Presione 2 para Mediano\n"
         "Presione 3 para Grande\n",
         168,
         164
      );
      scanf("%d", &g);
     
      switch (g){
      case 1:
         b = 14;
         c = 14;
         cp_limite = 25;
         break;
      case 2:
         b = 21;
         c = 21;
         cp_limite = 35;
         break;
      case 3:
         b = 28;
         c = 28;
         cp_limite = 50;
         break;
      }
     
      /* Selecciona los colores al azar */
      for (i = 0; i < b; i++) {
         for (j = 0 ; j < c; j++) {
            /*
            ** Genera numeros del 1 al 6 pero los
            ** numeros de los colores son diferentes
            */
            a[i][j] = color[rand() % NUM_COLORES];
         }
      }
     
      cp = 0;
      do {
         system ("cls");
         
         for (i = 0; i < b; i++) {
            for (j = 0 ; j < c; j++) {
               textbackground (a[i][j]);
               printf ("  ");
            }
            printf("\n");
         }
         
         do {
            textbackground (BLACK);
            printf("1.- Rosa\n");
            printf("2.- Azul\n");
            printf("3.- Amarillo\n");
            printf("4.- Rojo\n");
            printf("5.- Celeste\n");
            printf("6.- Verde\n");
            puts("Presione un numero del 1 al 6:");
            scanf("%d", &g);
         }while (g > 6 || g < 1);
         
         /* Actualizar en base al color seleccionado */
         estado = actualizar(a, b, c, g);
         
         cp++;
      }while (!estado && cp < cp_limite);
     
      puts("Continuar? (1 == si, 0 == no)");
      scanf("%d", &g);
   }while (g == 1);
   
   if (estado)
      puts("Gano!");
   else
      puts("Perdio!");
   
   return EXIT_SUCCESS;
}

int actualizar(int a[][MAX_COLS], int num_filas, int num_cols, int nuevo_color)
{
   /* ... */
   
   return 0;
}


El proceso que falta es actualizar la red en base al nuevo color seleccionado por el usuario para ello se utiliza la funcion "actualizar". Esta realiza la operacion en base a cuatro argumentos:

1) "a" es la red o tablero de juego
2) "num_filas" es el numero de filas seleccionado (14, 21 o 28)
3) "num_cols" es el numero de columnas seleccionado (14, 21 o 28)
4) "nuevo_color" es el nuevo color de la esquina superior izquierda.

El valor de retorno de esa funcion debe ser verdadero (diferente de cero) si todas las casillas de la red han cambiado al mismo color (se ha ganado el juego) o falso (cero) en caso contrario.


De nuevo debes preguntarle a tu profesor por una orientacion sobre cual algoritmo se debe utilizar (depende de tu plan de estudios).

Para que te des una idea una implementacion del algoritmo Hoshen-Kopelman es (C estandar):
Código:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NUM_COLS  16
#define NUM_FILAS 16
#define MAX_NUM_CLUSTERS ((NUM_COLS * NUM_FILAS + 1) / 2)

/*
** Para cada objeto en la matriz se verifica la posible adyacencia con
** sus vecinos en la columna previa y/o fila previa. Esto se define en
** el programa como una pregunta (adyacencia?) y la respuesta es:
*/
enum e_adyacencia {NINGUNA, IZQUIERDA_O_ARRIBA, IZQUIERDA_Y_ARRIBA};

void gen_matriz(int (*matriz)[NUM_COLS]);
void imp_matriz(int (*matriz)[NUM_COLS]);
int cont_clusters(int (*matriz)[NUM_COLS], int *cluster);

int main(void)
{
   int matriz[NUM_FILAS][NUM_COLS];
   int cluster[MAX_NUM_CLUSTERS + 1];
   int i;
   
   srand((unsigned) time(NULL));
   
   gen_matriz(matriz);
   imp_matriz(matriz);
   puts("------------------------");
   
   /* Calculo del numero de clusters utilizando el algoritmo Hoshen-Kopelman */
   cont_clusters(matriz, cluster);
   imp_matriz(matriz);
   puts("------------------------");
   
   /* Estadistica: numero de clusters y cantidad de objetos en cada uno */
   for (i = 1; i <= cluster[0]; i++)
      printf("cluster[%02d] == %2d\n", i, cluster[i]);
   
   return EXIT_SUCCESS;
}

/*
** Generacion de los objetos dentro de la matriz. Se asume que un valor
** distinto de cero indica un objeto mientras que el valor cero indica
** un espacio vacio.
*/
void gen_matriz(int (*matriz)[NUM_COLS])
{
   int i, j;
   
   for (i = 0; i < NUM_FILAS; i++)
      for (j = 0; j < NUM_COLS; j++)
         matriz[i][j] = rand() % 2;
}   

/*
** Impresion de la matriz como una cuadricula
*/
void imp_matriz(int (*matriz)[NUM_COLS])
{
   int i, j;
   
   for (i = 0; i < NUM_FILAS; i++){
      for (j = 0; j < NUM_COLS; j++)
         if (matriz[i][j] != 0)
            printf("%3d", matriz[i][j]);
         else
            printf("   ");
     
      putchar('\n');
   }
}

/*
** Implementacion del algoritmo Hoshen-Kopelman para el conteo del numero
** de clusters y numero de objetos en cada uno de estos. El algoritmo no
** esta optimizado y no se utiliza metodo alguno para acortar la ruta a
** seguir desde una etiqueta en particular hasta su etiqueta "padre".
**
** El valor de retorno de la funcion es el numero de clusters en la matriz,
** este valor tambien se almacena en cluster[0].
*/
int cont_clusters(int (*matriz)[NUM_COLS], int *cluster)
{
   int etiqueta[MAX_NUM_CLUSTERS + 1];
   int num_etiquetas;
   int i, j;
   int p, q;
   
   /*
   ** Procesamiento de cada una de las celdas de la matriz, las
   ** celdas "vacias" (indicado por el valor cero) se ignoran.
   */
   num_etiquetas = 0;
   for (i = 0; i < NUM_FILAS; i++){
      for (j = 0; j < NUM_COLS; j++){
         if (!matriz[i][j])
            continue;
         
         /*
         ** Las variables "p" y "q" indican si existe un objeto adyacente
         ** en la fila previa y/o columna previa, respectivamente.
         */
         p = i && matriz[i - 1][j];
         q = j && matriz[i][j - 1];
         
         switch (p + q){ /* Adyacencia? */
         case NINGUNA:
            matriz[i][j] = ++num_etiquetas;
            etiqueta[matriz[i][j]] = 1;
            break;
         case IZQUIERDA_O_ARRIBA:
            /*
            ** Ahora la variable "p" se utiliza para almacenar el "puntero"
            ** dado por la etiqueta de la fila (o columna) previa y obtener
            ** en base a esta su etiqueta "padre".
            */
            p = matriz[i][j] = matriz[i - p][j - q];
            while (etiqueta[p] < 0)
               p = -etiqueta[p];
            etiqueta[p]++;
            break;
         case IZQUIERDA_Y_ARRIBA:
            /*
            ** Ahora la variables "p" y "q" se utilizan para almacenar los
            ** "punteros" dados por las etiquetas de la fila y columna
            ** previas y obtener en base a estas las etiquetas "padres".
            */
            p = matriz[i - 1][j];
            q = matriz[i][j - 1];
            matriz[i][j] = p < q ? p : q;
           
            while (etiqueta[p] < 0)
               p = -etiqueta[p];
            while (etiqueta[q] < 0)
               q = -etiqueta[q];
           
            /*
            ** Si las etiquetas indicadas por "p" y "q" son diferentes la
            ** etiqueta mayor se reasigna como un elemento "hijo" de la
            ** etiqueta menor.
            */
            if (p < q){
               etiqueta[p] += etiqueta[q] + 1;
               etiqueta[q] = -p; /* "q" se reasigna como "hijo" de "p" */
            }else if (p == q){
               etiqueta[p]++;
            }else /* p > q */ {
               etiqueta[q] += etiqueta[p] + 1;
               etiqueta[p] = -q; /* "p" se reasigna como "hijo" de "q" */
            }
            break;
         }
      }
   }
   
   /*
   ** Con este proceso se copia el numero de objetos por cluster a su
   ** ubicacion final (el array cluster[]) y se calcula el numero total
   ** de clusters almacenandose este valor en cluster[0].
   **
   ** Tambien se copian las etiquetas "padre" a cada uno de sus "hijos",
   ** con esto se asegura que todos los objetos de un cluster utilizaran
   ** una sola etiqueta una vez re-etiquetados.
   */
   etiqueta[0] = cluster[0] = 0;
   for (i = 1; i <= num_etiquetas; i++)
      if (etiqueta[i] > 0){
         cluster[++cluster[0]] = etiqueta[i];
         etiqueta[i] = cluster[0];
      }else
         etiqueta[i] = etiqueta[-etiqueta[i]];
   
   /* Etiquetado final de todos los objetos de la matriz */
   for (i = 0; i < NUM_COLS; i++)
      for (j = 0; j < NUM_FILAS; j++)
         matriz[i][j] = etiqueta[matriz[i][j]];
   
   return cluster[0];
}


Se puede modificar para que, en lugar de considerar el espacio vacio, discrime utilizando el color de las celdas. Pero de nuevo me parece excesivo ya que tal vez exista un algoritmo mejor para realizar la operacion.

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
RodrigoVedder



Registrado: 17 May 2011
Mensajes: 5

MensajePublicado: 23/05/2011 1:26 pm
Título: Gracias

Gracias rir por tu ayuda me ha sido muy util Very Happy.
Ahora solo me queda el problema de los arreglos, mi maestro solo me dijo que sí que necesitaba modificar las posiciones, pero no se como.
Sí hacerlo
Código:
if(a[0][0]=13 && a[0][1]=13 && a[0][2]=13
.... sería INFINITO.
Me imagino que se puede hacer con un for.
Si me dijo que modificara las posiciones, tal vez crear un arreglo mas, que empieze en una posicion antes.. e ir comparando
Cita:
si k[s][r] (Posición anterior) es igual a a[i][j] (Posición actual), que la posición anterior sea igual a la actual.. k[s][r]=a[i][j]
.. solo se me ocurre eso.
Creo que es una ídea muy vaga ya que no solo se tiene que ir llenando el anterior, por ejemplo si son varios colores, en una fila o una columna se tienen que llenar todos esos.
En fín, mi maestro no me dio mucha información de utilidad y el programa es para mañana, ni hablar a seguir trabajando.
De nuevo gracias y si alguién se le ocurre algo, por aquí andamos.
Wink
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7527
Ubicación: Mexico

MensajePublicado: 23/05/2011 5:18 pm
Título:

Eso es lo que hace el algoritmo que mencione: toma un grupo de espacios ocupados/vacios encontrando el numero y tamaño de los racimos. Por ejemplo con una tabla de 10 x 10 su salida puede ser:
Código:
  1              1  1  1     1
  1  1     1  1        1  1   
  1     1     1        1     
     1        1        1  1  1
     1  1     1  1  1  1     
           1  1  1        1   
  1  1     1  1     1  1  1   
        1  1        1  1  1  1
     1     1  1               
  1           1     1  1     1
------------------------
  1              2  2  2     3
  1  1     2  2        2  2   
  1     4     2        2     
     5        2        2  2  2
     5  5     2  2  2  2     
           2  2  2        6   
  7  7     2  2     6  6  6   
        2  2        6  6  6  6
     8     2  2               
  9           2    10 10    11
------------------------
cluster[01] ==  4
cluster[02] == 27
cluster[03] ==  1
cluster[04] ==  1
cluster[05] ==  3
cluster[06] ==  8
cluster[07] ==  2
cluster[08] ==  1
cluster[09] ==  1
cluster[10] ==  2
cluster[11] ==  1


Tu debes hacer algo similar: solo te interesa el primer grupo y en lugar de discriminar mediante espacios ocupados/vacios discriminas en base al color.

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
RodrigoVedder



Registrado: 17 May 2011
Mensajes: 5

MensajePublicado: 23/05/2011 8:05 pm
Título: Casi Listo!

Que tal rir, gracias por la ayuda.
Aquí esta el código casi terminado, solo necesito poner una condición para saber cuando GANA el usuario.
Me imagino que es algo de true o false, pero no se bien como hacerle y no entendí muy bien eso de actualizar que me habías posteado.
Aquí el código casi listo, solo falta ese detalle.
Código:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

#define MAX_FILAS  28
#define MAX_COLS   28

#define ROSA      13
#define AZUL       9
#define AMARILLO  14
#define ROJO      12
#define CELESTE   11
#define VERDE      6
#define NUM_COLORES  6

   int a[MAX_FILAS][MAX_COLS];
   int b;
   int c;
   int color[] = {ROSA,AZUL,AMARILLO,ROJO,CELESTE,VERDE};
   int i=0;
   int j=0;
   int g;
   int h;
   int hh;
   int cp;
   int cp_limite;
   int r;
   int lv=1;
   
void Remplazo();
void ColorRemplazo(int i,int j);

int main()
{
       
   srand(time(NULL));
   
   do {
         system("cls");
      printf("Este juego se llama Inundación, consiste en llenar todo el cuadro"
         "de un solo\ncolor, empezando por el primer cuadrito.\nSeleccione un "
         "color que este alrededor del mostrado para ir llenando los demás\n"
         "cuadritos");
      printf("%cCon que Tama%co desea Jugar?\nPresione 1 para Chico\nPresione 2 para Mediano\nPresione 3 para Grande\n" ,168,164);
         scanf("%d", &g);
     
      switch (g){
      case 1:
         b=14;
         c=14;
         cp=50;
         cp_limite=50;
         break;
      case 2:
         b=21;
         c=21;
         cp=35;
         cp_limite=35;
         break;
      case 3:
         b=28;
         c=28;
         cp=50;
         cp_limite=50;
         break;
      }
     
      for (i=0; i<b; i++) {
         for (j=0 ; j<c; j++) {
           a[i][j] = color[rand() % NUM_COLORES];
         }
      }
 
      do {
         
         system ("cls");
         
         for (i=0; i<b; i++) {
            for (j=0 ; j<c; j++) {
               textbackground (a[i][j]);
               printf ("  ");
            }
            printf("\n");
         }
           
            textbackground (BLACK);
            textcolor(15);
            if (cp==cp_limite)
            printf("\nTiene %d oportunidades\n", cp);
            textcolor(1+rand()%15);
            if (cp<cp_limite)
            printf("\nLe quedan %d oportunidades\n", cp);
            textcolor(13);
            printf("\n1.- Rosa\n");
            textcolor(9);
            printf("2.- Azul\n");
            textcolor(14);
            printf("3.- Amarillo\n");
            textcolor(12);
            printf("4.- Rojo\n");
            textcolor(11);
            printf("5.- Celeste\n");
            textcolor(6);
            printf("6.- Verde\n");
            textcolor(15);
            printf("\nPresione un numero del 1 al 6:");
            scanf("%d", &hh);
         
           if (hh<=6){
           cp--;
           }
         
          switch(hh){
            case 1:
                 h=13;
                 Remplazo();
            break;
            case 2:   
                 h=9;
                 Remplazo();
            break;
            case 3:
                 h=14;
                Remplazo();
            break;
            case 4:
                 h=12;
                 Remplazo();
            break;
            case 5:
                 h=11;
                 Remplazo();
            break;
            case 6:
                 h=6;
                 Remplazo();
            break;
}

           }while ((cp > 0) || (hh>6 || hh<1));
           
      if(true)
      printf("Gano!");
      else
      printf("Perdio!");     
      printf("\nContinuar? (1 == Si, 0 == No)");
      scanf("%d", &g);
     
   }while (g==1);
}

void Remplazo(){
     
           int i=0;
           int j=0;
           r=a[0][0];
           a[i][j]=h;
     ColorRemplazo(i,j);
     }
     
     void ColorRemplazo(int i, int j){
         
                 if(i-1 >= 0){
            if (a[i-1][j]==r){
                   a[i-1][j]=h;
              ColorRemplazo(i-1,j);
          }
     }
   
         if(j-1 >= 0){
            if (a[i][j-1]==r){
                   a[i][j-1]=h;
              ColorRemplazo(i,j-1);
          }
     }
         if(j+1 < c){
            if (a[i][j+1]==r){
                   a[i][j+1]=h;
              ColorRemplazo(i,j+1);
          }
     }
   
         if(i+1 < c){
            if (a[i+1][j]==r){
                   a[i+1][j]=h;
              ColorRemplazo(i+1,j);
          }
     }
}

Espero respuesta, gracias, me alegra haber terminado el programa Very Happy .
PD: también hay un error cuando presionas el mismo numero o sea el mismo color, el compilador se traba.
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com