11. Control de Flujo 2: Iteraciones.
Sirve para tomar decisiones de todo tipo. Sirve para evaluar condiciones, ej: extremos de la pantalla. En videojuegos típicamente usado para la IA de enemigos. if( enemigo.distancia( protagonista ) < dist_min) enemigo.atacar(); else enemigo.patrullar();
Usado cuando se tiene un número finito de valores para una variable. Típicamente usado para el diseño de menús. Típicamente usado para el manejo de estados. (usando Enum) switch(estado) { case ST_UP: protagonista.MoverUp(); break; case ST_LEFT: protagonista.MoverLeft(); break; case ST_RIGHT: protagonista.MoverRight(); break; case ST_DOWN: protagonista.MoverDown(); break; case ST_SHOOT: protagonista.Disparar() break; default: break; }
Iteraciones
Usado para cuando se itera mientras se cumpla una condición. Ejemplo: Un recolector de recursos, recolectará mientras hayan recursos. Típicamente usado en el ciclo principal del videojuego.
While while( ) { ; }
while( continuar ) { captarTeclas(); protagonista.Mover(); moverEnemigos(); aplicarFisica(); }
Usado para iterar un número finito de veces. Típicamente utilizado para iterar un conjunto determinado de elementos, donde se conoce el nº de los elementos. for( ; ; ) { ; }
For Usado para iterar un número finito de veces. Típicamente utilizado para iterar un conjunto determinado de elementos, donde se conoce el nº de los elementos. for(int i=0; i<n; i++) { ; }
For Usado para iterar un número finito de veces. Típicamente utilizado para iterar un conjunto determinado de elementos, donde se conoce el nº de los elementos. for(int i=0; i<enemigos.size(); i++) { Enemigo en = enemigos.get(i); en.Mover(); }
Usado para quebrar el flujo normal de una iteración y terminar ésta. Usado para terminar una iteración cuando se ha cumplido una condición.
for(int i=0; i<enemigos.size(); i++) { Enemigo en = enemigos.get(i); if(bala.isColision(en)) { bala.Morir(); en.Morir(); break; }
Usado para quebrar el flujo normal de una iteración y continuar con la próxima iteración. Usado para no realizar el flujo normal de la iteración cuando se cumpla una condición.
for(int i=0; i<personajes.size(); i++) { Personaje p = personajes.get(i); if(p.getColor() == color) continuar; if(myBala.isColision(personaje.get(i))) { bala.Morir(); p.Morir(); break; }
Lo primero es asignar qué estados puede tener cada casilla. enum Casilla { CROSS, CIRCLE, NONE };
Tendremos un tablero que lo podremos usar con los siguientes métodos: //Constructor del tablero, con un ancho y largo específico public Tablero(int width, int height); //Obtiene la marca asignada a una casilla x, y public Casilla getMarcaCasilla(int x, int y); //Cambia la marca asignada a una casilla public void setMarcaCasilla(Casilla marca, int x, int y)
Debemos crear una función que inicialice el tablero y que sirva para resetearlo cuando queramos iniciar un nuevo juego. void Resetear() { … }
Finalmente debemos determinar si un jugador ha ganado una partida bool isFinalizado(Casilla tipo) { // verificar en eje x // verificar en eje y // verificar en diagonales }
Ejercicio: Crear función que determine dado un cierto estado del tablero, si es que puede ganar un jugador o no. bool PuedeGanar(Casilla tipo);