Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: Zodiak98 en 22 Julio 2013, 20:09 PM

Título: [Ayuda] Simple juego.
Publicado por: Zodiak98 en 22 Julio 2013, 20:09 PM
Bueno es que estaba aburrido y me puse a programar un juego muy sencillo que trata sobre meter un numero entre el 1 y el 15 y tú compañero tiene que adivinarlo. Pero lo que quiero hacer es que no se puedan ingresar letras solo números acá esta el código:

Código (cpp) [Seleccionar]

#include <iomanip>
#include <cstdlib>
#include <windows.h>
#include <iostream>

using namespace std;

bool Ingreso_Numero(int* pNumero);
bool Adivina_Numero(int* pNumero);

int main()
{
  int numero;

  if(Ingreso_Numero(&numero))
   {
       system("cls");
       system("color 2");
       cout << "________________________________________________________________________________" << endl;
       cout << setw(60) << "*** Felicidades has ganado el juego! ***\n" << endl;
       cout << setw(50) << "|| El numero correcto es: " << numero << " ||\n" << endl;
       cout << setw(53) << "*** Gracias Por Jugar! ***" << endl;
       cout << "________________________________________________________________________________" << endl;
   }

   else
   {
       cout << endl;
       system("color 4");
       cout << "----------------------------------------------------------" << endl;
       cout << "Has perdido! \nEl numero correcto era: " << numero << endl;
       cout << "Trata nuevamente en la proxima..." << endl;
       cout << "-----------------------------------------------------------" << endl;
   }

   system("pause>nul");

   return 0;
}

bool Ingreso_Numero(int* pNumero)
{
   char Decision;

   Introduce_Numero:

   cout << "Introduce el numero para que adivine tu rival (1-15): ";
   cin >> *pNumero;

   Repeticion2:

   if(*pNumero > 15)
   {
       cout << endl;

       cout << "El numero ingresado es demasiado alto. " << endl;

       Introduce_Numero_Alto:

       cout << endl;

       cout << "Introduce el numero para que adivine tu rival (1-15): ";
       cin >> *pNumero;

       if(*pNumero > 15)
       {
           cout << endl;
           cout << "El numero ingresado es demasiado alto. " << endl;
           goto Introduce_Numero_Alto;
       }
   }

   if(*pNumero < 1)
   {
       cout << endl;
       cout << "El numero ingresado es demasiado bajo." << endl;

       Introduce_Numero_Bajo:

       cout << endl;

       cout << "Introduce el numero para que adivine tu rival (1-15): ";
       cin >> *pNumero;

       if(*pNumero < 1)
       {
           cout << endl;
           cout << "El numero ingresado es demasiado bajo. " << endl;
           goto Introduce_Numero_Bajo;
       }

       if(*pNumero > 15)
       {
           goto Repeticion2;
       }
   }

   if(*pNumero >= 1 && *pNumero <= 15)
   {
       Decision_Error:

       cout << endl;

       cout << "Estas seguro que deseas que tu rival adivine este numero S/N: ";
       cin >> Decision;

       if(Decision == 'N' || Decision == 'n')
       {
           cout << endl;
           goto Introduce_Numero;
       }

       else if((Decision != 'S' && Decision != 's') && (Decision != 'N' && Decision != 'n'))
       {
           cout << endl;
           cout << "Has introducido una decision erronea, intentalo nuevamente." << endl;
           cout << endl;
           goto Decision_Error;
       }

       else if(Decision == 'S' || Decision == 's')
       {
           cout << endl;
           system("cls");

           for(int x = 5 ; x > 0 ; x--)
           {
               cout << "El juego comenzara en: " << x << endl;
               Sleep(1000);
               system("cls");
           }
           return Adivina_Numero(pNumero);
       }
   }
}

