Docente: Miguel ngel Ramos Grande Alumnos: Brenda Cruz Mata Jorge Alberto Hernndez Rojas Francisco Javier Flores Romn Modulo: Programacin Para Videojuegos Grupo: 604 Informtica
PRACTICA 12 Reproducir sonidos. Juego SimeonDice usando lenguaje de programacin.
Propsito de la prctica: Elabora una aplicacin de videojuegos SimeonDice usando lenguaje de programacin para genera el juego clsico de memoria auditiva donde se hacen reproducciones de sonido.
Escenario: Laboratorio de informtica Duracin: 2 hrs.
INTRODUCCIN: En la prctica realizada el da viernes 23 de mayo realizamos la reproduccin de sonidos en un juego llamado SimeonDice el cual se trata de memorizar las luces de los cuadros junto con el sonido que lo acompaa.. DESARROLLO: Lo primero que se tiene que hacer al iniciar el programa es colocar las bibliotecas que utilizaremos: #include <stdlib.h> // Para "rand" #include <ctype.h> // Para "tolower" #include <allegro.h>
En esta parte se declaran las constantes globales las cuales son campos cuyos valores se establecen en tiempo de compilacin y no se pueden cambiar. /* -------------- Constantes globales ------------- */ #define ANCHOPANTALLA 320 #define ALTOPANTALLA 200 #define MAXNOTAS 300 #define RETARDONOTA 200 #define RETARDOETAPA 1000
Despus de las constantes globales van las variables globales las cuales son unas variables accesibles en todos los mbitos de un programa. /* -------------- Variables globales -------------- */ int notaActual = 0, // Numero de nota actual notas[MAXNOTAS], // Secuencia de notas acertado; // Si se ha acertado o no
MIDI *sonido1, *sonido2, *sonido3, *sonido4;
En este momento es cuando ya se coloca la inicializacin del programa en la cual se declara el allegro y la entrada al modo grafica para mostrar las figuras con las cuales se constituye el juego. /* -------------- Rutina de inicializacin -------- */ int inicializa() { allegro_init(); // Inicializamos Allegro install_keyboard(); install_timer();
// Entrar a modo grafico if (set_gfx_mode(GFX_SAFE, ANCHOPANTALLA, ALTOPANTALLA, 0, 0) != 0) { set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); allegro_message( "Incapaz de entrar a modo grafico\n%s\n", allegro_error); return 1; }
Musical Instrument Digital Interface (Interfaz Digital de Instrumentos Musicales) a cual la utilizamos para que nuestro juego tenga el sonido que corresponde. Tambin en esta parte colocamos unos ciclos de if para que detecte algunos problemas si los encuentra. // Usamos midi if (install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, "") != 0) { allegro_message("Error inicializando el sistema de sonido\n%s\n", allegro_error); return 2; } sonido1 = load_midi(FICHEROSONIDO1); if (!sonido1) { allegro_message("Error leyendo el fichero MID '%s'\n", FICHEROSONIDO1); return 3; } sonido2 = load_midi(FICHEROSONIDO2); if (!sonido2) { allegro_message("Error leyendo el fichero MID '%s'\n", FICHEROSONIDO2); return 3; } sonido3 = load_midi(FICHEROSONIDO3); if (!sonido3) { allegro_message("Error leyendo el fichero MID '%s'\n", FICHEROSONIDO3); return 3; } sonido4 = load_midi(FICHEROSONIDO4); if (!sonido4) { allegro_message("Error leyendo el fichero MID '%s'\n", FICHEROSONIDO4); return 3; } Se coloca la funcin de srand para generar nmeros aleatorios. // Preparo nmeros aleatorios srand(time(0)); Tambin se dice que el volumen se encuentre al mximo por si no se llegase a escuchar. // Volumen al mximo, por si acaso set_volume(255,255);
// Y termino indicando que no ha habido errores return 0; }
Esta es la parte ms grafica del programa ya que es en la cual se dibuja completamente todo el juego. /* -------------- Rutina de dibujar pantalla ------ */ void dibujaPantalla() { // Borramos pantalla con la funcin clear clear_bitmap(screen); Al momento de dibujar los cuadros tambin se coloca su tamao, color y donde se encontrara colocado. As mismo con los dems cuadros del juego. // Primer cuadro: SuperiorIzquierda -> verde rectfill(screen, 10,10, ANCHOPANTALLA/2-10,ALTOPANTALLA/2-30, makecol(0, 150, 0)); textprintf(screen, font, ANCHOPANTALLA/4, ALTOPANTALLA/2-28, makecol(0, 150, 0), "%c", TECLA1);
En esta parte es el almacenamiento de la puntuacin al paso de los niveles. textprintf(screen, font, 4,ALTOPANTALLA-20, palette_color[13], "Puntos: %d", notaActual*10); // Puntuacin }
En esta parte del programa se colocan funciones para que al momento de la reproduccin del juego aparezcan los sonidos correspondientes. /* -------------- Rutina de reproducir notas ------ */ void reproduceNotas() { int i; for (i=0; i<=notaActual; i++) { if (notas[i] == 0) { play_midi(sonido1, FALSE); rectfill(screen, 10,10, ANCHOPANTALLA/2-10,ALTOPANTALLA/2-30, makecol(255, 255, 255)); } if (notas[i] == 1) { play_midi(sonido2, FALSE); rectfill(screen, ANCHOPANTALLA/2+10,10, ANCHOPANTALLA-10,ALTOPANTALLA/2-30, makecol(255, 255, 255)); } if (notas[i] == 2) { play_midi(sonido3, FALSE); rectfill(screen, 10,ALTOPANTALLA/2-10, ANCHOPANTALLA/2-10,ALTOPANTALLA-50, makecol(255, 255, 255)); } if (notas[i] == 3) { play_midi(sonido4, FALSE); rectfill(screen, ANCHOPANTALLA/2+10,ALTOPANTALLA/2-10, ANCHOPANTALLA-10,ALTOPANTALLA-50, makecol(255, 255, 255)); } rest(RETARDONOTA); dibujaPantalla(); } }
Despus de reproducir las notas se hace una comparacin si las letras que nosotros introducimos son iguales a las notas que se mostraron y as saber si acertamos o no. /* -------------- Rutina de comparar notas ------ */ int comparaNota(char tecla, int notaActual) { int i;
// Presupongo que no ha acertado y comparare 1 x 1 int seHaAcertado = 0;
Esta es la parte del programa ms importante ya que en esta se juntan todas las funciones necesarias para que el programa funcione correctamente. Se manda a llamar a todas las contantes necesarias. Primeramente se muestra el mensaje de entrada la cual dice el nombre y los que debe de hacer el usuario. /* --------------------------------------------------------- */ /* */ /* -------------- Cuerpo del programa ------------- */
int main() { int i; char tecla;
//Inicializamos if (inicializa() != 0) exit(1);
dibujaPantalla(); textprintf(screen, font, ANCHOPANTALLA/4, ALTOPANTALLA/2 - 40, makecol(255, 255, 255), " S I M E O N D I C E "); textprintf(screen, font, ANCHOPANTALLA/4, ALTOPANTALLA/2, makecol(255, 255, 255), "Pulsa una tecla para jugar"); readkey();
Se coloca un ciclo para que el juego se repita hasta que el usuario falle al momento de introducir una letra incorrecta. do { // Parte que se repite hasta que falle
dibujaPantalla(); // Dibujo la pantalla de juego
// Se gener nueva nota y reproduce todas notas[notaActual] = rand() % 4; reproduceNotas();
acertado = 1; // Presupongo que acertar
// Ahora el jugador intenta repetir i = 0; do { tecla = tolower(readkey()); // Leo la tecla if (tecla == 27) break; // Salgo si es ESC acertado = comparaNota(tecla, i); // Comparo i ++; // Y paso a la siguiente } while ((i<=notaActual) && (acertado == 1));
Si el usuario acierta al momento de introducir las notas que se le mostraron pasa al siguiente nivel en el cual solo se le agrega una nota ms. Y as sucesivamente. // Una nota mas if (acertado == 1) { textprintf(screen, font, ANCHOPANTALLA/4, ALTOPANTALLA/2, makecol(255, 255, 255), "Correcto!"); notaActual ++; } else { textprintf(screen, font, ANCHOPANTALLA/4, ALTOPANTALLA/2, makecol(255, 255, 255), "Fallaste!"); } rest (RETARDOETAPA); } while ((acertado == 1) && (notaActual < MAXNOTAS));
As es como se finaliza el programa. /* Termino con la "macro" que me pide Allegro */ END_OF_MAIN();
El nico error que me mostro al momento de compilar el programa fue el siguiente y sucedi porque necesitaba que los audfonos estuvieran conectados pero ya fue un error fuera del programa.
De esta manera es como aparece el juego principalmente.
Despus de pulsar la tecla, te brinda las notas las cuales tienes que introducir correctamente para que sigas en el juego.
Por cada nivel que pases tu puntaje aumenta 10 puntos por cada nivel. Mientras juegas si te equivocas manda un mensaje el cual dice Fallaste, y se sale del juego.
Por cada nivel que aciertes tambin aparece un mensaje que dice correcto y en seguida pasa al siguiente nivel.
CONCLUSIN: En esta prctica aprendimos ms que nada a colocar sonido en un juego con el cdigo de midi el cual significa Interfaz Digital de Instrumentos Musicales, adems de su comparacin con otros sonidos y la forma de colocar las funciones. Tambin aprendimos a colocar las luces al mismo tiempo que se encuca la meloda. No tuve ningn error ni problema con respecto al cdigo, el nico problema que tuve fue el error que me apareca al compilar el programa pero fue por no tener conectados los audfonos.