[Ayuda] Simple juego.

Iniciado por Zodiak98, 22 Julio 2013, 20:09 PM

0 Miembros y 1 Visitante están viendo este tema.

Zodiak98

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;
}

Stakewinner00

#1
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;
}


z3nth10n

Yo aviso que el resultado de numero cuando se acaba el juego no es certero así que.. :silbar:

Interesados hablad por Discord.

Stakewinner00

#3
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

z3nth10n

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

Interesados hablad por Discord.

Stakewinner00

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

rir3760

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Zodiak98

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