(Creado por el analista de sistemas y docente Leonel Iván Saafigueroa)
PIEDRA, PAPEL O TIJERA
La piedra rompe a la tijera, la tijera corta al papel, el papel envuelve a la piedra. Este es un juego de niños en donde se puede ganar, perder o empatar, en esta clase vamos a recrearlo con un sencillo programa.

Este es un juego dinámico, ambos jugadores deciden al mismo tiempo una de las tres opciones, por ello las reglas del juego tendrán que adaptarse a la mecánica de nuestro programa, donde tendremos que confiar en que la computadora elige sus jugadas sin tener en cuenta las nuestras.

Diseñamos el programa basado en la función aleatorio y utilizando la estructura según:

En esta primera versión nos concentramos para que la computadora pueda elegir entre piedra, papel o tijera.
Analizamos el código
Algoritmo piedra_papel_o_tijera
// Asigna a la variable "jugada", un número al azar del 1 al 3.
jugada <- Aleatorio(1,3)
// Según sea el número responde algo distinto.
Según jugada Hacer
1:
Escribir 'PIEDRA.'
2:
Escribir 'PAPEL.'
3:
Escribir 'TIJERA.'
FinSegún
FinAlgoritmo
Ejecutamos el programa
Con esta versión podemos pensar mentalmente cuál sería nuestra jugada y reiniciar el programa para ver la respuesta y ver si ganamos, perdimos o empatamos.
Veamos el código en C++:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int jugada;
int main()
{
srand(time(NULL)); // Iniciamos la semilla random con la hora.
jugada = (rand() % 3)+1; // Genera un valor entre 1 y 3.
switch(jugada)
{
case 1:
cout << "PIEDRA." << endl;
break;
case 2:
cout << "PAPEL." << endl;
break;
case 3:
cout << "TIJERA." << endl;
break;
}
return 0;
}
Vamos a analizar línea por línea este código en C++:
Línea 1: #include <iostream>
- Esta línea incluye la biblioteca estándar iostream, que permite leer y escribir datos desde y hacia la pantalla (nos permite utilizar funciones como
coutpara imprimir texto en la pantalla).
Línea 2: #include <cstdlib>
- Esta línea incluye la biblioteca cstdlib, que proporciona funciones de manipulación de memoria y generación de números aleatorios (utilizando funciones como
rand()para generarlos).
Línea 3: #include <ctime>
- Esta línea incluye la biblioteca ctime, que proporciona funciones para trabajar con fechas y horas.
Línea 5: using namespace std;
- Esta línea declara que queremos usar el espacio de nombres estándar (
std) en lugar de tener que escribirstd::antes de cada función o variable que utilice, por ejemplostd::cout.
Línea 7: int jugada;
- Esta línea declara una variable entera llamada
jugada. - La variable
jugadaserá utilizada para almacenar el resultado de la tirada aleatoria.
Línea 9-26: main()
- Esta es la función principal del programa.
- La función
main()es el punto de entrada del programa, donde comienza a ejecutarse.
Línea 11: srand(time(NULL));
- Esta línea inicializa la semilla aleatoria con la hora actual del sistema.
- La función
time(NULL)devuelve la hora actual en segundos desde la época unix. - La función
srand()establece la semilla para generar números aleatorios.
Línea 12: jugada = (rand() % 3)+1;
- Esta línea genera un valor aleatorio entre 1 y 3 y lo asigna a la variable
jugada. - La función
rand()devuelve un número entero aleatorio. - El operador
%es el módulo, que devuelve el resto de la división entre 3, y a este resultado se le suma 1. - Por lo tanto, los valores posibles son: 1 (cuando rand() = 0), 2 (cuando rand() = 1) o 3 (cuando rand() = 2).
Línea 13-24: switch(jugada){...}
- Esta es una estructura de control de flujo switch.
- La variable
jugadase utiliza como condición para determinar qué bloque de código ejecutar. - El valor de
jugadasolo será uno de los valores posibles (1, 2 o 3).
Línea 16: case 1: cout << "PIEDRA." << endl;
- Esta línea imprime en la pantalla el resultado de la tirada aleatoria cuando es igual a 1.
- El texto “PIEDRA” se escribirá en la pantalla.
Línea 18 y 21: case 2: ... y case 3: ...
- Son equivalentes a la línea 16, pero para los casos en que
jugadaes igual a 2 o 3 respectivamente. - Los resultados son “PAPEL” cuando
jugadaes igual a 2 y “TIJERA” cuandojugadaes igual a 3.
Línea 17, 20 y 23: break;
Es necesario escribir esta línea para que el programa se termine correctamente.
Esta línea termina la ejecución del bloque de código dentro del switch.
Línea 25: return 0;
- Esta línea indica al compilador que el programa ha finalizado su ejecución correctamente.
- El valor de retorno (
0) es un código estándar que indica que la ejecución del programa fue exitosa. - Si el programa no tiene una instrucción
returnexplícita, el compilador asume que el programa termina en la función principal (main()). - En este caso, la instrucción
return 0;es opcional, pero se recomienda incluirla para indicar claramente al compilador que el programa ha finalizado su ejecución.
Ahora el código en PYTHON:
import random
jugada=random.randint(1,3)
if jugada == 1:
print("PIEDRA.")
elif jugada == 2:
print("PAPEL.")
elif jugada == 3:
print("TIJERA.")
Vamos a analizar línea por línea este código en PYTHON:
Línea 1: import random
- Esta línea importa la biblioteca estándar llamada “random” para utilizar funciones aleatorias.
Línea 2: jugada=random.randint(1,3)
- Esta línea utiliza la función randint() para generar un número aleatorio entero entre 1 y 3 (inclusive).
- El resultado se almacena en la variable “jugada”.
Línea 3: if jugada == 1:
- Esta línea comienza una condición IF que verifica si el valor de “jugada” es igual a 1.
- Si la condición es verdadera, se ejecutará el bloque de código después del “if“.
Línea 4: print("PIEDRA.")
- Esta línea imprime en la pantalla el resultado de la tirada aleatoria cuando es igual a 1.
- El texto “PIEDRA” se escribirá en la pantalla.
Líneas 5 y 6: elif jugada == 2: y print("PAPEL.")
- Son equivalentes a la línea 3 y 4, pero para los casos en que “jugada” es igual a 2.
- El resultado es “PAPEL“.
Líneas 7 y 8: elif jugada == 3: y print("TIJERA.")
- Son equivalentes a la línea 3 y 4, pero para los casos en que “jugada” es igual a 3.
- El resultado es “TIJERA“.
Nota importante:
Esto es porque la función randint() devuelve un número aleatorio entre 1 y 3 (inclusive), por lo que el valor de “jugada” siempre se ajustará a uno de los casos.
Ahora creamos una versión en donde podamos elegir nuestra jugada:

Ahora vamos a mostrar las tres posibilidades para que el jugador pueda elegir entre 1, 2 y 3, guardando lo ingresado en la variable “jugador“, también tenemos la variable “computadora” con la jugada al azar de la computadora, ambas serán comparadas a través de varios condicionales si-entonces para ver si empatamos, perdimos o ganamos la partida.
Analizamos el código
Algoritmo piedra_papel_o_tijera2 Escribir '1 - Piedra.' Escribir '2 - Papel.' Escribir '3 - Tijera.' Escribir 'Elija su jugada:' Leer jugador // Asigna a la variable "computadora", un número al azar del 1 al 3. computadora <- Aleatorio(1,3) // Según sea el número responde algo distinto. Según computadora Hacer 1: Escribir 'LA COMPUTADORA ELIJE PIEDRA.' 2: Escribir 'LA COMPUTADORA ELIJE PAPEL.' 3: Escribir 'LA COMPUTADORA ELIJE TIJERA.' FinSegún Si computadora=jugador Entonces Escribir 'NO HAY GANADOR.' SiNo Si jugador=1 Y computadora=2 Entonces Escribir 'PERDISTE.' SiNo Si jugador=2 Y computadora=3 Entonces Escribir 'PERDISTE.' SiNo Si jugador=3 Y computadora=1 Entonces Escribir 'PERDISTE.' SiNo Escribir 'GANAS LA PARTIDA.' FinSi FinSi FinSi FinSi FinAlgoritmo
Ejecutamos el programa
Podemos afirmar mirando el programa que realmente el juego es justo, la computadora elige realmente sin saber que vamos a elegir nosotros, no hay trampa.
Veamos el código en C++:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int jugador;
int computadora;
int main()
{
cout << "1 - Piedra." << endl;
cout << "2 - Papel." << endl;
cout << "3 - Tijera." << endl;
cout << "Elija su jugada:" << endl;
cin >> jugador;
srand(time(NULL)); // Iniciamos la semilla random con la hora.
computadora = (rand() % 3)+1; // Genera un valor entre 1 y 3.
// Mostramos la jugada de la computadora.
switch(computadora)
{
case 1:
cout << "LA COMPUTADORA ELIJE PIEDRA." << endl;
break;
case 2:
cout << "LA COMPUTADORA ELIJE PAPEL." << endl;
break;
case 3:
cout << "LA COMPUTADORA ELIJE TIJERA." << endl;
break;
}
// Analizamos si EMPATAMOS, PERDIMOS O GANAMOS.
if(computadora==jugador)
{
cout << endl << "NO HAY GANADOR." << endl;
}
else if(jugador==1 && computadora==2)
{
cout << endl << "PERDISTE." << endl;
}
else if(jugador==2 && computadora==3)
{
cout << endl << "PERDISTE." << endl;
}
else if(jugador==3 && computadora==1)
{
cout << endl << "PERDISTE." << endl;
}
else
{
cout << endl << "GANAS LA PARTIDA." << endl;
}
return 0;
}
Vamos a analizar línea por línea este código en C++:
Línea 1: #include <iostream>
- Esta línea incluye la biblioteca estándar iostream para utilizar funciones de entrada y salida.
Línea 2: #include <cstdlib>
- Esta línea incluye la biblioteca estándar cstdlib para utilizar funciones de manipulación de memoria y generación de números aleatorios.
Línea 3: #include <ctime>
- Esta línea incluye la biblioteca estándar ctime para utilizar funciones relacionadas con el tiempo.
Línea 4: using namespace std;
- Esta línea utiliza el prefijo
std::para acceder a las clases y funciones de la biblioteca estándar sin tener que utilizar el nombre completo.
Líneas 6-7: int jugador; int computadora;
- Estas líneas declaran dos variables enteras llamadas
jugadorycomputadora.
Línea 9: int main() {
- Esta línea define la función principal del programa.
Línea 11: cout << "1 - Piedra." << endl;
- Esta línea imprime en la pantalla el texto “1 – Piedra.“.
Líneas 12-14: Estas líneas imprimen en la pantalla los textos correspondientes a las opciones del juego.
Línea 15: cin >> jugador;
- Esta línea lee desde la entrada estándar el valor de la variable
jugador.
Líneas 16-17: Estas líneas generan un número aleatorio entre 1 y 3 y lo asignan a la variable computadora.
Línea 19: switch(computadora) {`
- Esta línea utiliza una estructura de control switch para evaluar el valor de
computadora.
Líneas 21-29: Estas líneas imprimen en la pantalla el texto correspondiente a la opción del juego elegida por la computadora.
Líneas 32-51: Estas líneas analizan si hay un ganador, perdedor o empate, e imprimen el resultado en la pantalla.
Línea 24: return 0;
Esta línea indica que la función principal del programa ha terminado de ejecutarse.
Ahora el código en PYTHON:
import random
print("1 - Piedra.")
print("2 - Papel.")
print("3 - Tijera.")
jugador = int(input("Elija su jugada:"))
computadora=random.randint(1,3)
# Mostramos la jugada de la computadora.
if computadora == 1:
print("LA COMPUTADORA ELIJE PIEDRA.")
if computadora == 2:
print("LA COMPUTADORA ELIJE PAPEL.")
if computadora == 3:
print("LA COMPUTADORA ELIJE TIJERA.")
# Analizamos si EMPATAMOS, PERDIMOS O GANAMOS.
if computadora==jugador:
print("NO HAY GANADOR.")
elif jugador==1 and computadora==2:
print("PERDISTE.")
elif jugador==2 and computadora==3:
print("PERDISTE.")
elif jugador==3 and computadora==1:
print("PERDISTE.")
else:
print("GANAS LA PARTIDA.")
Vamos a analizar línea por línea este código en PYTHON:
Línea 1: import random
- En esta línea, se importa la biblioteca estándar de Python llamada “random“, que permite generar números aleatorios. Esto es utilizado más adelante para simular la jugada de la computadora.
Línea 2: print("1 - Piedra.")
- Esta línea imprime en la pantalla el texto “1 – Piedra.“, lo que indica que la opción 1 del juego es la piedra.
Línea 3: print("2 - Papel.")
- Esta línea imprime en la pantalla el texto “2 – Papel.“, lo que indica que la opción 2 del juego es el papel.
Línea 4: print("3 - Tijera.")
- Esta línea imprime en la pantalla el texto “3 – Tijera.“, lo que indica que la opción 3 del juego es la tijera.
Línea 5: jugador = int(input("Elija su jugada:"))
- En esta línea, se le pide al usuario que ingrese su jugada (piedra, papel o tijera) y se almacena en la variable “jugador” como un número entero. Por ejemplo, si el usuario ingresa 1, entonces jugador = 1 (su jugada sería PIEDRA).
Línea 6: computadora=random.randint(1,3)
- En esta línea, se utiliza la función randint de la biblioteca random para generar un número aleatorio entre 1 y 3 (inclusive). Esto simula la jugada de la computadora. Por ejemplo, si el número aleatorio generado es 2, entonces computadora = 2 (su jugada sería PAPEL).
Líneas 7-13: Estas líneas imprimen en la pantalla la jugada de la computadora según su valor numérico. Por ejemplo, si computadora = 1, entonces se imprime “LA COMPUTADORA ELIJE PIEDRA.“.
Línea 14: # Analizamos si EMPATAMOS, PERDIMOS O GANAMOS.
- En esta línea, comienza el análisis de las posibles jugadas y sus resultados. Esto se hace mediante un bloque if-elif-else.
Líneas 15-24: Estas líneas analizan si hay empate o si el jugador ha perdido según su jugada y la jugada de la computadora. Por ejemplo, si jugador = 1 y computadora = 2, entonces se imprime “PERDISTE.“. Si no es ninguna de estas opciones, entonces se imprime por descarte “GANAS LA PARTIDA.“.
Línea 16: print("NO HAY GANADOR.")
- En esta línea, se imprime el mensaje “NO HAY GANADOR.” si hay empate.
Línea 17-24: Estas líneas son el bloque else de la instrucción if anterior y se ejecutan si no se cumple la condición anterior. Por ejemplo, si jugador = 3 y computadora = 1, entonces se imprime “PERDISTE.“. Si no es ninguna de estas opciones, entonces se imprime “GANAS LA PARTIDA.“.
TAREA PARA EL HOGAR
- Crear una versión del programa en donde la computadora siempre nos gane haciendo trampa.
- Modificar el programa de Piedra, Papel o Tijera, para que incluya un sistema de puntos en el que podamos hacer apuestas. El juego terminaría cuando perdemos todos los puntos (aunque las reglas con los puntos pueden ponerlas ustedes).