Вы находитесь на странице: 1из 11

COLEGIO DE EDUCACION PROFESIONAL TCNICA DEL ESTADO DE

VERACRUZ
LIC. JESUS REYES HEROLES

Nombre del alumno(A):
YULIANA CECILIA DAMIAN REYES
DULCE SUGEY HERNANDEZ CRUZ
Modulo:
PROGRAMACION DE VIDEOJUEGOS
Profesor:
ING. MIGUEL ANGEL RAMOS GRANDE
Grupo:
604
Carrera:
INFORMTICA
Reporte de Practica #11
Aplicacin de matemticas para juegos Juego: Tiro Al Plato-
PROPOSITO DE LA PRCTICA:
Elabora una aplicacin de videojuego de Tiro Al plato usando lenguaje de
programacin para la aplicacin de conceptos de geometra plana.






Practica 11
Aplicacin de matemticas para juegos Juego: Tiro Al Plato

Introduccin
El da 27 de mayo del 2014 realizamos la prctica nmero 11 del mdulo de programacin de
videojuegos, la cual consista en elaborar una aplicacin de videojuego llamada Tiro al Plato. La
prctica la realice con mi compaera Dulce Sugey Hernndez Cruz.
Desarrollo
Selecciona un lenguaje de programacin.



Entra al modo grfico.
Para esto nos vamos a archivo Nuevo Proyecto

Utiliza el lenguaje seleccionado y bibliotecas necesarias.

#include <stdlib.h> // Para "rand"
#include <math.h> // Para "sqrt"
#include <allegro.h>

Elabora las rutinas necesarias para el juego de uso del mouse donde los blancos estarn en
movimiento, 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.

Se puede usar un blanco redondo en vez de rectangular.
Se comprueba si se ha acertado viendo si la distancia desde el centro del
crculo hasta el punto en el que se ha pulsado el mouse es menor (o igual)
que el radio del crculo.
Usa expresiones para dibujar un crculo, para rotar un objeto en el plano.
Termina el programa y sal del modo grfico.
Presenta las rutinas de programacin escritas en editor de texto (cdigo
fuente generado) considerando la escritura de rutinas lgicas secuenciales
en lenguaje de programacin compuesto por instrucciones en lneas de
texto de los programas o algoritmos elaborados, de manera impresa y/o
digital.
#include <stdlib.h> // Para "rand"
#include <math.h> // Para "sqrt"
#include <allegro.h>

/* -------------- Constantes 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 par?bola del plato


/* -------------- Rutina de inicializaci?n -------- */
int inicializa()
{
allegro_init(); // Inicializamos Allegro
install_keyboard();
install_timer();
install_mouse();

// 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 gr?fico,
// ahora inicializo las variables
numDianaActual = 1;
srand(time(0));
show_mouse(screen);

// Y termino indicando que no ha habido errores
return 0;
}


/* -------------- Rutina de nuevo plato ----------- */
void nuevoPlato()
{
int xVerticeParabola,
yVerticeParabola;
float pParabola;

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

// V?rtice de la par?bola, 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 par?bola
pParabola = ALTOPANTALLA/2;
a = 1 / (2*pParabola);
b = -xVerticeParabola / pParabola;
c = ((xVerticeParabola*xVerticeParabola) / (2*pParabola) )
+ yVerticeParabola;


// Posici?n horizontal: junto margen izquierdo
posXdiana = radioDiana;
// Posici?n vertical: seg?n la par?bola
posYdiana =
a*posXdiana*posXdiana +
b*posXdiana +
c;
}


/* -------------- Rutina de redibujar pantalla ---- */
void redibujaPantalla()
{
// Oculto rat?n
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[13],
"Puntos: %d", puntos); // Puntuaci?n
rectfill(screen,0,ALTOPANTALLA-40,ANCHOPANTALLA,ALTOPANTALLA,
makecol(0, 150, 0)); //Suelo
circlefill(screen,
posXdiana, posYdiana, radioDiana,
palette_color[15]); // Diana
if (numDianaActual <= NUMDIANAS) {
textprintf(screen, font, 4,190, palette_color[4],
"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 funci?n del temporizador
LOCK_VARIABLE( contador );
LOCK_FUNCTION( aumentaContador );

// Y ponemos el temporizador en marcha: cada 10 milisegundos
install_int(aumentaContador, 10);


do { // Parte que se repite para cada plato

nuevoPlato(); // Calculo su posici?n inicial
redibujaPantalla(); // Y dibujo la pantalla
acertado = 0; // Todav?a no se ha acertado, claro

do { // Parte que se repite mientras se mueve

// Compruebo el rat?n
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;

}

/* Termino con la "macro" que me pide Allegro */
END_OF_MAIN();

Compila el programa y generar su cdigo ejecutable, haciendo la corrida,
hasta que funcione sin errores.












CONCLUSION
En esta prctica se retom lo que se haba estado haciendo en las clases anteriores ya que ya
habamos visto como realizar figuras geomtricas adems en esta prctica se utilizaron los
contadores, funciones como el do-while.
BILIOGRAFIA

http://www.nachocabanes.com/videojuegos/ipj/ipj13.php

Вам также может понравиться