Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/12/2011, 11:15
Avatar de nanotime
nanotime
 
Fecha de Ingreso: noviembre-2011
Ubicación: Cd. Guayana
Mensajes: 145
Antigüedad: 13 años
Puntos: 6
Pregunta Construyendo un 3 en raya en C++

Bueno, este es mi proyecto de estructura de datos de la uni, construir un básico 3 en raya sin inteligencia artificial ni nada...

Como en la universidad los profesores son flojos y no explican he tenido que autoenseñarme casi todo y buscando un poco encontré un código bastante sencillo y básico pero que noto un tanto ineficiente.

Código C++:
Ver original
  1. /**************************************************\
  2. * Autor:      ~ .:: {[*JuaN-ThE-HaCKeR*]} ::. ~    *
  3. * Proyecto:   Tres en raya                         *
  4. * Versión:    V1.10                                *
  5. * Estado:     Terminado                            *
  6. * Fecha:      09/01/09                             *
  7. * Hora:       19:08                                *
  8. \**************************************************/
  9. #include <iostream>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. using namespace std;
  13. // Para Linux:
  14. #define C "+" // Cruce
  15. #define H "-" // Horizontal
  16. #define V "|" // Vertical
  17. // Para Windows:
  18. // #define C "\xCE" // Cruce
  19. // #define H "\xCD" // Horizontal
  20. // #define V "\xBA" // Vertical
  21. char a1=' ',a2=' ',a3=' ',b1=' ',b2=' ',b3=' ',c1=' ',c2=' ',c3=' ',turno,again;
  22. string ficha=" ";
  23. int win=-1,jug,i=0;
  24. void tablero();
  25. void tablero(){
  26. system("clear");
  27. cout    << "\t\t\t    1     2      3"<< endl
  28. << "\t\t\t       " << V << "      " << V << "      " << endl
  29. << "\t\t\tA   " << a1 << "  " << V << "  " << a2 << "   " << V << "  " << a3 << "   " << endl
  30. << "\t\t\t       " << V << "      " << V << "      " << endl
  31. << "\t\t\t  " << H << H << H << H << H << C << H << H << H << H << H << H << C << H << H << H << H << H << endl
  32. << "\t\t\t       " << V << "      " << V << "      " << endl
  33. << "\t\t\tB   " << b1 << "  " << V << "  " << b2 << "   " << V << "  " << b3 << "   " << endl
  34. << "\t\t\t       " << V << "      " << V << "      " << endl
  35. << "\t\t\t  " << H << H << H << H << H << C << H << H << H << H << H << H << C << H << H << H << H << H << endl
  36. << "\t\t\t       " << V << "      " << V << "      " << endl
  37. << "\t\t\tC   " << c1 << "  " << V << "  " << c2 << "   " << V << "  " << c3 << "   " << endl
  38. << "\t\t\t       " << V << "      " << V << "      " << endl << endl;
  39.         }
  40. int main(){
  41. while (1){
  42.     if(i%2==0){ jug=1; turno='X'; }
  43.     if(i%2==1){ jug=2; turno='O'; }
  44.     tablero();//Llama al tablero para llenarlo con las sentencias? Esto si no lo entiendo mucho.
  45.         if ((a1!=' ')&&(a2!=' ')&&(a3!=' ')&&(b1!=' ')&&(b2!=' ')&&(b3!=' ')&&(c1!=' ')&&(c2!=' ')&&(c3!=' ')) win=0;
  46.         if ((a1!=' ')&&(a1==a2)&&(a1==a3)) win=1;
  47.         if ((a1!=' ')&&(a1==b1)&&(a1==c1)) win=1;
  48.         if ((a1!=' ')&&(a1==b2)&&(a1==c3)) win=1;
  49.         if ((b1!=' ')&&(b1==b2)&&(b1==b3)) win=1;
  50.         if ((c1!=' ')&&(c1==c2)&&(c1==c3)) win=1;
  51.         if ((a2!=' ')&&(a2==b2)&&(a2==c2)) win=1;
  52.         if ((a3!=' ')&&(a3==b3)&&(a3==c3)) win=1;
  53.         if ((c1!=' ')&&(c1==b2)&&(c1==a3)) win=1;
  54.         if (win==0) cout << "\t\tEmpate.\n\n";
  55.         if (win==1) cout << "\t\tGanó el jugador " << jug << " (" << turno << "), ¡felicidades!\n\n";
  56.         if ((win==0)||(win==1)){
  57.     cout << "\t\t¿Desea volver a jugar? [S\\N] - ";
  58.     cin >> again;
  59. while((again!='s')&&(again!='S')&&(again!='n')&&(again!='N')){
  60.     cout << "ERROR: Responda sólo con S(Sí) o N(No)...\n\n"
  61.     "\t\t¿Desea volver a jugar? [S\\N]";
  62.     cin >> again;
  63. }
  64. switch(again){
  65.     case 's':case 'S':
  66.     a1=' ',a2=' ',a3=' ',b1=' ',b2=' ',b3=' ',c1=' ',c2=' ',c3=' ',win=-1,i=0;//¿Por qué llama a estas variables? ¿Para reiniciar juego?
  67.     tablero();
  68. break;
  69.     case 'n':case 'N':
  70. return 0;
  71. break;
  72. }
  73. }
  74. cout << "\t\tTurno del jugador " << jug << " ("<< turno << ") ...\n\n"
  75. "\t\t¿Dónde desea colocar su ficha? - ";
  76. cin >> ficha;
  77. if (ficha==" ");
  78.     else if (((ficha=="a1")||(ficha=="A1"))&&(a1==' ')) a1=turno;
  79.     else if (((ficha=="a2")||(ficha=="A2"))&&(a2==' ')) a2=turno;
  80.     else if (((ficha=="a3")||(ficha=="A3"))&&(a3==' ')) a3=turno;
  81.     else if (((ficha=="b1")||(ficha=="B1"))&&(b1==' ')) b1=turno;
  82.     else if (((ficha=="b2")||(ficha=="B2"))&&(b2==' ')) b2=turno;
  83.     else if (((ficha=="b3")||(ficha=="B3"))&&(b3==' ')) b3=turno;
  84.     else if (((ficha=="c1")||(ficha=="C1"))&&(c1==' ')) c1=turno;
  85.     else if (((ficha=="c2")||(ficha=="C2"))&&(c2==' ')) c2=turno;
  86.     else if (((ficha=="c3")||(ficha=="C3"))&&(c3==' ')) c3=turno;
  87. else {
  88.     cout << "\n\t\tERROR: plaza ocupada o inexistente...\n"
  89.     "\t\tPulse 'ENTER' y vuelva a colocar su ficha...";
  90.     cin.get(); cin.get();
  91. i--;
  92. }
  93. i++;
  94. }
  95. }

Bueno, eso no lo he hecho yo, apenas estoy viendo la lógica de todo esto, pero lo veo bastante ineficiente en el sentido de que usa demasiadas sentencias if para pocas cosas y porque creo que el trabajo podría simplificarse en una matriz, aunque no tengo buen dominio sobre matrices (o arreglos bidimensionales) y no logro darle bien la vuelta al asunto.

Una de las ideas es con la validación para la victoria, que veo bastante extraña ya que está verificando cada posición, si cada una es llenada con el valor de otras en cierto patrón se cumple una condición de victoria, que sería win=1. Yo veo más simple verificar condiciones en distintos turnos, osea el 3cer turno, 6to turno y 9no turno que es donde se puede dar una victoria (en los dos primeros) y/o una victoria/empate en el último ¿O me equivoco?

Y la parte de la matriz si que me confunde como hacerla, realmente no domino casi nada ese asunto.

Última edición por nanotime; 19/12/2011 a las 11:18 Razón: error en el código indentado