Muy buen dia como saben en mi canal de youtube 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)
Aqui les dejo el vídeo mencionado:
[youtube=640,360]https://www.youtube.com/watch?v=OPP5fua87ew[/youtube]
Saludos!
He creado una estructura para guardar los resultados y posteriormente guardar la estructura en un archivo
De hecho son 2 estrucuturas:
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
Y por ejemplo se juega Piedra(Jugador) vs Tijera(Computadora) entonces al igual que en la matriz de resultados:
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
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)
Código (c) [Seleccionar]
/*
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("S) Salir\n");
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:
[youtube=640,360]https://www.youtube.com/watch?v=OPP5fua87ew[/youtube]
Saludos!
He creado una estructura para guardar los resultados y posteriormente guardar la estructura en un archivo
De hecho son 2 estrucuturas:
Código (c) [Seleccionar]
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
Código (c) [Seleccionar]
struct nodo_ppt nodos[9];
Y por ejemplo se juega Piedra(Jugador) vs Tijera(Computadora) entonces al igual que en la matriz de resultados:
Código (c) [Seleccionar]
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