[Aporte] Piedra Pape y Tijera - Mini-Autómata + Ejercicio

Iniciado por AlbertoBSD, 7 Julio 2016, 15:47 PM

0 Miembros y 1 Visitante están viendo este tema.

AlbertoBSD

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)

/*
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:

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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW