Programación Gráfica 5. Introducción a C++.
Palabras reservadas asm auto bool break case catch char class const const_cast continue default delete do double dynamic_cast else enum explicit extern false float for friend goto if inline int long mutable namespace new operator private protected public register reinterpret_cast return short signed sizeof static static_cast struct switch template this throw true try typedef typeid typename union unsigned using virtual void volatile while
Control de Flujo
If - else Sirve para tomar desiciones. En videojuegos típicamente usado para la IA de enemigos. if( enemigo->distancia( protagonista ) < dist_min) enemigo->atacar(); else enemigo->patrullar();
Switch switch(tecla) { case W: protagonista->MoverUp(); break; case A: protagonista->MoverLeft(); case D: protagonista->MoverRight(); case S: protagonista->MoverDown(); case ESPACE: protagonista->Disparar() case ESC: continuar = false; default: } 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)
While “Mientras”. 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( continuar ) { captarTeclas(); protagonista->Mover(); moverEnemigos(); aplicarFisica(); }
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.get(i)->Mover(); }
For
Sentencia Break 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++) { if(bala->isColision(enemigo->get(i))) bala->Morir(); enemigo->get(i)->Morir(); break; }
Sentencia Continue 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++) { if(personaje.get(0)->getColor() == color) continuar; if(bala->isColision(enemigo->get(i))) bala->Morir(); enemigo->get(i)->Morir(); break; }
Arrays
String Cadenas de caracteres. char <identificador> [<longitud máxima>]; char Saludo[5]; Saludo = "HOLA" ; Saludo[0] = 'H'; Saludo[1] = 'O'; Saludo[2] = 'L'; Saludo[3] = 'A'; Saludo[4] = '\000'; char Saludo[5] = "HOLA“;
Arrays Arreglos, representa un conjunto de elementos de un mismo tipo, donde el tamaño ya es conocido. Usado típicamente para: Tableros Videojuegos 2D donde se conoce cada una de las posiciones. Conjunto de elementos, cuando se sabe de antemano el numero de los elementos.
Arrays <tipo> <identificador>[<núm_elemen>][[<núm_elemen>]...]; int Vector[3]; Vector[0] = x; Vector[1] = y; Vector[2] = z; Vector[2] += velocidadZ; Vector[2] -= velocidadZ;
Arrays <tipo> <identificador>[<núm_elemen>][[<núm_elemen>]...]; int Vector[3]; Vector[0] = x; Vector[1] = y; Vector[2] = z; Vector[2] += velocidadZ; Vector[2] -= velocidadZ;
Arrays int Tabla[10][10]; char DimensionN[4][15][6][8][11]; ... DimensionN[3][11][0][4][6] = DimensionN[0][12][5][3][1]; Tabla[0][0] += Tabla[9][9]; int tablero[3][3]; tablero[0][0] = 1; tablero[1][0] = 2; float R[10] = {2, 32, 4.6, 2, 1, 0.5, 3, 8, 0, 12}; float S[] = {2, 32, 4.6, 2, 1, 0.5, 3, 8, 0, 12};
Arrays
Arrays
Confección de un Tablero Videojuego OXO
Confección de un Tablero: OXO Lo primero es asignar qué estados puede tener cada casilla. enum TipoCasilla { CRUZ, CIRCULO, NONE }; int tamano; // tamaño del tablero. Lo segundo es crear nuestro tablero. TipoCasilla tablero[3][3];
Confección de un Tablero: OXO Debemos crear una función que inicialice el tablero y que sirva para resetearlo cuando queramos iniciar un nuevo juego. void Resetear() { for(int i=0; i<tamano; i++) for(int j=0; j<tamano; j++) tablero[i][j] = NONE; }
Confección de un Tablero: OXO Debemos crear una función que asigne un estado a una casilla, para los distintos jugadores. void Marcar(TipoCasilla tipo, int x, int y) { tablero[x][y] = tipo; }
Confección de un Tablero: OXO Debemos crear una función que nos indique en qué estado está cada una de las casillas. TipoCasilla getCasilla(int x, int y) { return tablero[x][y]; }
Confección de un Tablero: OXO Finalmente debemos determinar si un jugador ha ganado una partida bool isFinalizado(TipoCasilla tipo) { //verificamos en el eje x for(int i=0; i<tamano; i++) for(int j=0; j<tamano; j++) if(tablero[i][j] != tipo) break; else if(j == tamano -1) return true; }
Confección de un Tablero: OXO bool isFinalizado(TipoCasilla tipo) { //verificamos en el eje y for(int j=0; j<tamano; j++) for(int i=0; i<tamano; i++) if(tablero[i][j] != tipo) break; else if(j == tamano -1) return true; }
Confección de un Tablero: OXO bool isFinalizado(TipoCasilla tipo) { //verificamos las diagonales for(int i=0; i<tamano; i++) if(tablero[i][i] != tipo) break; else if(j == tamano -1) return true; } return false; //Sino hubo un resultado exitoso
Confección de un Tablero: OXO Ejercicio: Crear función que determine dado un cierto estado del tablero, si es que puede ganar un jugador o no. bool PuedeGanar(TipoCasilla tipo);
Preguntas ¿?