Para demostrar el uso de la generación de números aleatorios con C decidí hacer un juego (no, no tiene interfaz gráfica) de adivina el número, seguramente conocido por muchos.
Lo que hace este juego es “pensar” en un número y pedirle al usuario que lo adivine. También brinda pistas indicando si el número secreto es mayor o menor que la respuesta del usuario.
Me di a la tarea de agregarle un contador de intentos y un límite. En caso de llegar al límite se le indica al usuario que ha perdido y le dice cuál adivino.
Si el jugador adivina el número, entonces también se le indica. Veamos su codificación.
Parte 1: números en un rango
Ya cité el post para obtener números aleatorios con rand. Pues vamos a usar esa función para “pensar” en un número.
Parte 2: el ciclo
Hacemos un ciclo while
infinito que se va a romper en 2 casos:
- Cuando se terminen los intentos
- Cuando el usuario adivine
Dentro del ciclo hacemos lo siguiente, en orden:
- Incrementar el número de intentos
- Escanear la respuesta del usuario
- Comparar la respuesta
- Si la respuesta no es la correcta, entonces se le indica si es mayor o menor
Parte 3: poniendo todo junto
El código final queda así de simple:
/*
Adivina el número con C
@author parzibyte.me
@see https://parzibyte.me/blog/2019/03/21/obtener-numeros-aleatorios-c/
*/
#include <stdio.h> // printf
#include <stdlib.h> // rand y RAND_MAX
#include <unistd.h> // getpid
// Ajustes del juego
#define INTENTOS_MAXIMOS 2
#define INFERIOR 1 // Límite inferior para aleatoridad
#define SUPERIOR 5 // Límite superior para aleatoridad
// Prototipo de funciones
int aleatorio_en_rango(int minimo, int maximo);
// Función main
int main() {
// Hay que alimentar a rand, solamente una vez
srand(getpid());
// Obtener un número aleatorio que no le diremos al usuario
int secreto = aleatorio_en_rango(INFERIOR, SUPERIOR);
// Descomenta esta línea para "hacer trampa"
// printf("El secreto es %d\n\n", secreto);
int respuesta, intentos = 0;
// Indicarle que adivine
printf("He seleccionado un número al azar entre %d y %d, tu tarea es "
"adivinarlo en máximo %d intentos\n",
INFERIOR, SUPERIOR, INTENTOS_MAXIMOS);
// ciclo infinito que se rompe desde dentro
while (1) {
intentos++;
printf("Escribe el número que crees que elegí: ");
scanf("%d", &respuesta);
if (respuesta == secreto) {
printf("Correcto. El número que seleccioné fue %d y lo adivinaste en %d "
"intento(s)",
secreto, intentos);
break;
} else if (respuesta < secreto) {
printf(
"Error, pero te doy una pista: el número que elegí es mayor que %d\n",
respuesta);
} else {
// respuesta > secreto
printf(
"Error, pero te doy una pista: el número que elegí es menor que %d\n",
respuesta);
}
// Si no se rompió arriba porque ganó, y ya se superaron o igualaron los intentos,
// entonces se rompe y se indica que perdió
if (intentos >= INTENTOS_MAXIMOS) {
printf("Perdiste. El número que elegí fue %d", secreto);
break;
}
}
}
// Definir función cuyo prototipo está al inicio
// Devuelve un número aleatorio en un rango
int aleatorio_en_rango(int minimo, int maximo) {
return minimo + rand() / (RAND_MAX / (maximo - minimo + 1) + 1);
}
Con eso tenemos para jugar a adivinar el número con C. Puedes cambiar los límites y reducir los intentos máximos, aumentando así la complejidad del juego.
De igual manera, si lo modificas puedes imprimir el número secreto para depurar.
En la imagen de arriba se ve al juego en funcionamiento.
Probar juego
Eres libre de descargar el código para jugar a adivinar el número aleatorio. Guarda el código y compílalo, está escrito en ANSI C por lo que debería funcionar en todas las plataformas (lo he probado en Windows y Linux).
Mira este tutorial para instalar el compilador sobre Windows.
Mira más sobre C o videojuegos en mi blog.