Vous êtes sur la page 1sur 12

CONALEP #165

LIC. JESUS REYES HEROLES


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

#define TECLA1 'w'
#define TECLA2 'e'
#define TECLA3 's'
#define TECLA4 'd'

#define FICHEROSONIDO1 "simon1.mid"
#define FICHEROSONIDO2 "simon2.mid"
#define FICHEROSONIDO3 "simon3.mid"
#define FICHEROSONIDO4 "simon4.mid"

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);

// Segundo cuadro: SuperiorDerecha -> rojo
rectfill(screen, ANCHOPANTALLA/2+10,10,
ANCHOPANTALLA-10,ALTOPANTALLA/2-30,
makecol(150, 0, 0));
textprintf(screen, font, ANCHOPANTALLA/4*3, ALTOPANTALLA/2-28,
makecol(150, 0, 0), "%c",
TECLA2);

// Tercer cuadro: InferiorIzquierda -> amarillo
rectfill(screen, 10,ALTOPANTALLA/2-10,
ANCHOPANTALLA/2-10,ALTOPANTALLA-50,
makecol(200, 200, 0));
textprintf(screen, font, ANCHOPANTALLA/4, ALTOPANTALLA-48,
makecol(200, 200, 0), "%c",
TECLA3);

// Cuarto cuadro: InferiorDerecha -> azul
rectfill(screen, ANCHOPANTALLA/2+10,ALTOPANTALLA/2-10,
ANCHOPANTALLA-10,ALTOPANTALLA-50,
makecol(0, 0, 150));
textprintf(screen, font, ANCHOPANTALLA/4*3, ALTOPANTALLA-48,
makecol(0, 0, 150), "%c",
TECLA4);

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;

if ( (tecla == TECLA1) && (notas[notaActual] == 0) ){
play_midi(sonido1, FALSE);
rectfill(screen, 10,10,
ANCHOPANTALLA/2-10,ALTOPANTALLA/2-30,
makecol(255, 255, 255));
seHaAcertado = 1;
}
if ( (tecla == TECLA2) && (notas[notaActual] == 1) ){
play_midi(sonido2, FALSE);
rectfill(screen, ANCHOPANTALLA/2+10,10,
ANCHOPANTALLA-10,ALTOPANTALLA/2-30,
makecol(150, 0, 0));
seHaAcertado = 1;
}
if ( (tecla == TECLA3) && (notas[notaActual] == 2) ){
play_midi(sonido3, FALSE);
rectfill(screen, 10,ALTOPANTALLA/2-10,
ANCHOPANTALLA/2-10,ALTOPANTALLA-50,
makecol(200, 200, 0));
seHaAcertado = 1;
}
if ( (tecla == TECLA4) && (notas[notaActual] == 3) ){
play_midi(sonido4, FALSE);
rectfill(screen, ANCHOPANTALLA/2+10,ALTOPANTALLA/2-10,
ANCHOPANTALLA-10,ALTOPANTALLA-50,
makecol(255, 255, 255));
seHaAcertado = 1;
}
return seHaAcertado;
}

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));

textprintf(screen, font,
ANCHOPANTALLA/4, ALTOPANTALLA/2 + 20, palette_color[15],
"Partida terminada");
readkey();
return 0;
}

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.

Vous aimerez peut-être aussi