elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] Duda TATETI
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Duda TATETI  (Leído 3,395 veces)
n-utz

Desconectado Desconectado

Mensajes: 165

Babylon es el vampiro!


Ver Perfil
[C] Duda TATETI
« en: 25 Agosto 2016, 03:50 am »

Buenas noches gente! Vengo con una duda, me pidieron hacer un trabajo práctico de un TATETI en C, hasta ahí vamos bien, nada dificil salvo hacer bien la estructura del juego que tengo pensado hacerla con *, acepto ideas.

Pero el problema viene con que la consigna dice que el juego debe estar preparado para jugar JUGADOR VS JUGADOR o JUGADOR VS COMPUTADORA. JvsJ lo tengo cocinado, justamente porque es pensar la estructura nada más, pero ahora en JvsC, ¿como hago?, es decir tengo que analizar las jugadas para que intente ganar la computadora, al menos lo veo así, lo hago con IF´s? estoy algo perdido.
Esa es una opción, otra seria que la PC ponga sus simbolos al azar, que tampoco sé como hacer para que elija al azar, y no sería muy divertido jaja.

Espero sus ideas, gracias!


En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: [C] Duda TATETI
« Respuesta #1 en: 25 Agosto 2016, 17:06 pm »

Tienes 2 opciones

La primera es tener respuestas predefinidas, esto es tener una tabla con todas las combinaciones (Son pocos solo hay que rotar el tablero hasta que coincida con alguna) y en base a esa tabla colocar X o O dependiendo del rol de la computadora y la mejor respuesta contra una configuración Z.

La otra opción es hacer un arbol o (Grafo) con las combinaciones posibles dada una jugada inicial, evaluar cada uno de los Nodos con una ponderación dada ciertas reglas y apatir de ahi elegir la mejor "próxima jugada", aquí el nivel de inteligencia lo dará la profundidad del grafo.

Saludos!



En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [C] Duda TATETI
« Respuesta #2 en: 25 Agosto 2016, 17:19 pm »

Cuando no sepas cómo hacer una IA, puedes empezar con lo más trivial. Piensa en qué harías tú.
-1. Buscar una posición que te haría ganar.
-2. Buscar una posición en la cual, si no pones tu pieza, ganará el otro jugador.
Si no hay nada que hacer en estos 2 casos, es la parte más complicada.

Simplemente, puedes ir a un método "de fuerza bruta", como es el árbol que dice Alberto.
Otra opción, es conocer la forma de no perder en eljuego, y aplicarla. Si no la conoces, aquí la explican: http://es.wikihow.com/ganar-jugando-tres-en-raya
Aunque aplicarla puede ser tedioso.
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: [C] Duda TATETI
« Respuesta #3 en: 26 Agosto 2016, 16:46 pm »

NO ESTA TERMINADO AUN

Pero este programa genera tantos Arboles como queramos con ayuda de una funcion recursiva "next_moves" y la profuncidad deceada.

Primero se inicializa el tablero inicial con un valor random y apartir de ahi genera las siguientes "Level" Jugadas rellenando un arbol para su posterior evaluacion del siguiente mejor movimiento dado el turno Actual (Esto aun No esta)

Salida del programa (Aleatoria primera Jugada):

Código:
Tablero Actual:
...
...
...
Turno de X
X Jugo:
...
...
X..
Creando Nodo nuevo de Arbol
O..
...
X..
Creando Nodo nuevo de Arbol
.O.
...
X..
Creando Nodo nuevo de Arbol
..O
...
X..
Creando Nodo nuevo de Arbol
...
O..
X..
Creando Nodo nuevo de Arbol
...
.O.
X..
Creando Nodo nuevo de Arbol
...
..O
X..
Creando Nodo nuevo de Arbol
...
...
XO.
Creando Nodo nuevo de Arbol
...
...
X.O

