/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

TATETI

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
mark



Registrado: 19 Ago 2007
Mensajes: 10

MensajePublicado: 20/11/2007 5:45 pm
Título: TATETI

Hola nuevamente!! lo q estoy tratando de hacer es un tateti, la idea de este programas es crear todas las soluciones posible paso a paso y guardarla en un archivo asi cuando se juega contra la cpu, va ir buscando en el archivo la solucion. Asi la cpu sera invensible siempre!
Bueno les comento lo q estoy haciendo, ahora solo hice algo basico, como pueden ver en el codigo, puse una estructura del tablero, el vector sig[10] el numero es representativo(despuese severa cual debe ser) lo coloque para poner los siguentes tableros,osea en cada hijo tendra unos X tableros siguientes.
Quiero hacer una funcion donde tenga q crear los tableros en forma recursiva, para no cargarlos a manos porque son un monton, y no se como hacerlo, si me pueden ayudar, se los agradesco!


Código:


#define MAX_FILAS 3
#define MAX_COL 3

typedef struct s_tab{
        int Ntablero;
        char tablero[MAX_FILAS][MAX_COL];
        struct s_tab * sig[10];}TAB;
typedef TAB * pTABLERO;


int main(){

/* Creo el primer tablero vacio con las coordenadas de cada posicion, tiene el numero de tablero Nº=0, y los demas punteros del vector son null*/

    pTABLERO Tab=NULL;
    int i;
    if(Tab==NULL){
                    Tab=(pTABLERO) malloc(sizeof(TAB));
                    inicializacion_tablero(&Tab);
                    (Tab)->Ntablero=0;
                    for (i = 0; i < 10; i++){
                        (Tab)->sig[i]=NULL;};}

   imprime_tablero(&Tab);
   system("pause");
}

void inicializacion_tablero(pTABLERO *tab)
{

   char casilla = '1';
   int i;
   int j;
   if(*tab!=NULL){

     for (i = 0; i < 3; i++) {
       for (j = 0; j < 3; j++) {
           (*tab)->tablero[i][j] = casilla;
            casilla++;}
      }
   }

}


void imprime_tablero(pTABLERO *tab)
{
   int fila, col;
   //system("cls");
   printf("\n\n");
   for (fila = 0; fila < MAX_FILAS; fila++) {
         for (col = 0; col < MAX_COL; col++){
               printf("  %c ", (*tab)->tablero[fila][col]);
               if(col < (MAX_COL-1)){printf("  |");};};

       if(fila < (MAX_FILAS-1)){printf("\n  ----------------\n");};
   }
   printf("\n\n");
}



Volver arriba
guimel



Registrado: 17 Oct 2007
Mensajes: 18

MensajePublicado: 22/11/2007 11:43 am
Título:

Hola!
Bueno, para hacer un juego de TA-TE-TI hay que tener un cuenta algunas cosas:

El número de tableros descendientes no es constante. Ten en cuenta que en un tablero vacio puede haber 10 posibles tableros descendientes, mientras que en uno casi lleno, sólo hay un descendiente. Hay que mantener en alguna parte cuántos tableros hay por debajo del actual.

Por otra parte, el total de posibles partidas es 10!, que resultan de elegir el jugador humano una de entre 10 casillas vacías, el computador una de entre 9, y así sucesivamente: 10x9x8...x2x1, que suponen 3628800 partidas diferentes.

Esto constituye un problema habitual en juegos de estrategia. Fíjate que el TA-TE-TI es un juego sencillo. En el ajedrez, el número de tableros posible es enorme. Se estima que para una partida de ajedrez de 40 movimientos, puede haber 10 elevado a 120 tableros posibles.

Verdaderamente, es posible que en el caso del TA-TE-TI no sean tantas, ya que lo habitual es que no haya que completar un tablero para acabar la partida. Además, muchas de las partidas son iguales a otras, aplicando giros y simetrías en el tablero. Por ejemplo, un tablero en el que sólo hay una X en la esquina superior derecha es igual que los otros 3 tableros en los que la X está en la esquina.

El caso es que en la mayoría de juegos, no se pueden generar todas las partidas posibles, sino que hay que conformarse con soluciones aproximadas.

Todos los tableros de TA-TE-TI que crees y sus relaciones constituyen el espacio de búsqueda de tu programa. En él tiene que buscar un camino desde la posición actual del tablero hasta una situación victoriosa, y elegir las jugadas siguientes, de modo que se llegue a la victoria.

Tendrías que determinar la forma en que escoges la siguiente jugada para que resulte en victoria (o al menos que no acabe en derrota - recuerda la película Juegos de guerra Wink ), y anticiparte al jugador humano en su siguiente movimiento. Por decirlo de algun modo, tendrías que tener en cuenta todas las jugadas que quedan hasta que la partida llegue a un final favorable. Para eso puede usarse un algoritmo conocido como poda alfa-beta.

Bueno, generar los tableros no es difícil. De hecho hay una forma trivial de hacerlo mediante un bucle desde 1 hasta 10!. Lo malo es saber qué tableros descienden de otros. Para eso, lo más facil es emplear recursividad, y crear una función a la que le pasas un tablero y te crea sus descendientes y se llama ella misma para cada descendiente creado.
_________________
Las ciencias de la computación están tan poco relacionadas con las computadoras como la astronomía con los telescopios

Edsger Dijkstra
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com