Ver Mensaje Individual
  #2 (permalink)  
Antiguo 09/09/2009, 07:21
JuanLVBR
 
Fecha de Ingreso: septiembre-2009
Ubicación: Burgos
Mensajes: 28
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: Preciso ayuda con 3 programas para un trabajo

Si te planto el código sin más no vas a aprender nada de nada... Si al menos pusieses dónde te quedas, o qué es lo que no sabes... Porque no tienen mucha, mucha dificultad... ¿Los has intentado? ¿Qué errores te da? ¿Dónde te atascas?

Aun así te pongo el último.

Código c:
Ver original
  1. #include<stdio.h>
  2.  
  3. enum jugador{A=-1, B=1};
  4.  
  5. unsigned tresenraya(unsigned tabla[3][3], unsigned jug){
  6.     unsigned ganador = 0;
  7.     if(tabla[0][0] == jug){
  8.         if(tabla[1][0] == jug && tabla[2][0] == jug)
  9.             ganador = jug;
  10.         else
  11.             if(tabla[1][1] == jug && tabla[2][2] == jug)
  12.                 ganador = jug;
  13.             else
  14.                 if(tabla[0][1] == jug && tabla[0][2] == jug)
  15.                     ganador = jug;
  16.     }
  17.     if(tabla[1][1] == jug){
  18.         if(tabla[2][0] == jug && tabla[0][2] == jug)
  19.             ganador = jug;
  20.         else
  21.             if(tabla[0][1] == jug && tabla[2][1] == jug)
  22.                 ganador = jug;
  23.             else
  24.                 if(tabla[1][0] == jug && tabla[1][2] == jug)
  25.                     ganador = jug;
  26.     }
  27.     if(tabla[2][2] == jug){
  28.         if(tabla[2][1] == jug && tabla[2][0] == jug)
  29.             ganador = jug;
  30.         else
  31.             if(tabla[1][2] == jug && tabla[0][2] == jug)
  32.                 ganador = jug;
  33.     }
  34.     return ganador;
  35. }
  36.  
  37. void validaJugada(unsigned tabla[3][3], unsigned jugador){
  38.     char c;
  39.     unsigned fil, col;
  40.     if(jugador == A)
  41.         c = 'A';
  42.     else
  43.         c = 'B';
  44.     printf("\nJugador %c introduzca su jugada (fila<espacio>columna): ", c);
  45.     scanf("%u", &fil);
  46.     scanf("%u", &col);
  47.     fflush(stdin);
  48.     -- fil;
  49.     -- col;
  50.     if(tabla[fil][col] != 0)
  51.             fil = 3;
  52.     while(fil<0 || fil>2 || col<0 || col>2){
  53.         printf("\nERROR: Jugada incorrecta. Intentelo de nuevo jugador %c: ", c);
  54.         scanf("%u", &fil);
  55.         scanf("%u", &col);
  56.         fflush(stdin);
  57.         -- fil;
  58.         -- col;
  59.         if(tabla[fil][col] != 0)
  60.             fil = 3;
  61.     }
  62.     tabla[fil][col] = jugador;
  63. }
  64.  
  65. void imprimeTablero(unsigned tabla[3][3]){
  66.     unsigned i, j;
  67.     printf("\n\n  TABLERO DE JUEGO:\n");
  68.     printf("  1 2 3\n");
  69.     for(i=0; i<3; ++i){
  70.         printf("%u ", i+1);
  71.         for(j=0; j<3; ++j)
  72.             if(tabla[i][j] == 1)
  73.                 printf("O ");
  74.             else
  75.                 if(tabla[i][j] == -1)
  76.                     printf("X ");
  77.                 else
  78.                     printf("  ");
  79.         printf("\n");
  80.     }
  81. }
  82.  
  83. int main(){
  84.     unsigned fil, col, jugador, tabla [3][3], i=1;
  85.     char c;
  86.    
  87.     for(fil=0; fil<3; ++fil)
  88.         for(col=0; col<3; ++col)
  89.             tabla[fil][col] = 0;
  90.    
  91.     do{
  92.         jugador = A;
  93.         imprimeTablero(tabla);
  94.         validaJugada(tabla, jugador);
  95.         if(tresenraya(tabla, jugador) == 0){
  96.             if(i<5){
  97.                 jugador = B;
  98.                 imprimeTablero(tabla);
  99.                 validaJugada(tabla, jugador);
  100.             }
  101.             else
  102.                 i = 9;
  103.         }
  104.         ++i;
  105.     }while(tresenraya(tabla, jugador) == 0 && i<6);
  106.    
  107.     imprimeTablero(tabla);
  108.    
  109.     if(i == 10)
  110.         printf("\n\nEmpate, no hay mas movimientos posibles.");
  111.     else
  112.         if(jugador == A)
  113.             printf("\n\nEnhorabuena jugador A, has ganado.");
  114.         else
  115.             printf("\n\nEnhorabuena jugador B, has ganado.");
  116.            
  117.     printf("\n\nPulse <enter> para finalizar...\n");
  118.     c = getchar();
  119.     while(c!='\n'){
  120.         c = getchar();
  121.     }      
  122.     return 0;
  123. }

En el enunciado no ponía nada así que he supuesto el tres en raya básico, en el que no se pueden mover fichas, si sí se pueden mover bastaría con cuando cada uno haya puesto sus tres fichas (3 iteraciones de bucle) crear otro bucle en el que al usuario se le pida primeramente qué ficha desea desplazar (se compruebe si es suya o no) y a qué posición desea desplazarla (y se compruebe si está ocupada o no). Una tontería vamos.

El enunciado no pide ni las funciones validaJugada( ), ni imprimeTablero( ), si las quitas, el rendimiento será mucho mayor y te evitarás muchísimas líneas, disminuyendo hasta el main( ), pero claro, tendrás que ser "adivino" para ver cómo va el juego cuando juegues y pasar de todo si te meten entradas no válidas.

Puestos a validar habría que validar que metiesen carácteres en vez de números, pero bueno, no tengo ganas... xD.

He añadido un parámetro a tresenraya( ) para que no tenga que preguntar cada vez si es 1 o si es -1, sólo debería preguntar si es el último jugador que introdujo la ficha. Si A acaba de meter ficha, ya sabemos que B no ha ganado, lo acabamos de comprobar antes y no ha metido ninguna ficha, qué tontería... Si no te gusta pues le quitas el parámetro y preguntas por ambos.

Estoy totalmente abierto a discusión en cuanto al rendimiento de tresenraya( ), se podría haber metido un booleano "Ganador" para no hacer más preguntas una vez que sabes que hay ganador, pero como dicha situación se va a dar una única vez, no merece la pena meter una pregunta más por cada vez que la llamemos... Hombre, lo que sí está claro es que podríamos haber metido "breaks" a mansalva y la mejora sería increíble, pero soy partidario del C estructurado.

Última edición por JuanLVBR; 09/09/2009 a las 07:32