bool Adivina_Numero(int* pNumero)
{
   int Contador_Vidas;
   int COMP_Numero;

   cout << "Tienes 5 intentos para adivinar el numero." << endl << endl;

   for(Contador_Vidas = 5 ; Contador_Vidas > 0 ; Contador_Vidas--)
   {
       cout << endl;

       repeticion:

       if(Contador_Vidas == 1)
       {
           cout << endl;

           cout << "Te queda: " << Contador_Vidas << " vida." << endl;
           cout << "Ingresa un numero: "; cin >> COMP_Numero;

           if(COMP_Numero <= 0 || COMP_Numero > 15)
           {
               if(COMP_Numero <= 0)
               {
                   cout << endl;

                   cout << "El numero ingresado es demasiado bajo."<< endl;

                   goto repeticion;
               }

               else if(COMP_Numero > 15)
               {
                   cout << endl;

                   cout << "El numero ingresado es demasiado alto.";

                   goto repeticion;
               }
           }
       }

       else
       {
           cout << endl;

           cout << "Te quedan: " << Contador_Vidas << " vidas." << endl;
           cout << "Ingresa un numero: "; cin >> COMP_Numero;

           if(COMP_Numero <= 0 || COMP_Numero > 15)
           {
               if(COMP_Numero <= 0)
               {
                   cout << endl;
                   cout << "El numero ingresado es demasiado bajo.";
                   cout << endl;

                   goto repeticion;
               }

               else if(COMP_Numero > 15)
               {
                   cout << endl;
                   cout << "El numero ingresado es demasiado alto.";
                   cout << endl;

                   goto repeticion;
               }
           }
       }

       if(COMP_Numero == *pNumero)
       {
           return true;
       }

       else
       {
           continue;
       }
   }

   return false;
}
Título: Re: [Ayuda] Simple juego.
Publicado por: Stakewinner00 en 22 Julio 2013, 23:57 PM
bastaría con un
if (!pNumero)
{
cout << "EROR";
exit(0);
}

en el caso de que pNumero sea int.

Usas demasiados gotos que no estan recomendados y duplicas ifs cuando no es necesario.
Te dejo aqui tu código que retoque, seguramente no es perfecto pero en vez de usar gotos uso whiles y resumo algunos ifs.

Código (cpp) [Seleccionar]
#include <iomanip>
#include <cstdlib>
#include <windows.h>
#include <iostream>

using namespace std;

int Ingreso_Numero();
bool Adivina_Numero(int pNumero);

int main()
{
int numero = Ingreso_Numero();
if( Adivina_Numero(numero)==true)
 {
     system("cls");
     system("color 2");
     cout << "________________________________________________________________________________" << endl;
     cout << setw(60) << "*** Felicidades has ganado el juego! ***\n" << endl;
     cout << setw(50) << "|| El numero correcto es: " << numero << " ||\n" << endl;
     cout << setw(53) << "*** Gracias Por Jugar! ***" << endl;
     cout << "________________________________________________________________________________" << endl;
 }
 else
 {
     cout << endl;
     system("color 4");
     cout << "----------------------------------------------------------" << endl;
     cout << "Has perdido! \nEl numero correcto era: " << numero << endl;
     cout << "Trata nuevamente en la proxima..." << endl;
     cout << "-----------------------------------------------------------" << endl;
 }
 system("pause>nul");
 return 0;
}

int Ingreso_Numero()
{
int pNumero;
char Decision;

while (Decision == 'N' || Decision == 'n'|| pNumero > 15 || pNumero < 1)
{
 cout << "Introduce el numero para que adivine tu rival (1-15): ";
 cin >> pNumero;

if (!pNumero)
{
cout << "EROR";
exit(0);
}  

 if (pNumero > 15)
 {
     cout << endl;
     cout << "El numero ingresado es demasiado alto. " << endl;
   } else  if (pNumero < 1)
 {
     cout << endl;
     cout << "El numero ingresado es demasiado bajo." << endl;
  } else {
cout << endl;
cout << "Estas seguro que deseas que tu rival adivine este numero S/N: ";
cin >> Decision;

while (Decision != 'N' && Decision != 'n' && Decision != 'S' && Decision != 's')
 {
cout << endl;
       cout << "Has introducido una decision erronea, intentalo nuevamente." << endl;
       cout << endl;
cin >> Decision;
}
system("cls");
}
}

         for(int x = 5 ; x > 0 ; x--)
         {
             cout << "El juego comenzara en: " << x << endl;
             Sleep(1000);
 system("cls");
         }
         return pNumero;
}

bool Adivina_Numero(int pNumero)
{
 int Contador_Vidas;
 int COMP_Numero;

 cout << "Tienes 5 intentos para adivinar el numero." << endl << endl;

 for(Contador_Vidas = 5 ; Contador_Vidas > 0 ; Contador_Vidas--)
 {
 cout << endl;
         cout << endl;
 if (Contador_Vidas == 1) {
         cout << "Te queda: " << Contador_Vidas << " vida." << endl;
 } else {
  cout << "Te quedan: " << Contador_Vidas << " vida." << endl;
  }
         cout << "Ingresa un numero: "; cin >> COMP_Numero;

             if(COMP_Numero <= 0)
             {
                 cout << endl << "El numero ingresado es demasiado bajo."<< endl;
 Contador_Vidas++;
             } else if(COMP_Numero > 15)  {
                 cout  << endl<< "El numero ingresado es demasiado alto.";
 Contador_Vidas++;
              } else if(COMP_Numero == pNumero) {
return true;
}
 }
 return false;
}

