| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Anuled
Registrado: 24 Oct 2012 Mensajes: 21
| Publicado: 24/11/2012 6:52 am | | | Título: Problema con juego de 3 en raya en C |
| Hola, con lo conocimientos que he ido adquiriendo en la programación en C me he decidido por hacer por mi cuenta un juego del 3 en raya, algo "simple" para empezar. Lo que llevo hecho está muy cutre, pero tenéis que entender que llevo poco tiempo programando.
En lo que es a la estructura algorítmica tengo una duda, ahora os la comento. Dejo primero lo que llevo hecho de código (aun no está acabado):
| Código: | #include <stdlib.h> #include <stdio.h> #include <time.h>
/*3 en raya*/
int main (void){ int matriz[3][3], i, j, opcion1, opcion2, opDescartada1; srand(time(NULL)); system ("cls"); for(i=0; i<3; i++){ for(j=0; j<3; j++){ matriz[i][j]=0; } } printf("\tBIENVENIDO A LA PARTIDA"); printf("\n\nEstas son las posiciones que hay en el tablero,"); //Introducción al juego. printf("\npara elegir una casilla escribe su numero."); printf("\n\nEstos son los numeros de cada casilla:"); //Muestra cómo seleccionar una casilla. printf("\n\n\t1 2 3\n\t4 5 6\n\t7 8 9"); printf("\n\nEn la casilla que selecciones se escribira un 1,"); printf("\nmientras que donde seleccione el ordenador habra un 2"); printf("\n\nEl tablero ahora mismo esta asi:"); printf("\n\n\t%i %i %i", matriz[0][0], matriz[0][1], matriz[0][2]); //Muestra por pantalla tablero vacío. printf("\n\t%i %i %i", matriz[1][0], matriz[1][1], matriz[1][2]); printf("\n\t%i %i %i", matriz[2][0], matriz[2][1], matriz[2][2]); do{ printf("\n\nQue casilla seleccionas para mover?:"); //Primera elección jugador 1. scanf("%i", &opcion1); }while((opcion1<1)||(opcion1>9)); switch(opcion1){ case(1): matriz[0][0]=1; break; case(2): matriz[0][1]=1; break; case(3): matriz[0][2]=1; break; case(4): matriz[1][0]=1; break; case(5): matriz[1][1]=1; break; case(6): matriz[1][2]=1; break; case(7): matriz[2][0]=1; break; case(8): matriz[2][1]=1; break; case(9): matriz[2][2]=1; break; } opDescartada1=opcion1; //Descarta la casilla del jugador para que no la seleccione la máquina. do{ //Turno de la maquina, la elección de la primera casilla sera absolutamente azarosa. opcion2=(1+rand()%(9-1+1)); //(x+rand()%y) genera un numero aleatorio en el rango [x, y-1+x] }while(opcion2=opDescartada1);
switch(opcion2){ case(1): matriz[0][0]=2; break; case(2): matriz[0][1]=2; break; case(3): matriz[0][2]=2; break; case(4): matriz[1][0]=2; break; case(5): matriz[1][1]=2; break; case(6): matriz[1][2]=2; break; case(7): matriz[2][0]=2; break; case(8): matriz[2][1]=2; break; case(9): matriz[2][2]=2; break; } printf("\nHa pasado el primer turno de partida."); printf("\nEl tablero esta ahora mismo asi:"); //Muestra tablero. printf("\n\n\t%i %i %i", matriz[0][0], matriz[0][1], matriz[0][2]); printf("\n\t%i %i %i", matriz[1][0], matriz[1][1], matriz[1][2]); printf("\n\t%i %i %i", matriz[2][0], matriz[2][1], matriz[2][2]);
system ("pause"); return 0; } |
Me voy a centrar en esta parte del código:
| Código: | do{ //Turno de la maquina, la elección de la primera casilla sera absolutamente azarosa. opcion2=(1+rand()%(9-1+1)); //(x+rand()%y) genera un numero aleatorio en el rango [x, y-1+x] }while(opcion2=opDescartada1); |
Si compiláis el programa en DevC++ y lo ejecutáis veréis lo que ocurre. El jugador hace la elección de una casilla. Esa casilla se descarta para que el ordenador no la seleccione, pero tras la decisión de casilla del jugador 1, la máquina no decide nada. No se si el problema está en el do{-------}while(-----); o en otra cosa. A ver si me podéis echar una mano para arreglar ese fragmento del código por favor.
Un saludo y muchas gracias.  |
| | Volver arriba | |  | Masakre
Registrado: 06 Jun 2012 Mensajes: 245
| Publicado: 24/11/2012 8:20 am | | | Título: Re: Problema con juego de 3 en raya en C |
| | Cita: | do{ //Turno de la maquina, la elección de la primera casilla sera absolutamente azarosa. opcion2=(1+rand()%(9-1+1)); //(x+rand()%y) genera un numero aleatorio en el rango [x, y-1+x] }while(opcion2==opDescartada1); |
Es algo que a mí me ocurría muy seguido jeje |
| | Volver arriba | |  | Anuled
Registrado: 24 Oct 2012 Mensajes: 21
| Publicado: 24/11/2012 2:05 pm | | | Título: |
| Muchas gracias por la ayuda, ya terminé el código y me ha surgido otro problema: la inteligencia artificial la he diseñado para que siempre que hayan dos fichas alineadas, el ordenador rellene el tercer hueco para evitar que el usuario gane. Si el usuario no pone 2 fichas alineadas, por ejemplo, la partida esta asi
- 1 - 2 - - - - 1
y le tocase al ordenador poner un 2. no sabria donde ponerlo. Lo puse para que lo pusiese con un rand, pero no va, se queda sin mover. Os dejo el codigo entero (0,46k lineas) y abajo dónde creo que está el problema.
| Código: | #include <stdlib.h> #include <stdio.h> #include <time.h>
/*3 en raya*/
int main (void){ int matriz[3][3], i, j, opcion1, opcion2, opcion3, opcion4, opcion5, opcion6, opcion7, opcion8; srand(time(NULL)); system ("cls"); for(i=0; i<3; i++){ for(j=0; j<3; j++){ matriz[i][j]=0; } } printf("\tBIENVENIDO A LA PARTIDA"); printf("\n\nEstas son las posiciones que hay en el tablero,"); //Introducción al juego. printf("\npara elegir una casilla escribe su numero."); printf("\n\nEstos son los numeros de cada casilla:"); //Muestra cómo seleccionar una casilla. printf("\n\n\t1 2 3\n\t4 5 6\n\t7 8 9"); printf("\n\nEn la casilla que selecciones se escribira un 1,"); printf("\nmientras que donde seleccione el ordenador habra un 2"); printf("\n\nEl tablero ahora mismo esta asi:"); printf("\n\n\t%i %i %i", matriz[0][0], matriz[0][1], matriz[0][2]); //Muestra por pantalla tablero vacío. printf("\n\t%i %i %i", matriz[1][0], matriz[1][1], matriz[1][2]); printf("\n\t%i %i %i", matriz[2][0], matriz[2][1], matriz[2][2]); do{ printf("\n\nQue casilla seleccionas para mover?:"); //Primera elección jugador 1. scanf("%i", &opcion1); }while((opcion1<1)||(opcion1>9)); switch(opcion1){ case(1): matriz[0][0]=1; break; case(2): matriz[0][1]=1; break; case(3): matriz[0][2]=1; break; case(4): matriz[1][0]=1; break; case(5): matriz[1][1]=1; break; case(6): matriz[1][2]=1; break; case(7): matriz[2][0]=1; break; case(8): matriz[2][1]=1; break; case(9): matriz[2][2]=1; break; } do{ //Turno de la maquina, la elección de la primera casilla sera absolutamente azarosa. opcion2=(1+rand()%(9-1+1)); //(x+rand()%y) genera un numero aleatorio en el rango [x, y-1+x] }while(opcion2==opcion1);
switch(opcion2){ case(1): matriz[0][0]=2; break; case(2): matriz[0][1]=2; break; case(3): matriz[0][2]=2; break; case(4): matriz[1][0]=2; break; case(5): matriz[1][1]=2; break; case(6): matriz[1][2]=2; break; case(7): matriz[2][0]=2; break; case(8): matriz[2][1]=2; break; case(9): matriz[2][2]=2; break; } printf("\nHa pasado el primer turno de partida."); printf("\nEl tablero esta ahora mismo asi:"); //Muestra tablero. printf("\n\n\t%i %i %i", matriz[0][0], matriz[0][1], matriz[0][2]); printf("\n\t%i %i %i", matriz[1][0], matriz[1][1], matriz[1][2]); printf("\n\t%i %i %i", matriz[2][0], matriz[2][1], matriz[2][2]); printf("\n"); do{ printf("\nQue casilla seleccionas para mover?:"); //Segunda elección jugador 1. scanf("%i", &opcion3); }while(((opcion3<1)||(opcion3>9))||((opcion3==opcion2)||(opcion3==opcion1))); switch(opcion3){ case(1): matriz[0][0]=1; break; case(2): matriz[0][1]=1; break; case(3): matriz[0][2]=1; break; case(4): matriz[1][0]=1; break; case(5): matriz[1][1]=1; break; case(6): matriz[1][2]=1; break; case(7): matriz[2][0]=1; break; case(8): matriz[2][1]=1; break; case(9): matriz[2][2]=1; break; } if((matriz[0][0]==1)&&(matriz[1][0]==1)) //IA columnas. opcion4=7; else if((matriz[0][1]==1)&&(matriz[1][1]==1)) opcion4=8; else if((matriz[0][2]==1)&&(matriz[1][2]==1)) opcion4=9; else if((matriz[1][0]==1)&&(matriz[2][0]==1)) opcion4=1; else if((matriz[1][1]==1)&&(matriz[2][1]==1)) opcion4=2; else if((matriz[1][2]==1)&&(matriz[2][2]==1)) opcion4=3; else if((matriz[0][0]==1)&&(matriz[0][1]==1)) //IA filas. opcion4=3; else if((matriz[1][0]==1)&&(matriz[1][1]==1)) opcion4=6; else if((matriz[2][0]==1)&&(matriz[2][1]==1)) opcion4=9; else if((matriz[0][1]==1)&&(matriz[0][2]==1)) opcion4=1; else if((matriz[1][2]==1)&&(matriz[1][1]==1)) opcion4=4; else if((matriz[2][1]==1)&&(matriz[2][2]==1)) opcion4=7; else if((matriz[0][0]==1)&&(matriz[1][1]==1)) //IA diagonales. opcion4=9; else if((matriz[2][2]==1)&&(matriz[1][1]==1)) opcion4=1; else if((matriz[0][2]==1)&&(matriz[1][1]==1)) opcion4=7; else if((matriz[2][0]==1)&&(matriz[1][1]==1)) opcion4=3; else if((matriz[0][0]==1)&&(matriz[2][2]==1)) //IA entre espacios diagonales. opcion4=5; else if((matriz[0][2]==1)&&(matriz[2][0]==1)) opcion4=5; else if((matriz[0][0]==1)&&(matriz[2][0]==1)) //IA entre espacios columnas. opcion4=4; else if((matriz[0][1]==1)&&(matriz[2][1]==1)) opcion4=5; else if((matriz[0][2]==1)&&(matriz[2][2]==1)) opcion4=6; else if((matriz[0][0]==1)&&(matriz[0][2]==1)) //IA espacios filas. opcion4=2; else if((matriz[1][0]==1)&&(matriz[1][2]==1)) opcion4=5; else if((matriz[2][0]==1)&&(matriz[2][2]==1)) opcion4=8; else{ do{ opcion4=(1+rand()%(9-1+1)); }while((opcion4==opcion1)||(opcion4==opcion2)||(opcion4==opcion3)); } switch(opcion4){ case(1): matriz[0][0]=2; break; case(2): matriz[0][1]=2; break; case(3): matriz[0][2]=2; break; case(4): matriz[1][0]=2; break; case(5): matriz[1][1]=2; break; case(6): matriz[1][2]=2; break; case(7): matriz[2][0]=2; break; case(8): matriz[2][1]=2; break; case(9): matriz[2][2]=2; break; } printf("\nHa pasado el segundo turno de partida."); printf("\nEl tablero esta ahora mismo asi:"); //Muestra tablero. printf("\n\n\t%i %i %i", matriz[0][0], matriz[0][1], matriz[0][2]); printf("\n\t%i %i %i", matriz[1][0], matriz[1][1], matriz[1][2]); printf("\n\t%i %i %i", matriz[2][0], matriz[2][1], matriz[2][2]); printf("\n"); do{ printf("\nQue casilla seleccionas para mover?:"); scanf("%i", &opcion5); }while(((opcion3<1)||(opcion3>9))||((opcion5==opcion2)||(opcion5==opcion1)||(opcion5==opcion3)||(opcion5==opcion4))); switch(opcion5){ case(1): matriz[0][0]=1; break; case(2): matriz[0][1]=1; break; case(3): matriz[0][2]=1; break; case(4): matriz[1][0]=1; break; case(5): matriz[1][1]=1; break; case(6): matriz[1][2]=1; break; case(7): matriz[2][0]=1; break; case(8): matriz[2][1]=1; break; case(9): matriz[2][2]=1; break; } if((matriz[0][0]==1)&&(matriz[1][0]==1)) //IA columnas. opcion6=7; else if((matriz[0][1]==1)&&(matriz[1][1]==1)) opcion6=8; else if((matriz[0][2]==1)&&(matriz[1][2]==1)) opcion6=9; else if((matriz[1][0]==1)&&(matriz[2][0]==1)) opcion6=1; else if((matriz[1][1]==1)&&(matriz[2][1]==1)) opcion6=2; else if((matriz[1][2]==1)&&(matriz[2][2]==1)) opcion6=3; else if((matriz[0][0]==1)&&(matriz[0][1]==1)) //IA filas. opcion6=3; else if((matriz[1][0]==1)&&(matriz[1][1]==1)) opcion6=6; else if((matriz[2][0]==1)&&(matriz[2][1]==1)) opcion6=9; else if((matriz[0][1]==1)&&(matriz[0][2]==1)) opcion6=1; else if((matriz[1][2]==1)&&(matriz[1][1]==1)) opcion6=4; else if((matriz[2][1]==1)&&(matriz[2][2]==1)) opcion6=7; else if((matriz[0][0]==1)&&(matriz[1][1]==1)) //IA diagonales. opcion6=9; else if((matriz[2][2]==1)&&(matriz[1][1]==1)) opcion6=1; else if((matriz[0][2]==1)&&(matriz[1][1]==1)) opcion6=7; else if((matriz[2][0]==1)&&(matriz[1][1]==1)) opcion6=3; else if((matriz[0][0]==1)&&(matriz[2][2]==1)) //IA entre espacios diagonales. opcion6=5; else if((matriz[0][2]==1)&&(matriz[2][0]==1)) opcion6=5; else if((matriz[0][0]==1)&&(matriz[2][0]==1)) //IA entre espacios columnas. opcion6=4; else if((matriz[0][1]==1)&&(matriz[2][1]==1)) opcion6=5; else if((matriz[0][2]==1)&&(matriz[2][2]==1)) opcion6=6; else if((matriz[0][0]==1)&&(matriz[0][2]==1)) //IA espacios filas. opcion6=2; else if((matriz[1][0]==1)&&(matriz[1][2]==1)) opcion6=5; else if((matriz[2][0]==1)&&(matriz[2][2]==1)) opcion6=8; else{ do{ opcion6=(1+rand()%(9-1+1)); }while((opcion6==opcion1)||(opcion6==opcion2)||(opcion6==opcion3)||(opcion6==opcion4)||(opcion6==opcion5)); } switch(opcion6){ case(1): matriz[0][0]=2; break; case(2): matriz[0][1]=2; break; case(3): matriz[0][2]=2; break; case(4): matriz[1][0]=2; break; case(5): matriz[1][1]=2; break; case(6): matriz[1][2]=2; break; case(7): matriz[2][0]=2; break; case(8): matriz[2][1]=2; break; case(9): matriz[2][2]=2; break; } printf("\nHa pasado el tercer turno de partida."); printf("\nEl tablero esta ahora mismo asi:"); //Muestra tablero. printf("\n\n\t%i %i %i", matriz[0][0], matriz[0][1], matriz[0][2]); printf("\n\t%i %i %i", matriz[1][0], matriz[1][1], matriz[1][2]); printf("\n\t%i %i %i", matriz[2][0], matriz[2][1], matriz[2][2]); printf("\n"); do{ printf("\nQue casilla seleccionas para mover?:"); scanf("%i", &opcion5); }while(((opcion3<1)||(opcion3>9))||((opcion7==opcion2)||(opcion7==opcion1)||(opcion7==opcion3)||(opcion7==opcion4)||(opcion7==opcion5)||(opcion7==opcion6))); switch(opcion7){ case(1): matriz[0][0]=1; break; case(2): matriz[0][1]=1; break; case(3): matriz[0][2]=1; break; case(4): matriz[1][0]=1; break; case(5): matriz[1][1]=1; break; case(6): matriz[1][2]=1; break; case(7): matriz[2][0]=1; break; case(8): matriz[2][1]=1; break; case(9): matriz[2][2]=1; break; } if((matriz[0][0]==1)&&(matriz[1][0]==1)) //IA columnas. opcion8=7; else if((matriz[0][1]==1)&&(matriz[1][1]==1)) opcion8=8; else if((matriz[0][2]==1)&&(matriz[1][2]==1)) opcion8=9; else if((matriz[1][0]==1)&&(matriz[2][0]==1)) opcion8=1; else if((matriz[1][1]==1)&&(matriz[2][1]==1)) opcion8=2; else if((matriz[1][2]==1)&&(matriz[2][2]==1)) opcion8=3; else if((matriz[0][0]==1)&&(matriz[0][1]==1)) //IA filas. opcion8=3; else if((matriz[1][0]==1)&&(matriz[1][1]==1)) opcion8=6; else if((matriz[2][0]==1)&&(matriz[2][1]==1)) opcion8=9; else if((matriz[0][1]==1)&&(matriz[0][2]==1)) opcion8=1; else if((matriz[1][2]==1)&&(matriz[1][1]==1)) opcion8=4; else if((matriz[2][1]==1)&&(matriz[2][2]==1)) opcion8=7; else if((matriz[0][0]==1)&&(matriz[1][1]==1)) //IA diagonales. opcion8=9; else if((matriz[2][2]==1)&&(matriz[1][1]==1)) opcion8=1; else if((matriz[0][2]==1)&&(matriz[1][1]==1)) opcion8=7; else if((matriz[2][0]==1)&&(matriz[1][1]==1)) opcion8=3; else if((matriz[0][0]==1)&&(matriz[2][2]==1)) //IA entre espacios diagonales. opcion8=5; else if((matriz[0][2]==1)&&(matriz[2][0]==1)) opcion8=5; else if((matriz[0][0]==1)&&(matriz[2][0]==1)) //IA entre espacios columnas. opcion8=4; else if((matriz[0][1]==1)&&(matriz[2][1]==1)) opcion8=5; else if((matriz[0][2]==1)&&(matriz[2][2]==1)) opcion8=6; else if((matriz[0][0]==1)&&(matriz[0][2]==1)) //IA espacios filas. opcion8=2; else if((matriz[1][0]==1)&&(matriz[1][2]==1)) opcion8=5; else if((matriz[2][0]==1)&&(matriz[2][2]==1)) opcion8=8; else{ do{ opcion8=(1+rand()%(9-1+1)); }while((opcion8==opcion1)||(opcion8==opcion2)||(opcion8==opcion3)||(opcion8==opcion4)||(opcion8==opcion5)||(opcion8==opcion6)||(opcion8==opcion7)); } switch(opcion8){ case(1): matriz[0][0]=2; break; case(2): matriz[0][1]=2; break; case(3): matriz[0][2]=2; break; case(4): matriz[1][0]=2; break; case(5): matriz[1][1]=2; break; case(6): matriz[1][2]=2; break; case(7): matriz[2][0]=2; break; case(8): matriz[2][1]=2; break; case(9): matriz[2][2]=2; break; } printf("\nHa pasado el cuarto turno de partida."); printf("\nEl tablero esta ahora mismo asi:"); //Muestra tablero. printf("\n\n\t%i %i %i", matriz[0][0], matriz[0][1], matriz[0][2]); printf("\n\t%i %i %i", matriz[1][0], matriz[1][1], matriz[1][2]); printf("\n\t%i %i %i", matriz[2][0], matriz[2][1], matriz[2][2]); printf("\n"); for(i=0; i<3; i++){ //Asignar automaticamente el valor a la casilla que sobra. for(j=0; j<3; j++){ if(matriz[i][j]==0) matriz[i][j]=1; } } //Ver qioén ha ganado. if((matriz[0][0]==1)&&((matriz[0][0]==matriz[0][1])||(matriz[0][0]==matriz[0][2]))) //¿Victoria jugador 1? printf("\n\tHAS GANADO.\n"); else if((matriz[1][0]==1)&&((matriz[1][0]==matriz[1][1])||(matriz[1][0]==matriz[1][2]))) printf("\n\tHAS GANADO.\n"); else if((matriz[2][0]==1)&&((matriz[2][0]==matriz[2][1])||(matriz[2][0]==matriz[2][2]))) printf("\n\tHAS GANADO.\n"); else if((matriz[0][0]==1)&&((matriz[0][0]==matriz[1][0])||(matriz[0][0]==matriz[2][0]))) printf("\n\tHAS GANADO.\n"); else if((matriz[0][1]==1)&&((matriz[0][1]==matriz[1][1])||(matriz[0][1]==matriz[2][1]))) printf("\n\tHAS GANADO.\n"); else if((matriz[0][2]==1)&&((matriz[0][2]==matriz[1][2])||(matriz[0][2]==matriz[2][2]))) printf("\n\tHAS GANADO.\n"); else if((matriz[0][0]==1)&&((matriz[0][0]==matriz[1][1])||(matriz[0][0]==matriz[2][2]))) printf("\n\tHAS GANADO.\n"); else if((matriz[2][0]==1)&&((matriz[0][0]==matriz[1][1])||(matriz[0][0]==matriz[0][2]))) printf("\n\tHAS GANADO.\n"); else if((matriz[0][0]==2)&&((matriz[0][0]==matriz[0][1])||(matriz[0][0]==matriz[0][2]))) printf("\n\tORDENADOR GANA.\n"); else if((matriz[1][0]==2)&&((matriz[1][0]==matriz[1][1])||(matriz[1][0]==matriz[1][2]))) printf("\n\tORDENADOR GANA.\n"); else if((matriz[2][0]==2)&&((matriz[2][0]==matriz[2][1])||(matriz[2][0]==matriz[2][2]))) printf("\n\tORDENADOR GANA.\n"); else if((matriz[0][0]==2)&&((matriz[0][0]==matriz[1][0])||(matriz[0][0]==matriz[2][0]))) printf("\n\tORDENADOR GANA.\n"); else if((matriz[0][1]==2)&&((matriz[0][1]==matriz[1][1])||(matriz[0][1]==matriz[2][1]))) printf("\n\tORDENADOR GANA.\n"); else if((matriz[0][2]==2)&&((matriz[0][2]==matriz[1][2])||(matriz[0][2]==matriz[2][2]))) printf("\n\tORDENADOR GANA.\n"); else if((matriz[0][0]==2)&&((matriz[0][0]==matriz[1][1])||(matriz[0][0]==matriz[2][2]))) printf("\n\tORDENADOR GANA.\n"); else if((matriz[2][0]==2)&&((matriz[0][0]==matriz[1][1])||(matriz[0][0]==matriz[0][2]))) printf("\n\tORDENADOR GANA.\n"); else printf("\n\tNADIE GANA.\n"); printf("\n\n\t*****************\n\tCREADO POR ANULED\n\t*****************\a\a\a\a\a\n"); system ("pause");
return 0;
} |
Creo que el problema se centra en este else, a ver si me podéis echar una mano, gracias por vuestro tiempo y espero que os guste el 3 en raya, si tenéis sugerencias para mejorarlo decidlo por favor.
| Código: | else{ do{ opcion6=(1+rand()%(9-1+1)); }while((opcion6==opcion1)||(opcion6==opcion2)||(opcion6==opcion3)||(opcion6==opcion4)||(opcion6==opcion5)); } | [/code] |
| | Volver arriba | |  | | leosan
Registrado: 19 Abr 2012 Mensajes: 730 Ubicación: GRAN CANARIA
| Publicado: 25/11/2012 4:27 am | | | Título: |
| | Anuled escribió: | ya terminé el código y me ha surgido otro problema: la inteligencia artificial la he diseñado para que siempre que hayan dos fichas alineadas, el ordenador rellene el tercer hueco para evitar que el usuario gane. Si el usuario no pone 2 fichas alineadas, por ejemplo, la partida esta asi
- 1 - 2 - - - - 1
y le tocase al ordenador poner un 2. no sabria donde ponerlo. Lo puse para que lo pusiese con un rand, pero no va, se queda sin mover |
Pues a mí si me mueve la ficha en ese caso, otra cosa sería si debe ser aleatorio ese movimiento o no, ya que el movimiento de la máquina a la casilla 3 sería interesante porque le "fastidia" al usuario las linea primera, última, la última linea y la diagonal secundaria..y si elige la casilla 7 gana ya que el usuario tendría que mover a la casilla 1, la máquina lo haría a la 5, el usuario tendría que ir a la 6 y la máquina a 3 y gana la máquina. Saluditos!. |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 7520 Ubicación: Mexico
| Publicado: 25/11/2012 8:17 am | | | Título: |
| Si apenas empiezas tu aprendizaje en el lenguaje C te recomendaría que dejaras el desarrollo de programas ligeramente complicados (como este) para después. De no hacerlo te vas a meter en problemas realizando operaciones de una forma mas larga y complicada.
Por ejemplo en el programa tienes varios bloques como este:
| Código: | switch (opcion1){ case (1) : matriz[0][0] = 1; break; case (2) : matriz[0][1] = 1; break; case (3) : matriz[0][2] = 1; break; case (4) : matriz[1][0] = 1; break; case (5) : matriz[1][1] = 1; break; case (6) : matriz[1][2] = 1; break; case (7) : matriz[2][0] = 1; break; case (8) : matriz[2][1] = 1; break; case (9) : matriz[2][2] = 1; break; } |
Para empezar se deben evitar nombres como "opcion1", "opcion2". etc. ya que no indican el uso de la variable, mas todavía, el mismo uso sugiere utilizar un array para almacenar todos los valores. También hay que eliminar los paréntesis de las literales en "case (1) :", "case (2) :", etc. ya que no son necesarios.
Y ese bloque si lo revisas con cuidado se puede reducir a:
| Código: | matriz[(opcion1 - 1) / 3][(opcion1 - 1) % 3] = 1; |
Mismo caso con todos los bloques similares.
Y los turnos se deben colocar en un bucle: primero el turno inicial y a continuación iteras un máximo de cuatro veces (ocho jugadas, la mitad para cada jugador). Para verificar si alguien gano puedes colocar el proceso en una función.
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
| | Volver arriba | |  | Anuled
Registrado: 24 Oct 2012 Mensajes: 21
| Publicado: 25/11/2012 9:45 am | | | Título: |
| Muchas gracias por los consejos y las correcciones. Leosna tiene razón, la IA se debe mejorar mucho, y rir tiene razón respecto a que un programa asi se me viene grande. Por ahora lo dejaré apartado, espero coger más práctica en C, o acabar mi formacion académica y lo retomaré pero desde 0, para hacerlo lo más optimizado posible. Un saludo y gracias  |
| | Volver arriba | |  | | Masakre
Registrado: 06 Jun 2012 Mensajes: 245
| Publicado: 18/12/2012 11:58 am | | | Título: |
| Bueno, al ver este tema hace unas semanas me animé por crear mi versión del juego de "3 en raya", en consola también. Como estuve en exámenes, ya casi me olvidaba de comentarlo acá jeje.
Estuve probando los etiquetas spoiler y hide, pero al parecer no están disponibles. Entonces he buscado un sitio donde subir el código y me encontré con pastebin:
| Cita: | | http://pastebin.com/P89kseKF |
Espero te sirva de algo Anuled. |
| | Volver arriba | |  | untio

Registrado: 17 Sep 2008 Mensajes: 380 Ubicación: MICA S.A.
| Publicado: 28/12/2012 7:40 am | | | Título: |
| Hola,
Perdonadme si me paso de la raya, pero sólo quiero deciros que en los juegos perfectos (cuando se saben todos los posibles movimientos), se suele implementar un árbol maximin (ó minimax).
Hay varias páginas que explican el algoritmo. Por ejemplo:
http://ai-depot.com/articles/minimax-explained/
ó aquí:
http://beej.us/blog/data/minimax/
De nuevo, perdonadme si no estoy en lo cierto.
Feliz año. _________________ Hago algo muy raro: primero leo las instrucciones. |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |