Bienvenido

Bienvenido
Disfruta el contenido

viernes, 19 de diciembre de 2014

Programacion en C Juego de buscaminas


En este articulo aqui les comparto un codigo para un juego en C pensado en reproducir el funcionamiento del juego incuido en Windows. Este codigo fue probado en el compilador Dev C++ que puede descargarse gratuitamente via web.



APOYO A ENCUESTA 
Hola a todos les escribo para apoyarme con una pequeña encuesta a traves deEncuesta Facil solo te tomara un minuto. 



Les dejo la direccion en este URL 
http://www.encuestafacil.com/RespWeb/Qn.aspx?EID=2051724



Espero que la informacion de este foro les sea de utilidad y gracias por sus visitas 




Este juego esta pensado sobre todo para repasar y reafirmar nuestra tecnica en C para el manejo de arreglos y uso de funciones aleatorias las cuales en este programa tienen una importancia para colocar las bombas y agregar mensajes al usuario con la idea de hacer mas interactivo el juego.

El programa se encuentra segmentado en 4 funciones y un main que lleva a cabo la ejecucion del juego. El funcionamiento del juego se basa en un arreglo bidimensional el cual esta cargado dependiendo del nivel seleccionado de valores 1 como vacio y valores de 3 colocados aleatoriamente que representan las bombas.

Depuracion y mejoras
En el desarrollo de este proyecto una mejora a considerar para la siguiente version es agregar la generacion de tableros ajustables dependiendo del nivel seleccionado. Recordemos que el videojuego original tenia esta caracteristica ademas de que recordemos que conforme el tablero sea mas grande el juego es mas dificl por la cantidad de casillas sobre las que tenemos que movernos.


Nuevos retos
Este codigo puede servir de experiencia para desarrollar despues un juego de gato Tic Tac Toe en el cual el reto consiste en hacer que el programa tome la mejor decision posible en cada tirada de las casillas aun sin tirada del tablero en base a la probabilidad de las casillas restantes para formar una combinacion de gato ya sea esta horizontal, vertical o cruzada.

Juego de gato

Recordemos que mientras mejor desarrollado este nuestro algoritmo nuestro juego sera mas entretenido y retador para el jugador, por lo que no solo la presentacion sino el corecto funcionamiento del juego constituye una parte fundamental en la creacion de videojuegos. 

Menu del juego y comentarios
El juego en su menu inicial tiene acceso a 5 niveles en el cual se agregan 5 bombas por cada nivel. El juego mostrara un mensaje de felicitacion en caso de ganar. Para jugar en cada nivel debes ingresar las coordenadas de tu tirada la cual esta marcada en los bordes del tablero para poder escogerlo.


Menu Principal del juego de Buscaminas



Juego corriendo



Perdi ni modo



Espero que estos programas les sean de utilidad para su preparacion en C. Proximamente habra algunos programas tipo tutorial enfocados en el uso de estructuras de datos.

Saludos y felices fiestas


/*Buscaminas 1.0

Juan  Lopez
*/

#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
#include <time.h>

void imprimir_tablero(int tablero[][15], int perder);
void colocar_bombas(int minas[][15], int bum);
void frases_1(int buscar);
void frases_2(int numero);

#define RENGLON 15
#define COLUMNA 15

int main()
{
  int buscaminas[RENGLON][COLUMNA] = {0}, i, j;
  int nivel, bombas;                                    //bombas aleatorias
  int gameStatus, gameCounter = 0, victoria;            //control del juego
  int tiradas, frases;                                  //estadisticas del juego
  float rating;
  char salida;

  do{
       system("cls");
       printf("\n\tBuscaminas 1.0-\n\n");
       printf("10 bombas en el primer nivel + 5 por cada uno.\n\n");
      
       printf("~Ingresa el nivel del juego:\n%d.-Nivel 1\n", 1);
       printf("%d.-Nivel 2\n%d.-Nivel 3\n%d.-Nivel 4\n%d.-Nivel 5\n", 2, 3, 4, 5);
      
      // gotoxy(30, 6);
       scanf("%d", &nivel);
      
       switch(nivel){
      
           case 1: bombas = 10;
                   break;
                  
           case 2: bombas = 15;
                   break;
                  
           case 3: bombas = 20;
                   break;
                  
           case 4: bombas = 25;
                   break;
                  
           case 5: bombas = 30;
                   break;
                  
           default: printf("Seleccion invalida, intente de nuevo.\n\n");
                    break;                 
                    
       }
      
       srand(time(NULL));  //generacion de numeros aleatorios
      
       colocar_bombas(buscaminas, bombas);
      
       tiradas = 0; //este contador lleva cuenta del numero de tiradas en el juego
      
       do{
           system("cls");
           printf("\n-Buscaminas 1.0-\n\n");
          
           imprimir_tablero(buscaminas, gameStatus);
          
           printf("\n"); //nueva linea
          
           printf("*Ingrese la tirada[i, j]: ");
           scanf("%d%d",&i, &j);
          
           if(buscaminas[i][j] == 3){                              
               gameStatus = -1;
               tiradas++;
              
               system("cls");
               printf("\nBuscaminas1.0-\n\n");
               imprimir_tablero(buscaminas, gameStatus);
            //   gotoxy(80, 4);
               printf("\t\t\t\t\t  ¡¡¡Perdiste, el juego ha terminado!!");
              
               getch();              
           }
           else
           {
               buscaminas[i][j] = 1;
               gameCounter++;
               tiradas++;
           }
           if(gameCounter == (225 - bombas) )
           {
               victoria = 1;
               system("cls");
               printf("\nBuscaminas1.0-\n\n");
               imprimir_tablero(buscaminas, gameStatus);
         //      gotoxy(80, 4);
               printf("\t\t\t\t\t  ¡¡¡Has ganado, felicidades!!");
      
               getch();
           }       
          
              
       }while(gameStatus != -1 || victoria == 1);
      
       system("cls");
      
       rating = ((float)gameCounter * 100) / 225;
      
       printf("\n-Buscaminas 1.0- Estadisticas del juego.\n\n");
       printf("Tu rating  de juego es %.2f %.2f%\n", rating);
       printf("*No. de tiradas %d.\n\n", tiradas);
      
       frases = 1 + rand() % 4;
      
       if(gameStatus == -1)
         frases_2(frases);
       else if(victoria == 1)
         frases_1(frases);
      
       printf("\n\n");
      
       printf("¿Desea jugar de nuevo(S/N)?: ");
      
       salida = getch();
       salida = tolower(salida);
      
       for(i = 0; i <= RENGLON - 1; i++)
         for(j = 0; j <= COLUMNA - 1; j++)
           buscaminas[i][j] = 0;
          
       gameCounter = 0;
      
      
  }while(salida == 's');          
   
  system("cls");
  printf("\nBuscaminas1.0-\n\n");
  printf("\nCreditos\nHecho por Juan Lopez.\nVuelve pronto..");
 
  getch();
  //system("PAUSE");   
  return 0;
}

/*La sig. funcion coloca las bombas en el tablero por medio de una
funcion aleatoria de 0-14 El valor de en el arreglo 3 es su valor logico en el programa
de bombas
*/
void colocar_bombas(int minas[][15], int bum)
{
     int i, renglon, columna;
    
     for(i = 1; i <= bum; i++)
     {
           renglon = 0 + rand() % 14;
           columna = 0 + rand() % 14;
          
           minas[renglon][columna] = 3;
     }
}

void frases_1(int buscar)
{
     switch(buscar)
     {
         case 1: printf("¡Muy bien!\n");
                 break;
                
         case 2: printf("¡Excelente!\n");
                 break;
                
         case 3: printf("¡Buen trabajo!\n");
                 break;
                
         case 4: printf("¡Sigue asi!\n");
                 break;          
     }
}

void frases_2(int numero)
{
     switch(numero)
     {
         case 1: printf("¡Muy bien!\n");
                 break;
                
         case 2: printf("¡Excelente!\n");
                 break;
                
         case 3: printf("¡Buen trabajo!\n");
                 break;
                
         case 4: printf("¡Sigue asi!\n");
                 break;
                  
     }
}

void imprimir_tablero(int tablero[][15], int perder)
{
     int i, j;
    
     for(i = 0; i <= RENGLON -1; i++)  //encabezado
       printf("%d ", i);
      
     printf("\n");  //nueva linea
    
     for(i = 0; i <= COLUMNA - 1; i++)
       printf("--");
      
     printf("\n");
    
     for(i = 0; i <= RENGLON -1; i++)
     {
           for(j = 0; j <= COLUMNA - 1; j++){
          
             if(tablero[i][j] == 1)
               printf("%d ", tablero[i][j]);
             else if((tablero[i][j] == 3) && (perder == -1))
               printf("%c ", '*');
             else
               printf("%c ", '#');        
           }
          
           printf("| %d", i);   
           printf("\n"); 
          
     }
    
        
    
}


















Programacion en C Distribucion binomial



Hola, el dia de hoy les comparto el codigo de este programa que realice hace un tiempo para calcular distribucion binomial. El codigo lo probe con Dev C++ para plataforma Windows.


APOYO A ENCUESTA 
Hola a todos les escribo para apoyarme con una pequeña encuesta a traves deEncuesta Facil solo te tomara un minuto. 



Les dejo la direccion en este URL 
http://www.encuestafacil.com/RespWeb/Qn.aspx?EID=2051724



Espero que la informacion de este foro les sea de utilidad y gracias por sus visitas 


La distribucion binomial se puede considerar como una permutacion con reemplazo y se expresa por medio de la siguiente formula.






Debido a leyes de probabilidad la suma de las probabilidades de exito y fracaso deben ser igual a 1 o sea el 100%

Caracteristicas del modelo binomial
  • Existen solo 2 tipos de resultados: exito y fracaso
  • La probabilidad tanto de exito como de fracaso se mantiene constante entre evento y evento.
  • El numero posible de evento es infinito
Existen dos tipos de distribucion

Dsitribucion indiviual
Aqui en esta distribucion se busca la probabilidad de un elemento de la muestra solamente.


Ejemplo de la formula de distribucion binomial para una distribucion individual

Distribucion acumulada
Aqui se busca la probabilidad de varios elementos de la muestra, por lo que la probabilidad final sera la suma de todas las distribuciones individuales

Solucion general o diseño
El programa se debe dividir de la siguiente forma

Leer el tipo de distribucion
Calcular la distribucion
Entregar resultados

Para escoger entre el tipo de distribucion se implemento una estructura de control tipo case para ellegir en base a un caracter.

Debido a que durante la ejecucion del programa y las iteraciones realizadas en caso de la opcion de distribucion acumulada el codigo para factorial y combinacion se dividieron en funciones que se mandan a llamar cada vez que se necesitan cumpliendo de esta forma con la reutilizacion de software.

Nota antes de usar el programa
Este código lo hice cuando tuve que hacer una tarea con bastantes ejercicios de distribucion, por lo que de ahi me se ocurrio la idea de hacer el programa. Este codigo considero que es util para propositos academicos unicamente. Les recuerdo que los tipos de datos float disponibles en C les falta precision para realizar cálculos precisos que se requieren en trabajos mas especializados o bien aplicaciones comerciales, por lo que les recomiendo que para este u otro programa que requiera calculos precisos reescriban el programa en Fortran.

Recuerda sin importar la herramienta computacional o tecnica que tengas siempre en todo trabajo cotejar tu infromacion y resultados con diferentes metodos y herramientas con las personas de tu equipo de trabajo.

El programa se maneja a traves de una pantalla en consola y tiene la opcion de poder calcular funciones individuales y acumuladas.





Ejemplo de calculo de una funcion acumulada.





/* Distribucion Binomial Juan Lopez

*/

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <ctype.h>

float factorial(float);
float combinacion(float, float);

main()
{
    float x, x_1, x_2, number;
    float n, p, q, suma = 0;
    float binomial = 0, sumatoria = 0;
    char opcion, salida;
   
    do{        
         system("cls");
         printf("\tDistribucion binomial  \n\n");
        
         printf("[a]-Funcion individual.\n");
         printf("[b]-Funcion acumulada.\n\n");
        
         printf("*Selecciona la funcion que desee calcular: ");
         scanf("%s", &opcion);
        
         switch(opcion)
         {
             case 'a': printf("\n\n\a-Funcion individual de distribucion binomial f(x).-\n");
                      
                       printf("*Ingrese el numero de eventos 'n': ");
                       scanf("%f", &n);
                      
                       do{
                                  
                           printf("\n*Ingrese la probabilidad de exito %: ");
                           scanf("%f", &p);
                                                    
                           if(p > 1)                         
                             p /= 100;
                                            
                                                                      
                           q = 1 - p;
                          
                           suma = p + q;
                          
                          
                          
                       }while(suma != 1);
                      
                       do{
                           printf("\n*Ingrese el valor de 'x': ");
                           scanf("%f", &x);
                          
                           if(x > n)
                             printf("ERROR 658: 'x' no puede ser mayor a 'n'\n");
                            
                           if(x < 0)
                             printf("ERROR 725: 'x' no puede ser menor a cero.\n");              
                                  
                       }while( -((x > n) || (x < 0)) );
                      
                       printf("\n\n-Resultados del modelo binomial.-\n\n");
                                             
                       binomial = combinacion(n, x) * pow(p, x) * pow(q, n-x);                      
                       printf("  B(%2.0f, %2.0f, %2.0f) = %4.6f = %4.2f %", x, n, p, binomial, binomial * 100);
                      
                       break;
                      
             case 'b': printf("\n\n\a-Funcion acumulada de distribucion binomial F(x).-\n");
                      
                       printf("*Ingrese el numero de eventos ´n´");
                       scanf("%f", &n);
                      
                       do{
                                  
                           printf("\n*Ingrese la probabilidad de exito %: ");
                           scanf("%f", &p);                                                   
                           
                           if(p > 1)                         
                             p /= 100;
                                                    
                          
                           q = 1 - p;                    
                          
                           suma = p + q;
                                 
                          
                          
                       }while(suma != 1);
                      
                       do{
                                  
                           printf("*Ingresa x_1: ");
                           scanf("%f", &number);
                          
                           x_1 = number;
                          
                           if(x_1 < 0)
                             printf("\nERROR 458: El intervalor x_1 no puede ser menor a cero.\n");
                            
                           if(x_1 > n)
                             printf("\nERROR 218: El intervalo x_1 no puede ser mayor a 'n'.\n\n");       
                                  
                       }while( -( (x_1 < 0)||(x_1 > n) ) );
                      
                       do{
                           printf("*Ingresa x_2: ");
                           scanf("%f", &x_2);
                          
                           if(x_2 < x_1)
                             printf("\nERROR 147: El intervalo x_2 no puede ser menor a x_1.\n");
                            
                           if(x_2 > n)
                             printf("\nERROR 231: El intervalo x_2 no puede ser mayor a 'n'.\n"); 
                              
                       }while( -( (x_2 < x_1)||(x_2 > n) ) );
                      
                       printf("\n\n-Resultados del modelo binomial.-\n\n");
                      
                       for(x_1 = number; x_1 <= x_2; x_1++){
                              
                           binomial = combinacion(n, x_1) * pow(p, x_1) * pow(q, n - x_1);
                          
                           printf("  B(%2.0f, %2.0f, %2.2f) = %4.6f\n", x_1, n, p, binomial);
                          
                           sumatoria += binomial;
                              
                       }
                      
                       printf("\n Probabilidad final.");
                       printf("\n F(x) = (x; %2.0f, %2.0f) = %4.4f = %4.2f%", n, p, sumatoria, sumatoria * 100);
                      
                       break;
                      
             default: printf("\nERROR 254: caracter de opcion mal introducido, intentelo de nuevo.\n");         
                       break;                     
                      
                      
         }//fin del menu opcion
        
         printf("\n\n¿Desea un nuevo calculo(S/N)?");
        
         salida = getch();
         salida = tolower(salida);
        
         binomial = 0;
         sumatoria = 0;
                 
    }while(salida == 's');
   
    system("cls");
    printf("\tModelo binomial \n\n");
    printf("\n\nVuelve pronto...");
   
    getch();
    return 0;
     
}//fin de main

float combinacion(float a, float b)
{
      float combinacion;
     
      combinacion = ( factorial(a) /( factorial(b) * factorial(a-b) ));
     
      return combinacion;
}

float factorial(float number)
{
      float factorial = 1, counter;
     
      for(counter = number; counter >= 1; counter--)
        factorial *= counter;
       
      return factorial;  
}
Espero que este programa les ayude en su preparacion en este lenguaje de programacion y planteamiento de algoritmos, al igual que sea una base adecuada para futuros estudios en programacion orientada a objetos.

Les dejo la informacion para el que quiera continuar averiguando sobre este lenguaje de programacion. Se los recomiendo mucho.

Como programar en C Deitel













C. Algoritmos, programacion y estructura de datos 
Joyanes Aguilar et al.













Libro de los cradores del lenguaje C. Este libro ademas de ser practico en sus ejemplos le puede servir como un manual de referencia del lenguaje.