|
@@ -1,16 +1,19 @@
|
1
|
|
-[English](#markdown-header-selection-structures-car-scrolling-game) | [Español](#markdown-header-estructuras-de-seleccion-juego-de-desplazamiento-de-coche)
|
|
1
|
+#Estructuras de decisión - Juego de desplazamiento de carro
|
2
|
2
|
|
3
|
|
-# Estructuras de Selección - Juego de Desplazamiento de coche
|
|
3
|
+![main1.png](images/main1.png)
|
|
4
|
+![main2.png](images/main2.png)
|
|
5
|
+![main3.png](images/main3.png)
|
4
|
6
|
|
5
|
7
|
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.
|
6
|
8
|
|
7
|
|
-![](images/csg01.png)
|
8
|
9
|
|
9
|
|
-## Objetivos:
|
10
|
10
|
|
11
|
|
-1. Utilizar expresiones relacionales y seleccionar operadores lógicos adecuados para la toma de decisiones.
|
|
11
|
+##Objetivos:
|
|
12
|
+
|
|
13
|
+1. Utilizar expresiones relacionales y seleccionar operadores lógicos adecuados para la toma de decisiones.
|
12
|
14
|
2. Aplicar estructuras de decisión.
|
13
|
15
|
|
|
16
|
+
|
14
|
17
|
## Pre-Lab:
|
15
|
18
|
|
16
|
19
|
Antes de llegar al laboratorio debes:
|
|
@@ -21,13 +24,21 @@ Antes de llegar al laboratorio debes:
|
21
|
24
|
|
22
|
25
|
2. Haber estudiado los conceptos e instrucciones para la sesión de laboratorio.
|
23
|
26
|
|
24
|
|
-3. Haber tomado el quiz Pre-Lab que se encuentra en Moodle.
|
|
27
|
+---
|
|
28
|
+
|
|
29
|
+---
|
|
30
|
+
|
25
|
31
|
|
26
|
|
-## Juego de Desplazamiento de coche.
|
|
32
|
+## Juego de desplazamiento de carro
|
27
|
33
|
|
28
|
|
-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.
|
|
34
|
+Los juegos de colisiones consisten de manejar un objeto esquivando o provocando la posible colisión contra otros objetos. La colisión puede descontar puntos o detener el juego. También hay colisiones con algunos objetos que acumulan puntos. En el juego de esta experiencia de laboratorio el objeto que se maneja es un carrito, los objetos que causan que el juego se detenga son pinos, agujeros, entre otros, y los objetos que suman puntos son las banderas.
|
|
35
|
+
|
|
36
|
+Los controles del juego son bien sencillos: la tecla con la flecha hacia arriba desplaza el carro hacia arriba y la tecla con la flecha hacia abajo desplaza el carro hacia abajo. Al jugar, el juego da la sensación de que el carro está en movimiento hacia la derecha usando un método muy simple: desplazando el fondo con sus obsteaculos y banderas hacia la izquierda mientras el carro permanece en el mismo lugar. El jugador puede desplazar el carro hacia arriba o 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`.
|
|
37
|
+
|
|
38
|
+---
|
|
39
|
+
|
|
40
|
+---
|
29
|
41
|
|
30
|
|
-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`.
|
31
|
42
|
|
32
|
43
|
## Sesión de laboratorio:
|
33
|
44
|
|
|
@@ -36,73 +47,96 @@ En esta experiencia de laboratorio practicarás el uso de expresiones matemátic
|
36
|
47
|
Tu tarea es completar el diseño de la aplicación del juego.
|
37
|
48
|
|
38
|
49
|
|
39
|
|
-### Ejercicio 1: Familiarizate con las funciones pre-definidas
|
|
50
|
+### Ejercicio 1: Familiarizate con las funciones pre-definidas.
|
40
|
51
|
|
41
|
|
-El primer paso en esta experiencia de laboratorio es familiarizarte con las funciones pre-definidas en el código. Pon enfazis en las funciones:
|
|
52
|
+El primer paso en esta experiencia de laboratorio es familiarizarte con las funciones (métodos) pre-definidas en el código. Invocarás algunas de estas funciones en el código que completarás para detectar las colisiones.
|
42
|
53
|
|
43
|
|
-* `Car::getYCar()` - Devuelve la posición Y del carro en la pista.
|
44
|
|
-* `Flag::getXFlag()` - Devuelve la posición X de la bandera en la pista.
|
45
|
|
-* `Flag::getYFlag()` - Devuelve la posición Y del bandera en la pista.
|
46
|
|
-* `Obstacle::getXObstacle()` - Devuelve la posición X del obstáculo en la pista.
|
47
|
|
-* `Obstacle::getYObstacle()` - Devuelve la posición Y del obstáculo en la pista.
|
48
|
|
-* `Play::setScore(n)` - Recibe un número entero y lo suma a la puntuación del juego.
|
49
|
|
-* `Flag::hide()` - Esconde la bandera. Desaparece de la pista.
|
|
54
|
+**Instrucciones**
|
50
|
55
|
|
51
|
|
-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.
|
|
56
|
+1. Descarga la carpeta `Conditionals-CarScrollingGame` de `Bitbucket` usando un terminal, moviéndote al directorio `Documents/eip`, y escribiendo el comando `git clone http://bitbucket.org/eip-uprrp/conditionals-carscrollinggame`.
|
52
|
57
|
|
53
|
|
-**Instrucciones**
|
|
58
|
+2. Carga a Qt creator el proyecto `CarScrollingGame` haciendo doble "click" en el archivo `CarScrollingGame.pro` que se encuentra en la carpeta `Documents/eip/Conditionals-CarScrollingGame` de tu computadora.
|
|
59
|
+
|
|
60
|
+3. 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.**
|
|
61
|
+
|
|
62
|
+4. Vas a necesitar algunos de los métodos definidos en los siguientes archivos para crear tu código.
|
54
|
63
|
|
55
|
|
-1. 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.
|
|
64
|
+ * `car.h` y `car.cpp`: contienen la definición de la clase `Car`, los métodos de esta clase y sus declaraciones.
|
|
65
|
+ * `flag.h` y `flag.cpp`: contienen la definición de la clase `Flag`, los métodos de esta clase y sus declaraciones.
|
|
66
|
+ * `obtstacle.h` y `obstacle.cpp`: contienen la definición de la clase `Obstacle`, los métodos de esta clase y sus declaraciones.
|
|
67
|
+ * `play.h` y `play.cpp`: contienen la definición de la clase `Play`, los métodos de esta clase y sus declaraciones.
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+ Familiarízate con los métodos en estos archivos. Pon énfazis en los siguientes métodos:
|
56
|
71
|
|
57
|
|
-2. 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.
|
|
72
|
+ * `Car::getYCar()`: Devuelve la coordenada en $Y$ de la posición del carro en la pista.
|
|
73
|
+ * `Flag::getXFlag()`: Devuelve la coordenada en $X$ de la posición de la bandera en la pista.
|
|
74
|
+ * `Flag::getYFlag()`: Devuelve la coordenada en $Y$ de la posición de la bandera en la pista.
|
|
75
|
+ * `Flag::hide()`: Esconde la bandera. Desaparece de la pista.
|
|
76
|
+ * `Obstacle::getXObstacle()`: Devuelve la coordenada en $X$ de la posición del obstáculo en la pista.
|
|
77
|
+ * `Obstacle::getYObstacle()`: Devuelve la coordenada en $Y$ de la posición del obstáculo en la pista.
|
|
78
|
+ * `Play::setScore(n)`: Recibe un número entero y lo suma a la puntuación del juego.
|
|
79
|
+
|
58
|
80
|
|
59
|
|
- * `obtstacle.cpp` y `obstacle.h`: contienen las funciones del objeto Obstacle
|
60
|
|
- * `flag.cpp` y `flag.h`: contienen las funciones del objeto Flag
|
61
|
|
- * `car.cpp` y `flag.h`: contienen las funciones del objeto Car
|
|
81
|
+ Nota que no hay método `getXCar()` porque el carro no se desplaza en el eje de $X$.
|
62
|
82
|
|
63
|
83
|
### Ejercicio 2: Completar la función para cambiar la pista del juego.
|
64
|
84
|
|
65
|
|
-La función `setTrack(Track track_type)` recibe un variable de tipo `Track` que puede contener los valores:
|
|
85
|
+En este ejercicio utilizarás la estructura de condición de C++ **switch** para cambiar los atributos de la pista. Completarás el método `setTrack` que se encuentra en el archivo `work.cpp`. Este método cambia el ambiente de la pista del juego dependiendo del valor que recibe el parámetro `track_type`.
|
|
86
|
+
|
|
87
|
+El método `setTrack` recibe un valor de tipo `Track` que puede ser:
|
66
|
88
|
|
67
|
89
|
* play::DAY - para la pista de día
|
68
|
90
|
* play::NIGHT - para la pista de la noche
|
69
|
91
|
* play::BEACH - para la pista de la playa
|
70
|
92
|
* play::CANDYLAND - para la pista de dulces
|
71
|
93
|
|
72
|
|
-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.
|
73
|
|
-
|
74
|
|
-Los atributos que se pueden cambiar de la pista son:
|
|
94
|
+Los atributos de la pista que se pueden cambiar son:
|
75
|
95
|
|
76
|
96
|
* la imagen de la pista usando la función `setTrackPixmap()`
|
77
|
97
|
* la imagen de los obstáculos usando la función `setObstaclesPixmap()`
|
78
|
98
|
|
79
|
|
-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**)
|
|
99
|
+La función `setTrackPixmap(Track)` ya está definida y recibe una variable de tipo `Track` que puede ser un valor entre (**play::DAY**, **play::NIGHT**, **play::BEACH**, **play::CANDYLAND**).
|
|
100
|
+
|
|
101
|
+La función `setObstaclePixmap(string)` ya está definida y recibe una variable de tipo `string` que puede ser un valor entre (**"hole"**, **"cone"**, **"it"**, **"zombie"**, **"spongebob"**, **"patric"**, **"monster"**).
|
|
102
|
+
|
|
103
|
+**Instrucciones**
|
80
|
104
|
|
81
|
|
-La función setObstaclePixmap(string) recibe una variable de tipo string que puede ser un valor entre (**"hole"**, **"cone"**, **"it"**, **"zombie"**, **"spongebob"**, **"patric"**, **"monster"**).
|
|
105
|
+Para completar la función `setTrack()`:
|
82
|
106
|
|
83
|
|
-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:
|
|
107
|
+1. Cambia la imagen de la pista de acuerdo al valor `Track` recibido.
|
84
|
108
|
|
85
|
|
-* play::DAY - los obstáculos sean de tipo "hole" o "cone", si el
|
86
|
|
-* play::NIGHT - los obstáculos sean de tipo "it" o "zombie"
|
87
|
|
-* play::BEACH - los obstáculos sean de tipo "spongebob" o "patric"
|
88
|
|
-* play::CANDYLAND - los obstáculos sean de tipo "monster"
|
|
109
|
+2. Cambia la imagen de los obstáculos utilizando la estructura de selección `switch` de modo que los obstáculos cambien de acuerdo al valor recibido por `setTrack()`. Si el tipo de pista que se recibe es:
|
89
|
110
|
|
90
|
|
-En las opciones que tengan dos posibles obstáculos utilze la función rand() para escoger aleatoriamente entre un obstáculo u otro.
|
|
111
|
+ * `play::DAY` - los obstáculos sean de tipo "hole" o "cone", si el
|
|
112
|
+ * `play::NIGHT` - los obstáculos sean de tipo "it" o "zombie"
|
|
113
|
+ * `play::BEACH` - los obstáculos sean de tipo "spongebob" o "patric"
|
|
114
|
+ * `play::CANDYLAND` - los obstáculos sean de tipo "monster"
|
91
|
115
|
|
|
116
|
+ En las opciones que tengan dos posibles obstáculos utilza `rand() % 2` para escoger aleatoriamente entre un obstáculo u otro.
|
92
|
117
|
|
93
|
|
-### Ejercicio 2: Completar la función para colisiones con obstáculos.
|
94
|
118
|
|
95
|
|
-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.
|
|
119
|
+### Ejercicio 3: Completar la función para colisiones con obstáculos.
|
96
|
120
|
|
97
|
|
-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`.
|
|
121
|
+En este ejercicio completarás el método `obstacleCollision` que se encuentra en el archivo `work.cpp`. La función recibe un objeto de clase `Obstacle` y otro objeto de clase `Car` y debe detectar si hay colisión o no entre el carro y el obstáculo. La función devuelve cierto si hay colisión entre el carro y un obstáculo y falso si no hay colisión.
|
|
122
|
+
|
|
123
|
+Para detectar la colisión la función debe solicitar las coordenadas del obstáculo y la coordenada en $Y$ del carro. Recuerda que el carro no se desplaza en la coordenada $X$, esa coordenada es fija y está guardada en la variable constante `CARX`. La colisión ocurre si el obstáculo tiene la misma coordenada en $X$ y está a cierta distancia hacia arriba y abajo de la coordenada en $Y$ como muestra la Figura 1. El rango de distancia del centro del carro hacia arriba y abajo se encuentra guardada en la variable constante `OBSTACLERANGE`.
|
98
|
124
|
|
99
|
125
|
Si se detecta una colisión la función debe devolver `true` y si no debe devolver `false`.
|
100
|
126
|
|
101
|
|
-### Ejercicio 3: Completar la función para colisiones con banderas.
|
|
127
|
+---
|
|
128
|
+
|
|
129
|
+![ColisionC.pdf](images/ColisionC.pdf)
|
|
130
|
+
|
|
131
|
+**Figura 1.** La imagen muestra las coordenadas $(CARX,Y)$ que debe tener el obstáculo para que ocurra una colisión.
|
|
132
|
+
|
|
133
|
+---
|
|
134
|
+
|
|
135
|
+### Ejercicio 4: Completar la función para colisiones con banderas.
|
102
|
136
|
|
103
|
|
-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.
|
|
137
|
+En este ejercicio completarás el método `flagCollision` que se encuentra en el archivo `work.cpp`. La función recibe un objeto de clase `Obstacle` y otro objeto de clase `Flag` y debe detectar si hay colisión o no entre el carro y la bandera. Esta función es bien similar a la función del Ejericio 3, excepto que esta función no devuelve valor. Las acciones que ocurren cuando se detecta la colisión se van a tomar dentro de la función.
|
104
|
138
|
|
105
|
|
-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()`.
|
|
139
|
+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 utilizando la función `flag.hide()` para crear la ilusión de que se recogió la bandera en la colisión.
|
106
|
140
|
|
107
|
141
|
|
108
|
142
|
|