Codigo (Espoiler EXCESO DE APUNTADORES Y MEMORIA DINAMICA)

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<time.h>
  5. #include<stdbool.h>
  6.  
  7. struct tablero {
  8. char juego[3][3];
  9. };
  10.  
  11. struct nodo {
  12. struct tablero *data;
  13. int total;
  14. struct nodo **aristas;
  15. };
  16.  
  17. struct move {
  18. char x,y;
  19. };
  20.  
  21. char *jugadores = "OX"; //0 = O , 1 = X
  22. void imprimir_tablero(struct tablero *t);
  23.  
  24. struct tablero *tablero_nuevo();
  25.  
  26. struct nodo *nuevo_nodo();
  27. struct nodo* create_nodo_from(struct tablero *t);
  28.  
  29. void next_moves(struct nodo *n,int turno,int level);
  30. struct move *best(struct tablero *actual,int turno,int level);
  31.  
  32. int main() {
  33. bool end = false;
  34. char x,y;
  35. struct tablero *inicial = NULL;
  36. srand(time(NULL));
  37. int turno = rand() % 2;
  38. inicial = tablero_nuevo();
  39. while(!end) {
  40. printf("Tablero Actual:\n");
  41. imprimir_tablero(inicial);
  42. printf("Turno de %c\n",jugadores[turno%2]);
  43. x = rand() % 3;
  44. y = rand() % 3;
  45. inicial->juego[x][y] = jugadores[turno%2];
  46. printf("%c Jugo:\n",jugadores[turno%2]);
  47. imprimir_tablero(inicial);
  48. //if(turno == 8) {
  49.  
  50.  
  51. end  = true;
  52. //}
  53. turno++;
  54. best(inicial,turno,1); //El nivel 1 es solo la siguiente jugada, a mas profundidad del arbol mas tarda, pero mas "dificilta" representa la computadora
  55. }
  56. return 0;
  57. }
  58.  
  59. struct move *best(struct tablero *actual,int turno,int level) {
  60. struct move *m = malloc(sizeof(struct move));
  61. struct nodo *raiz,*pivote,*aux;
  62. int i = 0;
  63. raiz = nuevo_nodo();
  64. raiz->data = malloc(sizeof(struct tablero));
  65. memcpy(raiz->data,actual,sizeof(struct tablero));
  66. next_moves(raiz,turno,level);
  67. return m;
  68. }
  69.  
  70. void next_moves(struct nodo *n,int turno,int level) {
  71. int i,j;
  72. struct nodo *temp = NULL;
  73. if(n) {
  74. i = 0;
  75. while(i < 3) {
  76. j =0;
  77. while(j < 3) {
  78. if(n->data->juego[i][j] == 0) {
  79. n->aristas = realloc(n->aristas,sizeof(struct nodo*)*n->total+1);
  80. n->aristas[n->total] = create_nodo_from(n->data);
  81. n->aristas[n->total]->data->juego[i][j] = jugadores[turno%2];
  82. if(level > 0) {
  83. next_moves(n->aristas[n->total],turno+1,level-1);
  84. printf("Creando Nodo nuevo de Arbol\n");
  85. imprimir_tablero(n->aristas[n->total]->data);
  86. }
  87. n->total++;
  88. }
  89. j++;
  90. }
  91. i++;
  92. }
  93. }
  94. }
  95.  
  96. struct nodo* create_nodo_from(struct tablero *t) {
  97. struct nodo *temp = nuevo_nodo();
  98. temp->data = tablero_nuevo();
  99. memcpy(temp->data,t,sizeof(struct tablero));
  100. return temp;
  101. }
  102.  
  103. struct nodo *nuevo_nodo() {
  104. struct nodo *n = calloc(1,sizeof(struct nodo));
  105. return n;
  106. }
  107.  
  108. struct tablero *tablero_nuevo() {
  109. struct tablero *temp = calloc(1,sizeof(struct tablero));
  110. return temp;
  111. }
  112.  
  113. void imprimir_tablero(struct tablero *t) {
  114. char i,j;
  115. if(t) {
  116. i = 0;
  117. while(i < 3) {
  118. j = 0;
  119. while(j < 3) {
  120. if(t->juego[i][j]) {
  121. printf("%c",t->juego[i][j]);
  122. }
  123. else {
  124. printf(".");
  125. }
  126. j++;
  127. }
  128. printf("\n");
  129. i++;
  130. }
  131. }
  132. }

La base para ver MAS jugadas esta en el tercer parametro de la funcion best, el cual si quertemos un arbol de mas profundidad cambiamos el 1 por 2 o 3 o X.... segun el nivel que queramos

Código
  1. best(inicial,turno,1);

Saludos!
« Última modificación: 26 Agosto 2016, 16:49 pm por AlbertoBSD » En línea

n-utz

Desconectado Desconectado

Mensajes: 165

Babylon es el vampiro!


Ver Perfil
Re: [C] Duda TATETI
« Respuesta #4 en: 26 Agosto 2016, 20:07 pm »

Buenisimo, gracias gente! Le propuse lo de la IA al profesor y me dijo que nada más debía hacerlo con random pero lo voy a hacer como me aconsejaron ustedes, así se hace entretenido!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Pequeña duda con un comando batch (NUEVA DUDA RELACIONADA)
Scripting
revenge1252 9 10,292 Último mensaje 13 Febrero 2008, 21:41 pm
por revenge1252
Tateti en c
Programación C/C++
netdrag0n 7 8,418 Último mensaje 22 Febrero 2012, 04:31 am
por theluigy13etv
Duda facil, [VIDEO QUE EXPLICA MI DUDA]
Diseño Gráfico
Ngeooz 6 9,344 Último mensaje 2 Diciembre 2013, 19:33 pm
por Ngeooz
[DUDA] Cambiar letra de unidad a archivo con un Batch [DUDA] « 1 2 »
Windows
MrMaticool 10 12,433 Último mensaje 12 Febrero 2014, 17:55 pm
por MrMaticool
Optimizar evaluación de juego de TATETI
Programación C/C++
AlbertoBSD 1 2,203 Último mensaje 3 Septiembre 2016, 00:20 am
por HardForo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines