#include "Juego.h" Juego::Juego(char* nombreTXT): datosIn(), datosOut() { try { archIn.open(nombreTXT, ifstream::in); dicc = NULL; } catch (exception& e) { cout << endl << "Excepcion : " << e.what() << endl; throw e; } } Juego::~Juego() { for(int i = 0; i < datosIn.cantidadMediciones; i++) { delete trayectorias[i]; } delete [] trayectorias; } strSalida Juego::Jugar() { //clock_t tiempoLimite = clock() + 19.7 * CLOCKS_PER_SEC ; cout << "Leyendo datos del archivo de entrada ... "; cargarDatosDeEntrada(); cout << "Leer OK!" << endl; cout << "Cargando solucio trivial ..."; cargarDatosDeSalida_SolTrivial(); cout << "Cargar OK!" << endl; cout << "Generando diccionario ... "; dicc = new DiccionarioConj(datosIn.cantidadMisiles); cout << "Diccionario OK!" << endl; cout << "Generando Splines ... "; generarTrayectorias(); cout << "Spline OK!" << endl; cout << "Calculando Intersecciones ... "; calcularIntersec(); cout << "Intersecciones OK!" << endl; return datosOut; } void Juego::cargarDatosDeEntrada() { try { archIn >> datosIn.cantidadMisiles; archIn >> datosIn.cantidadMediciones; datosIn.pedirMemoria(); punto coordenada; for(int i = 0; i < datosIn.cantidadMisiles; i++) { for(int j = 0; j < datosIn.cantidadMediciones; j++) { archIn >> coordenada.first; archIn >> coordenada.second; datosIn.coordenadasMisiles[i][j] = coordenada; } } archIn >> datosIn.cantidadBombas; archIn >> datosIn.radioBomba; archIn >> datosIn.radioPlaneta; } catch (exception& e) { cout << endl << "Excepcion : " << e.what() << endl; throw e; } archIn.close(); } void Juego::cargarDatosDeSalida_SolTrivial() { datosOut.cantidadExplosionesBombas = datosIn.cantidadBombas; datosOut.pedirMemoria(); int tfinal = datosIn.cantidadMediciones; float tiempo = (float)tfinal + .05; tfinal -= 1; punto p; for(int i = 0; i < datosOut.cantidadExplosionesBombas; i ++) { p = datosIn.coordenadasMisiles[i][tfinal]; datosOut.explosionesBombas[i] = pair(tiempo, p ); } } void Juego::generarTrayectorias() { trayectorias = new SplineCub*[datosIn.cantidadMisiles]; for(int i = 0; i < datosIn.cantidadMisiles; i++) { //cout << "\tCalcular Trayectoria " << i << "... "; calcularTrayectoria(i); //cout << "Trayectoria " << i << " OK!" << endl; } } void Juego::calcularTrayectoria(int misil) { int tamX = datosIn.cantidadMediciones; punto datosX[tamX]; punto datosY[tamX]; for(int i = 0; i < tamX; i++) { datosX[i] = punto(i+1, datosIn.coordenadasMisiles[misil][i].first); datosY[i] = punto(i+1, datosIn.coordenadasMisiles[misil][i].second); } trayectorias[misil] = new SplineCub(tamX,datosX,datosY); } void Juego::deADos() { ConjPuntos * pts; punto p1; punto p2; float rt = datosIn.radioPlaneta + datosIn.radioBomba; float rb = datosIn.radioBomba; float t = datosIn.cantidadMediciones + .05 ; // No se puede disparar en el tiempo de la ultima medicion float dist; bool estaEnLaBola[datosIn.cantidadMisiles - 1]; for (int i = 0 ; i < datosIn.cantidadMisiles -1 ; i ++) estaEnLaBola[i] = false; bool hayMas = true; while ( hayMas ) { for(int i = 0 ; i < datosIn.cantidadMisiles - 1; i++) { p1 = trayectorias[i]->evaluarSpline(t); //if( i == 6 ) //cout << p1 << endl; if ( !p1.distACeroMenor(rt) ) { for ( int j = i + 1 ; j < datosIn.cantidadMisiles ; j++ ) { p2 = trayectorias[j]->evaluarSpline(t); dist = p1.distancia(p2); // se puede hacer static. if ( dist <= rb && !p2.distACeroMenor(rt) ) { pts = new ConjPuntos(t); pts->agregarElemento(p1); pts->agregarElemento(p2); dicc->definir(pts); // Creo que habrķa que agregar un dicc // a la parte privada de juego // o algo por el estilo. } } } else { //cout << "El " << i << " entro en el planeta " << endl; estaEnLaBola[i] = true; } } t += 0.5; //cout << " " << t << " " ; hayMas = false; for (int i = 0 ; i < datosIn.cantidadMisiles -1 ; i ++) hayMas = hayMas || !estaEnLaBola[i]; } } void Juego::deATres() { int deAn = 3; unsigned int tam; ConjPuntos** intersecAnt = dicc->obtener(deAn-1, tam); ConjPuntos * pts; if(tam >= deAn) { for(int i = 0 ; i < tam - 2 ; i ++) { for(int j = i + 1 ; j < tam - 1 ; j ++ ) { for( int k = j + 1 ; k < tam ; k ++ ) { cout << "i, j , k " << i << ", " << j << ", " << k << endl; pts = new ConjPuntos(intersecAnt[i]); if( (pts->agregarOtroConj(intersecAnt[j]) == deAn) && (pts->agregarOtroConj(intersecAnt[k]) == deAn) ) { cout << "con pts " << *pts << endl; dicc->definir(pts); } } } } } //delete [] intersecAnt ; } void Juego::deACuatro(){ int deAn = 4; unsigned int tam; ConjPuntos** intersecAnt = dicc->obtener(deAn-1, tam); ConjPuntos * pts; if(tam >= deAn) { for(int i = 0 ; i < tam -3 ; i ++) { for(int j = i + 1 ; j < tam - 2 ; j ++ ) { for( int k = j + 1 ; k < tam -1; k ++ ) { for( int m = k + 1; m < tam ; m++ ) { pts = new ConjPuntos(intersecAnt[i]); if( pts->agregarOtroConj(intersecAnt[j]) == deAn && pts->agregarOtroConj(intersecAnt[k]) == deAn && pts->agregarOtroConj(intersecAnt[m]) == deAn) { dicc->definir(pts); } } } } } } delete [] intersecAnt ; } void Juego::deACinco(){ int deAn = 5; unsigned int tam; ConjPuntos** intersecAnt = dicc->obtener(deAn-1, tam); ConjPuntos * pts; if(tam >= deAn) { for(int i = 0 ; i < tam - 4 ; i ++) { for(int j = i + 1 ; j < tam - 3 ; j ++ ) { for( int k = j + 1 ; k < tam - 2; k ++ ) { for( int m = k + 1; m < tam - 1; m++ ) { for(int r = m +1; r < tam; r++) { pts = new ConjPuntos(intersecAnt[i]); if( pts->agregarOtroConj(intersecAnt[j]) == deAn && pts->agregarOtroConj(intersecAnt[k]) == deAn && pts->agregarOtroConj(intersecAnt[m]) == deAn && pts->agregarOtroConj(intersecAnt[r]) == deAn) { dicc->definir(pts); } } } } } } } delete [] intersecAnt ; } void Juego::calcularIntersec() { cout << "\n\tCalculando Intersecciones de a dos ... "; deADos(); cout << " OK! " << "Hay " << dicc->cardinal(2) << " elem." << endl; cout << "\tCalculando Intersecciones de a tres ... "; deATres(); cout << " OK! " << "Hay " << dicc->cardinal(3) << " elem." << endl; cout << "\tCalculando Intersecciones de a Cuatro ... "; deACuatro(); cout << " OK! " << "Hay " << dicc->cardinal(4) << " elem." << endl; cout << "\tCalculando Intersecciones de a cinco ... "; deACinco(); cout << " OK! " << "Hay " << dicc->cardinal(5) << " elem." << endl; cout << "Diccionario despues de calcu inter ... " << *dicc << endl; }