PROGRAMACIÓN EN C++ – CLASE 14

(Creado por el analista de sistemas y docente Leonel Iván Saafigueroa)


ADIVINA EL NÚMERO

Pensar un número del 1 al 10, luego intentar que otro lo adivine, es un juego sencillo que puede ser recreado en un programa.


El jugar con otra persona siempre es motivante, es una actividad recreativa física o mental en la que competimos dos o más personas sometiéndonos a unas reglas, donde el objetivo siempre es ganar. Al jugar con la computadora es igual, solo que las reglas son parte del código; es conveniente programarlo por partes e ir perfeccionándolo, la prueba y error será fundamental para estar seguros de que todo funciona como queremos.

Vamos a crear nuestro primer programa basado en el azar y utilizando un condicional:


Veamos el código:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// JUEGA A ADIVINAR EL NÚMERO.
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int secreto;
int intento;
int main()
{
srand(time(NULL)); // Iniciamos la semilla random con la hora.
secreto = (rand() % 10)+1; // Genera un valor entre 1 y 10.
cout << "Adivina el número del 1 al 10: ";
cin >> intento;
if (intento==secreto)
{
cout << "Correcto, ese es el número." << endl;
}
else
{
cout << "Mala suerte... el número era: " << secreto << endl;
}
return 0;
}
// JUEGA A ADIVINAR EL NÚMERO. #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int secreto; int intento; int main() { srand(time(NULL)); // Iniciamos la semilla random con la hora. secreto = (rand() % 10)+1; // Genera un valor entre 1 y 10. cout << "Adivina el número del 1 al 10: "; cin >> intento; if (intento==secreto) { cout << "Correcto, ese es el número." << endl; } else { cout << "Mala suerte... el número era: " << secreto << endl; } return 0; }
// JUEGA A ADIVINAR EL NÚMERO.
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int secreto;
int intento;

int main()

{
    srand(time(NULL)); // Iniciamos la semilla random con la hora.
    secreto = (rand() % 10)+1; // Genera un valor entre 1 y 10.
    cout << "Adivina el número del 1 al 10: ";
    cin >> intento;
    if (intento==secreto)
    {
        cout << "Correcto, ese es el número." << endl;
    }
    else
    {
        cout << "Mala suerte... el número era: " << secreto << endl;
    }
    return 0;
}

Vamos a analizar línea por línea este código en C++:

Línea 1: // JUEGA A ADIVINAR EL NÚMERO.

  • Esta es una línea de comentario, indicada por los símbolos //. El texto que sigue es simplemente un mensaje para describir el programa. No se ejecuta como código C++.

Línea 2-3: #include <iostream> #include <cstdlib>

  • Estas son directivas de inclusión de archivos. En C++, los programas suelen utilizar funciones y tipos definidos en bibliotecas que no forman parte del lenguaje estándar.
  • iostream es la biblioteca de entrada/salida estándar, que permite a los programadores interactuar con el usuario y el sistema.
  • cstdlib es la biblioteca de funciones generales para C++, que incluye cosas como la función rand().

Línea 4: #include <ctime>

  • Esta directiva de inclusión incluye la biblioteca de tiempo, que permite acceder a la hora actual del sistema.

Línea 6-9:

using namespace std;
int secreto;
int intento;

  • La primera línea utiliza el símbolo using para importar la biblioteca estándar (std) y evitar tener que escribir std:: antes de cada función o tipo que pertenece a ella.
  • Las dos siguientes líneas declaran dos variables enteras, secreto e intento, que serán utilizadas en el programa.

Línea 11: int main()

  • Esta es la función principal del programa, donde comienza la ejecución del código. La función main() siempre debe tener un retorno de valor (return) para indicar si el programa ha finalizado correctamente.

Línea 14-15:

srand(time(NULL)); // Iniciamos la semilla random con la hora.
secreto = (rand() % 10)+1;

  • La primera línea utiliza la función srand() para inicializar una semilla aleatoria, que se utilizará para generar números aleatorios a lo largo del programa.
  • La segunda línea utiliza la función rand() para generar un número aleatorio entre 0 y 9 (inclusive), y luego suma 1 para obtener un número entero entre 1 y 10. El resultado es almacenado en la variable secreto.

Línea 16: cout << "Adivina el número del 1 al 10: ";

  • Esta línea utiliza la función cout para imprimir un mensaje en la pantalla.

Línea 17: cin >> intento;

  • Esta línea utiliza la función cin (que significa “entrada de carácter”) para leer una entrada del usuario y almacenarla en la variable intento.