Título: Re: [Ayuda] Simple juego.
Publicado por: z3nth10n en 23 Julio 2013, 01:14 AM
Yo aviso que el resultado de numero cuando se acaba el juego no es certero así que.. :silbar:
Título: Re: [Ayuda] Simple juego.
Publicado por: Stakewinner00 en 23 Julio 2013, 10:04 AM
No hay nada peor que ayudar y equivocarte tu jaja.

De todos modos si que el código se puede reducir notablemente. En vez de usar esto

if(Contador_Vidas == 1)
      {

          if(COMP_Numero <= 0 || COMP_Numero > 15)
          {
              if(COMP_Numero <= 0)
              {
              }

              else if(COMP_Numero > 15)
              {
              }
          }
      }

      else
      {
          if(COMP_Numero <= 0 || COMP_Numero > 15)
          {
              if(COMP_Numero <= 0)
              {
              }

              else if(COMP_Numero > 15)
              {
              }
          }
      }

      if(COMP_Numero == *pNumero)
      {
      }

      else
      {
      }
  }


puedes hacer lo siguiente y en medio pus pones lo que haga falta


          if(COMP_Numero <= 0 || COMP_Numero > 15)
          {
if(Contador_Vidas == 1)
{}
              if(COMP_Numero <= 0)
              {
              }

              else if(COMP_Numero > 15)
              {
              }
          }
      } else if
      {
      } else if(COMP_Numero == *pNumero)
      {
      }

      else
      {
      }
  }


SALUDOS
Título: Re: [Ayuda] Simple juego.
Publicado por: z3nth10n en 23 Julio 2013, 12:08 PM
No se... Yo cuando he acabado el juego el juego me ha dicho que el numero que yo había ingresado era 1198 no se cuanto mil más. xD
Título: Re: [Ayuda] Simple juego.
Publicado por: Stakewinner00 en 23 Julio 2013, 12:39 PM
Eso era antes. Bueno la duda del usuario esta respondida, haber si le sirve o no lo del if (!pNumero)
{
cout << "EROR";
exit(0);
}

el probelma de esto es que en punteros no funciona. Vaya forma de complicarse la vida tiene Zodiak98
Título: Re: [Ayuda] Simple juego.
Publicado por: rir3760 en 23 Julio 2013, 18:26 PM
Cita de: Zodiak98 en 22 Julio 2013, 20:09 PM
Bueno es que estaba aburrido y me puse a programar un juego muy sencillo que trata sobre meter un numero entre el 1 y el 15 y tú compañero tiene que adivinarlo. Pero lo que quiero hacer es que no se puedan ingresar letras solo números
Con solo C++ estándar hay que limitarse a la validación una vez se genere el texto.

Debes leer una linea verificando que la lectura del entero sea exitosa y el siguiente carácter sea el avance de linea. Por ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include <limits>
using std::numeric_limits;

int main()
{
   int num;
   bool ok = false;
   bool error_critico = false;
   
   do {
      cout << "Teclea un numero: ";
      if (cin >> num && cin.get() == '\n')
         ok = true;
      else if (cin.eof() || cin.bad())
         error_critico = true;
      else {
         cout << "Entrada no valida" << endl;
         cin.clear();
         cin.ignore(numeric_limits<int>::max(), '\n');
      }
   }while (!ok && !error_critico);
   
   cout << endl;
   
   if (ok)
      cout << "El numero es " << num << endl;
   else
      cout << "Error critico en la lectura" << endl;
   
   return 0;
}


Un saludo
Título: Re: [Ayuda] Simple juego.
Publicado por: Zodiak98 en 24 Julio 2013, 03:35 AM
Ya logre resolver el problema gracias por su ayuda de todos modos. :) Ahora que me doy cuenta en vez de usar tantos if y goto hubiera usado un while jaja perdonen esa estúpides estaba medio dormido. >_< Y sobre los punteros pues en la segunda función no lo use para nada hice un copia y pega de la primera función y solo cambie el nombre, pero si lo necesitaba en la primera. Como dije estaba medio  dormido. Hehehe xDD