Ver Mensaje Individual
  #6 (permalink)  
Antiguo 30/11/2014, 16:08
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 3 meses
Puntos: 204
Respuesta: Mastermind c++ (juego)

Para comprobar si los caracteres están en minúsculas hay una forma mejor que ir recorriendo el string:

*Haces una copia del string
*Conviertes la copia a minúsculas
*Si ambos strings son iguales... pues eso

Vale que string no dispone de ningún método para hacer la conversión a minúsculas de forma directa, pero puedes valerte de la stl:

Código C++:
Ver original
  1. #include <algorithm>
  2.  
  3. std::string copia = cadena;
  4. std::transform(copia.begin(), copia.end(), copia.begin(), ::tolower);
  5.  
  6. if ( copia == cadena )
  7. ...

Por otro lado, el procedimiento para detectar las coincidencias podría ser algo más o menos así:

Código C++:
Ver original
  1. // Creamos un array para los resultados, así podemos ir marcando los aciertos
  2. std::vector< bool> resultado( cadena.length( ), false );
  3. int aciertos = 0;
  4. int aproximaciones = 0;
  5.  
  6. // Primero buscamos los aciertos
  7. for ( size_t i = 0; i < cadena.length( ); ++i )
  8. {
  9.   if ( cadena[ i ] == referencia[ i ] )
  10.   {
  11.     // Marcamos el acierto, esto nos permite evitar estos valores al contar las aproximaciones
  12.     resultado[ i ] = true;
  13.     aciertos++;
  14.   }
  15. }
  16.  
  17. // Después buscamos las aproximaciones
  18. for ( size_t i = 0; i < cadena.length( ); ++i )
  19. {
  20.   if ( !resultado[ i ] )
  21.   {
  22.     size_t aprox = 0;
  23.    
  24.     while( true )
  25.     {
  26.       // Buscamos la siguiente referencia
  27.       aprox = std::find( referencia, aprox );
  28.  
  29.       // Comprobamos si no se encuentran más referencias
  30.       if ( aprox ==  string::npos )
  31.         break;
  32.  
  33.       // Si la referencia no ha sido utilizada, la marcamos
  34.       if ( resultado[ aprox ] == 0 )
  35.       {
  36.         aproximaciones++;
  37.  
  38.         // eliminamos la aproximación de la referencia
  39.         referencia[ aprox ] = '_'; // Cualquier caracter que no pertenezca a la secuencia vale.
  40.         break;
  41.       }
  42.     }
  43.   }
  44. }
  45.  
  46. // Componemos el string
  47. return to_string( aciertos ) + "A, " + to_string( aproximaciones );

No lo he compilado, pero creo que debería funcionar.