Línea 18-19:

if (intento==secreto)
{

  • Esta es una estructura condicional (if) que comprueba si el valor de intento es igual al valor de secreto.
  • Si es así, entonces…

Línea 20: cout << "Correcto, ese es el número." << endl;

  • …se imprime un mensaje en la pantalla indicando que el usuario ha adivinado correctamente.

Línea 22-23:

else
{

  • Si no se cumple la condición del if, entonces…

Línea 24: cout << "Mala suerte... el número era: " << secreto << endl;

  • …se imprime un mensaje en la pantalla indicando que el usuario ha fallado y se muestra el valor correcto de secreto.

Línea 26: return 0;

Finalmente, la función main() devuelve un código de retorno (0) para indicar que el programa ha finalizado correctamente.


Ahora vamos a modificar el programa para que nos permita jugar hasta adivinar:


Para que el programa nos deje intentar hasta adivinar vamos a reemplazar el condicional que solo nos daba una chance para adivinar el número, por el condicional while, donde dará las chances ilimitadas mientras que las variables secreto e intento sean distintas.

El operador relacional != que usamos en esta segunda versión, sirve para preguntarnos si intento es distinto a secreto, de ser así nos da otra oportunidad.


Veamos el código:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// JUEGA A ADIVINAR EL NÚMERO. CON INTENTOS INFINITOS PARA GANAR.
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int secreto;
int intento;
int main()
{
srand(time(NULL)); // Iniciamos la semilla random con la hora.
secreto = (rand() % 10)+1; // Genera un valor entre 1 y 10.
cout << "Adivina el número del 1 al 10: ";
cin >> intento;
while(intento!=secreto)
{
cout << "No... Intenta de nuevo..." << endl;
cout << "Adivina el número del 1 al 10: ";
cin >> intento;
}
cout << "Correcto, ese es el número." << endl;
return 0;
}
// JUEGA A ADIVINAR EL NÚMERO. CON INTENTOS INFINITOS PARA GANAR. #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int secreto; int intento; int main() { srand(time(NULL)); // Iniciamos la semilla random con la hora. secreto = (rand() % 10)+1; // Genera un valor entre 1 y 10. cout << "Adivina el número del 1 al 10: "; cin >> intento; while(intento!=secreto) { cout << "No... Intenta de nuevo..." << endl; cout << "Adivina el número del 1 al 10: "; cin >> intento; } cout << "Correcto, ese es el número." << endl; return 0; }
// JUEGA A ADIVINAR EL NÚMERO. CON INTENTOS INFINITOS PARA GANAR.
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int secreto;
int intento;

int main()

{
    srand(time(NULL)); // Iniciamos la semilla random con la hora.
    secreto = (rand() % 10)+1; // Genera un valor entre 1 y 10.
    cout << "Adivina el número del 1 al 10: ";
    cin >> intento;
    while(intento!=secreto)
    {
        cout << "No... Intenta de nuevo..." << endl;
        cout << "Adivina el número del 1 al 10: ";
        cin >> intento;
    }
    cout << "Correcto, ese es el número." << endl;
    return 0;
}

Vamos a analizar línea por línea este código en C++:

Línea 1: // JUEGA A ADIVINAR EL NÚMERO. CON INTENTOS INFINITOS PARA GANAR.

  • Esta es una línea de comentario, indicando la descripción del juego.
  • Los comentarios en C++ comienzan con el símbolo // y se pueden escribir en cualquier lugar del código.

Línea 2: #include <iostream>

  • Esta línea incluye la biblioteca iostream, que permite interactuar con la salida estándar (por ejemplo, imprimir mensajes en pantalla).

Línea 3: #include <cstdlib>

  • Esta línea incluye la biblioteca cstdlib, que contiene funciones de gestión de memoria y generación aleatoria.
  • La mayoría de las funciones utilizadas en este programa provienen de esta biblioteca.

Línea 4: #include <ctime>

  • Esta línea incluye la biblioteca ctime, que proporciona acceso a la hora actual del sistema.
  • De manera similar a la anterior, se utiliza una función para generar un número aleatorio.

Línea 6: using namespace std;

  • Esta línea permite utilizar los nombres de las funciones y variables estándar sin el prefijo std::, esto simplifica el código y facilita su lectura.

Líneas 8-9:

int secreto;
int intento;

  • Estas líneas declaran dos variables enteras, secreto y intento, para almacenar el número secreto y la respuesta del usuario, respectivamente.

Línea 11: int main()

  • Esta línea inicia la función principal del programa, que es donde comienza su ejecución.
  • La función principal en C++ debe llamarse main().

Líneas 14-15:

srand(time(NULL)); // Iniciamos la semilla random con la hora.
secreto = (rand() % 10)+1; // Genera un valor entre 1 y 10.

  • Estas líneas utilizan una función para generar un número aleatorio y lo asignan a secreto.
  • La función srand() establece la semilla para la generación de números aleatorios, mientras que rand() devuelve un entero aleatorio.

Línea 16: cout << "Adivina el número del 1 al 10: ";

  • Esta línea utiliza una función para escribir un mensaje en pantalla.
  • La función cout es parte de la biblioteca iostream y permite imprimir texto en la salida estándar.

Línea 17: cin >> intento;

  • Esta línea lee un valor de entrada del usuario y lo asigna a la variable intento.
  • La función cin también es parte de la biblioteca iostream y se utiliza para leer datos de la entrada estándar.

Líneas 18-23:

while(intento!=secreto)
{
cout << "No... Intenta de nuevo..." << endl;
cout << "Adivina el número del 1 al 10: ";
cin >> intento;
}

  • Estas líneas forman un bucle while, que se repite hasta que la respuesta del usuario (intento) sea igual al número secreto.
  • Dentro del bucle, se imprime un mensaje y se solicita nuevamente una respuesta al usuario.

Línea 24: cout << "Correcto, ese es el número." << endl;

Esta línea imprime un mensaje en pantalla cuando la respuesta del usuario sea correcta. La función endl indica que se debe pasar a la siguiente línea después de escribir algo en pantalla.

Línea 25: return 0;

  • Esta es la instrucción final del programa, que indica su término exitoso.
  • El valor de retorno (return) es 0, lo cual es una convención común en C++ para indicar que el programa se ejecutó correctamente.


Ahora vamos agregar pistas a nuestro juego:


Ahora vamos a crear una tercera versión del juego en donde el programa pueda darnos alguna pista del número que eligió, nos dirá si el número en la variable secreto comparado con el de la variable intento es más grande o más chico, esto lo lograremos con un condicional IF dentro del condicional while (esto se lo conoce en programación como anidar un condicional dentro de otro).


Veamos el código:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// JUEGA A ADIVINAR EL NÚMERO. AHORA CON PISTAS.
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int secreto;
int intento;
int main()
{
srand(time(NULL)); // Iniciamos la semilla random con la hora.
secreto = (rand() % 10)+1; // Genera un valor entre 1 y 10.
cout << "Adivina el número del 1 al 10: ";
cin >> intento;
while(intento!=secreto)
{
if(secreto>intento)
{
cout << "No... Mi número es más grande..." << endl << endl;
}
else
{
cout << "No... Mi número es más chico..." << endl << endl;
}
cout << "Intenta de nuevo..." << endl;
cout << "Adivina el número del 1 al 10: ";
cin >> intento;
}
cout << "Correcto, ese era el número." << endl;
return 0;
}
// JUEGA A ADIVINAR EL NÚMERO. AHORA CON PISTAS. #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int secreto; int intento; int main() { srand(time(NULL)); // Iniciamos la semilla random con la hora. secreto = (rand() % 10)+1; // Genera un valor entre 1 y 10. cout << "Adivina el número del 1 al 10: "; cin >> intento; while(intento!=secreto) { if(secreto>intento) { cout << "No... Mi número es más grande..." << endl << endl; } else { cout << "No... Mi número es más chico..." << endl << endl; } cout << "Intenta de nuevo..." << endl; cout << "Adivina el número del 1 al 10: "; cin >> intento; } cout << "Correcto, ese era el número." << endl; return 0; }
// JUEGA A ADIVINAR EL NÚMERO. AHORA CON PISTAS.
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int secreto;
int intento;

int main()

{
    srand(time(NULL)); // Iniciamos la semilla random con la hora.
    secreto = (rand() % 10)+1; // Genera un valor entre 1 y 10.
    cout << "Adivina el número del 1 al 10: ";
    cin >> intento;
    while(intento!=secreto)
    {
        if(secreto>intento)
        {
        cout << "No... Mi número es más grande..." << endl << endl;
        }
        else
        {
        cout << "No... Mi número es más chico..." << endl << endl;        
        }
        cout << "Intenta de nuevo..." << endl;
        cout << "Adivina el número del 1 al 10: ";
        cin >> intento;
    }
    cout << "Correcto, ese era el número." << endl;
    return 0;
}

Vamos a analizar línea por línea este código en C++:

Línea 1: // JUEGA A ADIVINAR EL NÚMERO. AHORA CON PISTAS.

  • Esta línea es un comentario, indicando que el programa es una implementación del juego “Adivina el número” con pistas.

Línea 2: #include <iostream>

  • Esta línea incluye la biblioteca iostream, que permite a los programas interactuar con el usuario a través de la consola.

Línea 3: #include <cstdlib>

  • Esta línea incluye la biblioteca cstdlib, que proporciona funciones para manipulación de strings y generación aleatoria.
  • La cstdlib es utilizada en este caso para generar un número aleatorio.

Línea 4: #include <ctime>

  • Esta línea incluye la biblioteca time, que permite acceder a la fecha y hora actual del sistema.
  • En este caso se utiliza para inicializar una semilla random con la hora actual.

Línea 6: using namespace std;

  • Esta línea especifica que el programa utilizará las definiciones estándar de C++ (del namespace std).
  • Esto permite evitar escribir explicitamente “std::cout” o “std::cin” en lugar de solo “cout” y “cin“.

Línea 8: int secreto;

  • Esta línea declara una variable llamada secreto del tipo entero.
  • La variable secreto será usada para almacenar el número aleatorio que se generará.

Línea 9: int intento;

  • Esta línea declara una variable llamada intento del tipo entero.
  • La variable intento será usada para almacenar la respuesta del usuario.

Línea 11:

int main() {

  • Esta línea comienza el método principal (main) de la clase del programa.
  • El método main es donde se ejecuta el código cuando se llama al programa.

Línea 14: srand(time(NULL)); // Iniciamos la semilla random con la hora.

  • Esta línea inicializa una semilla random utilizando la función time para obtener la fecha y hora actual.
  • La semilla random es utilizada para generar un número aleatorio.

Línea 15: secreto = (rand() % 10)+1; // Genera un valor entre 1 y 10.

  • Esta línea genera un número aleatorio entre 1 y 10, incluyendo ambos valores.
  • El resultado se almacena en la variable secreto.

Línea 16: cout << "Adivina el número del 1 al 10: ";

  • Esta línea imprime una cadena de texto que solicita al usuario que adivine un número entre 1 y 10.

Línea 17: cin >> intento;

  • Esta línea lee una entrada del usuario y la asigna a la variable intento.
  • El operador “>>” es utilizado para leer desde el teclado.

Línea 18:

while(intento!=secreto) {

  • Esta línea comienza un bucle while que se ejecutará mientras la condición sea verdadera.
  • La condición es que la variable intento no sea igual a la variable secreto.

Línea 20: if(secreto>intento)

  • Esta línea comienza un if que comprueba si el número secreto es mayor que la respuesta del usuario.
  • Si es así, se ejecutará las instrucciones dentro del if.

Línea 22: cout << "No... Mi número es más grande..." << endl << endl;

  • Esta línea imprime una cadena de texto que indica al usuario que su respuesta no es correcta y que el número secreto es mayor.
  • El operador endl se utiliza para saltar a la siguiente línea.

Línea 24: else {

  • Esta línea comienza un else que comprueba si la respuesta del usuario es diferente de la condición anterior (si el número secreto es mayor).
  • Si es así, se ejecutará las instrucciones dentro del else.

Línea 26: cout << "No... Mi número es más chico..." << endl << endl;

  • Esta línea imprime una cadena de texto que indica al usuario que su respuesta no es correcta y que el número secreto es menor.
  • El operador endl se utiliza para saltar a la siguiente línea.

Línea 28: cout << "Intenta de nuevo..." << endl;

  • Esta línea imprime una cadena de texto que solicita al usuario que intente nuevamente.

Línea 29: cout << "Adivina el número del 1 al 10: ";

  • Esta línea imprime una cadena de texto que solicita al usuario que adivine un número entre 1 y 10.

Línea 30: cin >> intento;

  • Esta línea lee una entrada del usuario y la asigna de nuevo a la variable intento.

Línea 32:

cout << "Correcto, ese era el número." << endl;

  • Esta línea imprime una cadena de texto que indica al usuario que ha dado con la respuesta correcta.

Línea 22: return 0;

Esta línea termina la ejecución del programa, devolviendo un valor de estado de 0 indicando que el programa se ha ejecutado correctamente.


TAREA PARA EL HOGAR

  1. Agregar a nuestro juego un contador para saber cuantos fueron los intentos realizados antes de acertar.
  2. Poner un límite de 3 intentos para poder acertar, de no hacerlo perdemos el juego, y el programa nos debería mostrar el número secreto.