En casi todas las instancias en que queremos resolver un problema hay una o más opciones que dependen de si se cumplen o no ciertas condiciones. Los programas de computadoras se construyen para resolver problemas y, por lo tanto, deben tener una estructura que permita tomar decisiones. En C++ las instrucciones de decisión (o condicionales) se estructuran utilizando if, else, else if o switch. Muchas veces el uso de estas estructuras también envuelve el uso de expresiones de relación y operadores lógicos. En la experiencia de laboratorio de hoy practicarás el uso de algunas estructuras de decisión completando el diseño de una aplicación de juego de colisiones de carros con obstáculos en una pista.
Antes de llegar al laboratorio debes:
Haber repasado los siguientes conceptos: a. operadores lógicos b. if, else, else if, switch
Haber estudiado los conceptos e instrucciones para la sesión de laboratorio.
Haber tomado el quiz Pre-Lab que se encuentra en Moodle.
Los juegos de colisiones consisten en un objeto esquivando la posible colisión contra otros objetos que puede descontar puntos o hacer perder el juego, y/o provocar la colisión con otros objetos que acumulan puntos. En el juego de esta experiencia el objeto es un carrito, los objetos que causan que el juego pare son pinos, agujeros, entre otros y los otros objetos que suman puntos son las banderas.
Los controles del juego son bien sencillos, la tecla hacia arriba desplaza el carro hacia arriba y la tecla hacia abajo desplaza el carro hacia abajo. El carro es desplazado hacia arriba y hacia abajo para esquivar los obstáculos y para capturar las banderas. De haber una colisión con un obstáculo el juego se detiene. El jugador puede continuar marcando el botón de Retry
.
En esta experiencia de laboratorio practicarás el uso de expresiones matemáticas y estructuras condicionales para implementar la detección de colisiones del carrito contra los obstáculos y contra las banderas.
Tu tarea es completar el diseño de la aplicación del juego.
El primer paso en esta experiencia de laboratorio es familiarizarte con las funciones pre-definidas en el código. Pon enfazis en las funciones:
Car::getYCar()
- Devuelve la posición Y del carro en la pista.Flag::getXFlag()
- Devuelve la posición X de la bandera en la pista.Flag::getYFlag()
- Devuelve la posición Y del bandera en la pista.Obstacle::getXObstacle()
- Devuelve la posición X del obstáculo en la pista.Obstacle::getYObstacle()
- Devuelve la posición Y del obstáculo en la pista.Play::setScore(n)
- Recibe un número entero y lo suma a la puntuación del juego.Flag::hide()
- Esconde la bandera. Desaparece de la pista.Invocarás estas funciones en el código que completarás para detectar las colisiones. Note que no hay función getXCar() porque el carro nunca se mueve del eje de X.
Instrucciones
Carga a Qt creator el proyecto CarScrollingGame
haciendo doble “click” en el archivo CarScrollingGame.pro
en el directorio Documents/eip/Conditionals-CarScrollingGame
de tu computadora. También puedes ir a http://bitbucket.org/eip-uprrp/conditionals-carscrollinggame
para descargar la carpeta Conditionals-CarScrollingGame
a tu computadora.
Configura el proyecto. El proyecto consiste de varios archivos. Solo escribirás código en el archivo work.cpp
. No debes cambiar nada en los demás archivos. Sin embargo, debes familiarizarte con las funciones que ya están definidas en ellos, ya que usarás algunas de ellas para crear tu código.
obtstacle.cpp
y obstacle.h
: contienen las funciones del objeto Obstacleflag.cpp
y flag.h
: contienen las funciones del objeto Flagcar.cpp
y flag.h
: contienen las funciones del objeto CarLa función setTrack(Track track_type)
recibe un variable de tipo Track
que puede contener los valores:
* play::DAY - para la pista de día
* play::NIGHT - para la pista de la noche
* play::BEACH - para la pista de la playa
* play::CANDYLAND - para la pista de dulces
Esta función cambia el ambiente de la pista del juego dependiendo del tipo de track que se recibe. En este ejercicio el estudiante utilizará la estructura de condición de C++ switch para cambiar los atributos de la pista.
Los atributos que se pueden cambiar de la pista son:
* la imagen de la pista usando la función `setTrackPixmap()`
* la imagen de los obstáculos usando la función `setObstaclesPixmap()`
La función setTrackPixmap(Track )
recibe una variable de tipo Track que puede ser un valor entre (play::DAY, play::NIGHT, play::BEACH, play::CANDYLAND)
La función setObstaclePixmap(string) recibe una variable de tipo string que puede ser un valor entre (“hole”, “cone”, “it”, “zombie”, “spongebob”, “patric”, “monster”).
En este ejercicio debes completar la función setTrack()
de tal manera que utilizando la estructura de selección switch se cambie la pista con el valor de tipo Track que la función setTrack()
recibe y si el tipo de pista que se recibe es:
En las opciones que tengan dos posibles obstáculos utilze la función rand() para escoger aleatoriamente entre un obstáculo u otro.
En este ejercicio completaras la función obstacleCollision(Obstacle obs, Car car)
que recibe un objeto de tipo Obstacle
y otro objeto de tipo Car
utilizando la estructura de selección if/else
para detectar una colisión entre el obstáculo y el carro. La función devuelve cierto si hay colisión y falso si no hay colisión.
Para detectar la colisión debe solicitar las coordenadas del obstáculo y la coordenada Y del carro. Recuerde que el carro no se desplaza en la coordenada X. Por ende para que ocurra una colisión con el carro, el obstáculo debe estar en la misma coordenada X del carro y a una distancia del centro del carro hacia los lados en la coordenada Y. La coordenada X del carro se encuentra guardada en la variable constante CARX
. El rango de distancia del centro del carro hacia los lados se encuentra guardada en la variable constante OBSTACLERANGE
.
Si se detecta una colisión la función debe devolver true
y si no debe devolver false
.
En este ejercicio completarás la función flagCollision(Obstacle obs, Car car)
que recibe un objeto de tipo Obstacle
y otro objeto de tipo Flag
utilizando la estructura de selección if/else
para detectar una colisión entre la bandera y el carro. Esta función es bien similar a la del ejericio 2, excepto que esta función no devuelve nada. Las acciones que se toman cuando se detecta la colisión se van a tomar dentro de la función.
En este caso si se detecta una colisión, se debe aumentar la puntuación del juego 30 puntos utilizando la función setScore()
y esconder la bandera para que cree la ilusión de que se recogió la bandera en la colisión utilizando la función flag.hide()
.
Throughout this exercise the students will practice:
This laboratory consist on a simple side scrolling game. The user controls a car on the left edge of the screen, that can be moved up and down. Obstacles and checkpoints are created on the right edge of the screen, and these scroll toward the user on the left edge. The user earns a score, shown at the bottom, and the game ends when the user hits an obstacle. This laboratory is an adaptation of the assigment presented by Dave Feinberg [1].
In the following text box, copy the code that you developed for the program. Remember to properly comment the code and use good indentation and variable naming practices.
[1] Dave Feinberg, http://nifty.stanford.edu/2011/feinberg-generic-scrolling-game/