Muy buen dia como saben en mi canal de youtube (https://www.youtube.com/c/albertobsd) tengo tutoriales de programación en C el ultimo que hice es el juego de Piedra Pepel y Tijera algo sencillo pero usando una Tabla de Estados simulando la forma mas básica de un autómata.
Dejo el codigo no sin antes
proponerles un reto y es el siguiente: Dado el código siguiente modificarlo para que el programa sea capaz de "aprender" del histórico de jugadas del usuario y asi sea capas de predecir la próxima jugada.
Este aprendizaje no debe de perderse (Por lo tanto se debe de poder guardar para ser cargados en Futuros juegos)
/*
Realizado por Luis Alberto
Contacto
Twitter: @albertobsd
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<stdbool.h>
//Constantes para las jugadas
#define PIEDRA 0
#define PAPEL 1
#define TIJERA 2
int main() {
int jugador = 0, computadora = 0; // Variables para la seleccion de los Jugadores (Usuario - Computadora)
char *jugadas[3] = {"Piedra","Papel","Tijera"}; //Cadenas para imprimir segun lo seleccionado por las variables Anteriores
/*
Exclusivamente para el resultado (Matriz bidimencional)
Columnas para la Computadora
Filas para el Jugador
Valores:
- 1 si el jugador Gana
- 0 si el jugador Empata
- 2 si el jugador Pierde
[0][P][G]
[G][0][P]
[P][G][0]
*/
int resultados[3][3] = {{0,2,1},
{1,0,2},
{2,1,0}};
char *resultados_str[3] = {"El jugador Empata","El Jugador Gana","El jugador Pierde"}; // Cadenas con los resultados
bool entrar = true; //Variable para detener el ciclo
int opcion; //Opcion seleccionada
char temp[10]; //Variable temporal para guardar la entrada desde el teclado
char *valor = NULL; //Puntero adicional usado por strtol
srand(time(NULL
)); // inicializar la semilla Pseudo-Aleatoria do {
computadora
= rand() % 3; //Valor seleccionado por la computadora al azar //Menu para el usuario
printf("1) %s\n",jugadas
[PIEDRA
]); printf("2) %s\n",jugadas
[PAPEL
]); printf("3) %s\n",jugadas
[TIJERA
]); printf("Ingrese su opcion: "); fgets(temp
,10,stdin
); // Capturamos texto opcion
= strtol(temp
,&valor
,10); //Convertimos el texto a Entero if(valor[0] == '\0' || valor[0] == 0x0a) { //Si es un valor valido continuas
switch(opcion) { //switch para las opciones pero se pudo usar un IF
case 1:
case 2:
case 3:
jugador = opcion - 1; //Seleccion del Jugador
//resultados:
printf("La computadora elijio %s\n",jugadas
[computadora
]); printf("El jugador elijio %s\n",jugadas
[jugador
]); printf("Resultado: %s\n",resultados_str
[resultados
[jugador
][computadora
]]); break;
default:
printf("Aprende a leer solo valores del 1 al 3 o la letra S mayuscula\n"); break;
}
}
else { //Si no es valor valido posiblemente sea una S
//printf("Elijio %.2x\n",valor[0]);
if(temp[0] == 'S') { //Si es S establecemos la variable para salir del ciclo
entrar = false;
}
}
}while(entrar);
return 0;
}
Aqui les dejo el vídeo mencionado:
OPP5fua87ew
Saludos!
He creado una estructura para guardar los resultados y posteriormente guardar la estructura en un archivo
De hecho son 2 estrucuturas:
struct nodo_ppt {
int count;
int respuesta[3];
};
La estrucutura anterior guarda un contador para indicar cuantas veces se a entrado a ese nodo y posteriormente cual fue la respuesta a esto.
Por ejemplo tenemos un arreglo de 9 nodos
struct nodo_ppt nodos[9];
Y por ejemplo se juega Piedra(Jugador) vs Tijera(Computadora) entonces al igual que en la matriz de resultados:
int resultados[3][3] = {{0,2,1},{1,0,2},{2,1,0}};
Entonces guardamos como nodos "previo" la posicion de nodos [(Jugador*3) +computadora] y en el proximo juego incrementamos la seleccion del jugador en el nodo previo y nuevamente ajustamos el nodo previo a la seleccion actual y repetimos.
Con esto tendremos un histórico de (Si en el juego anterior se juego X entonces en el juego siguiente Jugara Y (con mas probabilidad)) donde Y es el mayor numero seleccionado en el contador de respuesta