Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Construyendo un 3 en raya en C++

Estas en el tema de Construyendo un 3 en raya en C++ en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 19/12/2011, 11:15
Avatar de nanotime  
Fecha de Ingreso: noviembre-2011
Ubicación: Cd. Guayana
Mensajes: 145
Antigüedad: 13 años, 1 mes
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
  #2 (permalink)  
Antiguo 21/12/2011, 09:29
Avatar de nanotime  
Fecha de Ingreso: noviembre-2011
Ubicación: Cd. Guayana
Mensajes: 145
Antigüedad: 13 años, 1 mes
Puntos: 6
Respuesta: Construyendo un 3 en raya en C++

Alguna ayuda por favor?
  #3 (permalink)  
Antiguo 23/12/2011, 15:28
Avatar de s00rk  
Fecha de Ingreso: octubre-2010
Ubicación: Mexico
Mensajes: 238
Antigüedad: 14 años, 1 mes
Puntos: 48
Respuesta: Construyendo un 3 en raya en C++

La verdad no lei mucho el codigo puesto que si se me hizo muy am enredoso asi jeje, pero recorde que habia hecho algo asi hace tiempo y pues aqui te lo dejo si deceas:

TresRaya.java
Código Javascript:
Ver original
  1. package TresEnRaya;
  2. import java.util.*;
  3.  
  4. public class TresRaya
  5. {
  6.    
  7.     private char  [][] tablero = new char[3][3];
  8.     private int jugador = 1;
  9.     private char clave;
  10.     private boolean HayDisponibles;
  11.     private boolean Ganador = false;
  12.     private Scanner leer = new Scanner(System.in);
  13.    
  14.     public TresRaya()
  15.     {
  16.         for(int x = 0; x < 3; x++)
  17.             for(int xx = 0; xx < 3; xx++)
  18.                 tablero[x][xx] = 'T';
  19.     }
  20.    
  21.     public void jugar()
  22.     {
  23.         do{
  24.             if(jugador == 1)
  25.             {
  26.                 SOP("Turno Jugador 1\n");
  27.                 jugador = 2;
  28.                 clave = 'X';
  29.             }else{
  30.                 SOP("Turno Jugador 2\n");
  31.                 jugador = 1;
  32.                 clave = 'O';
  33.             }
  34.            
  35.             MostrarTabla();
  36.             SOP("\nPosiciones Disponibles");           
  37.             SOP("\n");
  38.             int [] pos = Posiciones();
  39.             tablero[pos[0]][pos[1]] = clave;
  40.             checar();
  41.         }while(HayDisponibles && !Ganador);
  42.         if(!Ganador)
  43.             SOP("Empate No Hubo Ganadores!!");
  44.            
  45.     }
  46.    
  47.     private void ChecarGanador()
  48.     {
  49.         char X = 'X', O = 'O';
  50.         if((tablero[0][0] == X && tablero[0][1] == X && tablero[0][2] == X) ||
  51.                 (tablero[1][0] == X && tablero[1][1] == X && tablero[1][2] == X) ||
  52.                 (tablero[2][0] == X && tablero[2][1] == X && tablero[2][2] == X) ||
  53.                 (tablero[0][0] == X && tablero[1][1] == X && tablero[2][2] == X) ||
  54.                 (tablero[0][2] == X && tablero[1][1] == X && tablero[2][0] == X) ||
  55.                 (tablero[0][0] == X && tablero[1][0] == X && tablero[1][0] == X) ||
  56.                 (tablero[1][0] == X && tablero[1][1] == X && tablero[1][2] == X) ||
  57.                 (tablero[2][0] == X && tablero[2][1] == X && tablero[2][2] == X))
  58.         {
  59.             SOP("Jugador 1 ha ganado!!");
  60.             Ganador = true;
  61.         }
  62.        
  63.         if((tablero[0][0] == O && tablero[0][1] == O && tablero[0][2] == O) ||
  64.                 (tablero[1][0] == O && tablero[1][1] == O && tablero[1][2] == O) ||
  65.                 (tablero[2][0] == O && tablero[2][1] == O && tablero[2][2] == O) ||
  66.                 (tablero[0][0] == O && tablero[1][1] == O && tablero[2][2] == O) ||
  67.                 (tablero[0][2] == O && tablero[1][1] == O && tablero[2][0] == O) ||
  68.                 (tablero[0][0] == O && tablero[1][0] == O && tablero[1][0] == O) ||
  69.                 (tablero[1][0] == O && tablero[1][1] == O && tablero[1][2] == O) ||
  70.                 (tablero[2][0] == O && tablero[2][1] == O && tablero[2][2] == O))
  71.         {
  72.             SOP("Jugador 2 ha ganado!!");
  73.             Ganador = true;
  74.         }
  75.        
  76.     }
  77.    
  78.     private void checar()
  79.     {
  80.         ChecarGanador();
  81.         if(!Ganador)
  82.         {
  83.             HayDisponibles = false;
  84.             for(int x = 0; x < 3; x++)
  85.                 for(int xx = 0; xx < 3; xx++)
  86.                     if(tablero[x][xx] == 'T')
  87.                         HayDisponibles = true;
  88.         }
  89.     }
  90.    
  91.     private void MostrarTabla()
  92.     {
  93.         for(int x = 0; x < 3; x++)
  94.         {
  95.             for(int xx = 0; xx < 3; xx++)
  96.             {
  97.                 System.out.print(tablero[x][xx]);
  98.                 if( xx < 2)
  99.                     System.out.print("|");
  100.             }
  101.             System.out.println();
  102.         }
  103.     }
  104.    
  105.     private int [] Posiciones()
  106.     {
  107.         int [][] resp = new int[10][2];
  108.         int cont = 0;
  109.         for(int x = 0; x < 3; x++)
  110.         {
  111.             for(int xx = 0; xx < 3; xx++)
  112.             {
  113.                 if(tablero[x][xx] == 'T')
  114.                 {
  115.                     cont++;
  116.                     SOP(cont + ".- [" + x + "][" + xx + "]");
  117.                     resp[cont][0] = x;
  118.                     resp[cont][1] = xx;
  119.                 }
  120.             }
  121.         }
  122.         int ver = -1;
  123.         do{
  124.             SOP("\nQue Posicion deceas?");
  125.             ver = leer.nextInt();
  126.         }while(ver <= 0 || ver > cont);
  127.         int [] devolver = { resp[ver][0], resp[ver][1] };
  128.         return devolver;
  129.     }
  130.    
  131.     public void SOP(String msj)
  132.     {
  133.         System.out.println(msj);
  134.     }
  135.  
  136. }

Principal.java
Código Javascript:
Ver original
  1. package TresEnRaya;
  2.  
  3. public class Principal
  4. {
  5.  
  6.     public static void main(String[] args)
  7.     {
  8.         TresRaya Juego = new TresRaya();
  9.         Juego.jugar();
  10.     }
  11.  
  12. }

Etiquetas: matriz, raya, string, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:31.