Anda di halaman 1dari 9

Colegio de Educacin Profesional Tcnica del Estado de

Veracruz
Plantel Tuxpan Lic. Jess Reyes Heroles165
Docente: Miguel ngel Ramos Grande
Modulo: Programacin de videojuegos
Practica 11: Aplicacin de matemticas para Juego: Tiro Al
Plato. Usando lenguaje de programacin
Propsito: Elabora una aplicacin de videojuego de Tiro Al plato
usando lenguaje de programacin para la aplicacin de
conceptos de geometra plana.

Alumnas:
Diana Laura Ramrez Xochihua
Lucia Ramrez Xochihua


604-INFORMATICA






INTRODUCCIN
En la prctica nmero 11 se tena que elaborar un videojuego llamado tiro al plato en el
cual se tenan que usar figuras geomtricas as como tambin tener conocimientos
matemticos sobre la geometra. En esta prctica se ve el uso del mouse, el videojuego
consista en que los discos se movieran siguiendo una curva que ser una parbola, y
sern circulares. La puntuacin depender del tiempo que se tarde en acertar. Habr un
nmero limitado de "platos", tras el cual se acabar la partida.
DESARROLLO
Primero comenzamos abriendo nuestro programa Dev-
C++>archivo>nuevo>proyecto>Multimedia>Static.
Trasladamos el cdigo de la pgina sugerida por la prctica y comenc a analizar el
programa y es el siguiente:

Cdigo
En esta parte del programa se manda a llamar las libreras necearas para poder
realizar el videojuego
include <stdlib.h> // Para "rand"
#include <math.h> // Para "sqrt"
#include <allegro.h>
/* Constantes globales */ estas variables se ocuparan en todo el programa por eso
son globales
#define ANCHOPANTALLA 320
#define ALTOPANTALLA 200
#define MAXRADIODIANA 25
#define MINRADIODIANA 5
#define NUMDIANAS 12
#define MAXINCREMXDIANA 20
#define MININCREMXDIANA 10
#define RETARDO 7
/* Variables globales */
int
TamanyoDianaActual,
numDianaActual,
posXdiana,
posYdiana,
radioDiana,
incremXdiana,
incremYdiana,
acertado = 0; // Si se acierta -> plato nuevo
long int
puntos = 0,
contadorActual = 0;
float
a,b,c; // Para la parbola del plato

/* Rutina de inicializacin */
Aqu inicializamos los materiales que ocuparemos como lo es allegro, el teclado, el
tiepo, y el raton
int inicializa()
{
allegro_init(); // Inicializamos Allegro
install_keyboard();
install_timer();
install_mouse();

Aqu definimos el ancho y alto de la pantalla y el tipo de modo y si no se puede
entrar al modo muestro un mensaje que no se pudo entrar
// Intentamos 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;
}
// Si he podido entrar a modo grfico,
despus si no hubo problema se inicializan las variables
numDianaActual = 1;
srand(time(0));
show_mouse(screen);
// Y termino indicando que no ha habido errores
return 0;
}

/* -------------- Rutina de nuevo plato ----------- */
Aqu es donde se dibuja el plato y para ello se tiene que indicar el radio y aparte
que tiene que ser de diferentes tamaos y tambin se tiene que indicar para
redibujarlo.
void nuevoPlato()
{
int xVerticeParabola,
yVerticeParabola;
float pParabola;

// Un radio al azar entre el valor mximo y el mnimo
radioDiana = (rand() % (MAXRADIODIANA - MINRADIODIANA))
+ MINRADIODIANA;
// La velocidad (incremento de X), similar
incremXdiana = (rand() % (MAXINCREMXDIANA - MININCREMXDIANA))
+ MININCREMXDIANA;

// Vrtice de la parbola, cerca del centro en horizontal
xVerticeParabola = ANCHOPANTALLA/2 + (rand() % 40) - 20;
// Y mitad superior de la pantalla, en vertical
yVerticeParabola = (rand() % (ALTOPANTALLA/2));
// Calculo a, b y c de la parbola
pParabola = ALTOPANTALLA/2;
a = 1 / (2*pParabola);
b = -xVerticeParabola / pParabola;
c = ((xVerticeParabola*xVerticeParabola) / (2*pParabola) )
+ yVerticeParabola;
// Posicin horizontal: junto margen izquierdo
posXdiana = radioDiana;
// Posicin vertical: segn la parbola
posYdiana =
a*posXdiana*posXdiana +
b*posXdiana +
c;
}

