8
Práctica 11 Aplicación de matemáticas para juego: TiroAlPlato usando lenguaje de programación. Propósito: Elabora una aplicación de videojuego del TiroAlPlato usando lenguaje de programación para la aplicación de conceptos de geometría plana. Introduccion En esta práctica se verá uno de los juegos más conocidos, parecido al de disparar a patos, pero en esta ocasión son a platos, como se explica en el propósito de la práctica, se requiere utilizar de conocimientos matemáticos para hacer el efecto de que el plato va volando por la pantalla. Se presenta a continuación el código utilizado, la explicación del código se verán en, los comentarios dentro del programa. Los comentarios se encuentran en color AZUL #include <stdlib.h> // Para "rand" #include <math.h> // Para "sqrt" #include <allegro.h> //Se declaran las 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

PRACTICA11-POVI

Embed Size (px)

Citation preview

Page 1: PRACTICA11-POVI

Práctica 11Aplicación de matemáticas para juego: TiroAlPlato usando lenguaje de

programación.

Propósito: Elabora una aplicación de videojuego del TiroAlPlato usando lenguaje de programación para la aplicación de conceptos de geometría plana.

IntroduccionEn esta práctica se verá uno de los juegos más conocidos, parecido al de disparar a patos, pero en esta ocasión son a platos, como se explica en el propósito de la práctica, se requiere utilizar de conocimientos matemáticos para hacer el efecto de que el plato va volando por la pantalla.Se presenta a continuación el código utilizado, la explicación del código se verán en, los comentarios dentro del programa. Los comentarios se encuentran en color AZUL#include <stdlib.h> // Para "rand"#include <math.h> // Para "sqrt"#include <allegro.h>

//Se declaran las 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

//Declaramos las variables globales

int TamanyoDianaActual, numDianaActual, posXdiana, posYdiana, radioDiana,

Page 2: PRACTICA11-POVI

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

//Ahora la rutina de inicialización donde iniciamos en allegro e intentamos entrar a modo gráfico...

int inicializa(){ allegro_init(); install_keyboard(); install_timer(); install_mouse();

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

numDianaActual = 1; srand(time(0)); show_mouse(screen);

return 0;}

//Rutina para el nuevo nuevo plato

void nuevoPlato()

Page 3: PRACTICA11-POVI

{ 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; }

//Redibujar pantalla...

void redibujaPantalla(){ // Oculto ratón scare_mouse(); // Se borra pantalla clear_bitmap(screen);

Page 4: PRACTICA11-POVI

// Sincronizo con barrido para menos parpadeos vsync();

// Se dibuja el paisaje a observar rectfill(screen,0,0,ANCHOPANTALLA,ALTOPANTALLA-40, makecol(70, 70, 255)); //Cielo textprintf(screen, font, 4,4, palette_color[11], "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[10], "Platos: %d", NUMDIANAS-numDianaActual); } // Restantes, si no acabó

unscare_mouse();}

//Se establece la distancia entre dos puntos

float distancia(int x1, int x2, int y1, int y2) { return (sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) );}

//Rutina de temporización

volatile long int contador = 0;

void aumentaContador(void) { contador++; }END_OF_FUNCTION(aumentaContador);

//Cuerpo del programa

int main(){ // Se inicializan los intentos if (inicializa() != 0) exit(1);

// Bloqueamos la variable y la función del temporizador LOCK_// En esta seccion se repite mientras se mueve VARIABLE( contador );

Page 5: PRACTICA11-POVI

LOCK_FUNCTION( aumentaContador );

// Se pone el temporizador en marcha: cada 10 milisegundos install_int(aumentaContador, 10);

do { // Ciclo que repite el codigo para cada plato

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

do {

// Compruebo el ratón if (mouse_b & 1) { if (distancia(mouse_x, posXdiana, mouse_y,posYdiana) <= radioDiana) { puntos += ANCHOPANTALLA-posXdiana; acertado = 1; } }

// Si ya se 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 ++; // Se coloca la siguiente diana

} while (numDianaActual <= NUMDIANAS);

redibujaPantalla(); scare_mouse(); textprintf(screen, font, 40,100, palette_color[2],

Page 6: PRACTICA11-POVI

"Partida terminada"); unscare_mouse(); readkey(); return 0;

} /* Se concluye con la "macro" que pide Allegro */END_OF_MAIN();

CONCLUSION

Esta práctica es un poco complicada pues se deben de utilizar variables muy precisas para no confundirnos en a la hora de realizar las funciones, además de que se utilizan distintos rand uno para seleccionar el diámetro del plato y el de la parábola, es aquí donde las matemáticas ayudan mucho, creo que eso es lo complicado pues en lo demás solo usar un poco la lógica para comprender el programa y para qué sirve cada bloque de instrucciones