/* -------------- Rutina de redibujar pantalla ---- */
Aqu si indica redibujar el plato cuanto el ratn haya dado clic en el
void redibujaPantalla()
{
// Oculto ratn
scare_mouse();
// Borro pantalla
clear_bitmap(screen);
// Sincronizo con barrido para menos parpadeos
vsync();

// Y dibujo todo lo que corresponda
rectfill(screen,0,0,ANCHOPANTALLA,ALTOPANTALLA-40,
makecol(70, 70, 255)); //Cielo
textprintf(screen, font, 4,4, palette_color[12],
"Puntos: %d", puntos); // Puntuacin
rectfill(screen,0,ALTOPANTALLA-40,ANCHOPANTALLA,ALTOPANTALLA,
makecol(0, 150, 0)); //Suelo
circlefill(screen,
posXdiana, posYdiana, radioDiana,
palette_color[4]); // Diana
if (numDianaActual <= NUMDIANAS) {
textprintf(screen, font, 4,190, palette_color[12],
"Platos: %d", NUMDIANAS-numDianaActual);
} // Restantes, si no acab

unscare_mouse();
}

/* -------------- Distancia entre dos puntos ------ */
float distancia(int x1, int x2, int y1, int y2) {
return (sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) );
}
/* -------------- Rutinas de temporizaci?n ---- */
volatile long int contador = 0;
void aumentaContador(void) { contador++; }
END_OF_FUNCTION(aumentaContador);

/* -------------- Cuerpo del programa ------------- */
int main()
{
// Intentamos inicializar
if (inicializa() != 0)
exit(1);
// Bloqueamos la variable y la funcin del temporizador
Contador para los platos
LOCK_VARIABLE( contador );
LOCK_FUNCTION( aumentaContador );

// Y ponemos el temporizador en marcha: cada 10 milisegundos
install_int(aumentaContador, 10);
Repeticin para dibujar un nuevo plato
do { // Parte que se repite para cada plato

nuevoPlato(); // Calculo su posicin inicial
redibujaPantalla(); // Y dibujo la pantalla
acertado = 0; // Todava no se ha acertado, claro

do { // Parte que se repite mientras se mueve
hago una comprobacin para saber que el jugador ha dado clic en uno de los
platos para aumentar la puntuacin.
// Compruebo el ratn
if (mouse_b & 1) {
if (distancia(mouse_x, posXdiana, mouse_y,posYdiana)
<= radioDiana) {
puntos += ANCHOPANTALLA-posXdiana;
acertado = 1;
}
}

// Si ya ha pasado el retardo, muevo
if (contador >= contadorActual+RETARDO) {
contadorActual = contador+RETARDO;
posXdiana += incremXdiana;
posYdiana =
a*posXdiana*posXdiana +
b*posXdiana +
c;
redibujaPantalla();
}

} while ((posXdiana <= ANCHOPANTALLA - radioDiana)
&& (acertado == 0));
numDianaActual ++; // Siguiente diana
} while (numDianaActual <= NUMDIANAS);
redibujaPantalla();
scare_mouse();
textprintf(screen, font, 40,100, palette_color[15],
"Partida terminada");
unscare_mouse();
readkey();
return 0;

}

END_OF_MAIN();



CONCLUSION
Al checar esta prctica se me hizo un poco difcil entenderla por los ciclos que manejo
porque hay uno dentro de otro pero nada ms, tambin anduve movindole algunas
cosas y trate de modificar el color de fondo pero lo maneja con el makecol al cual no le
entend muy bien cmo funcionaba adems de que tambin manejamos el teclado y el
uso de las propiedades del ratn y del timer para el tiempo.

Anda mungkin juga menyukai