Ver Mensaje Individual
  #7 (permalink)  
Antiguo 05/12/2014, 22:38
Avatar de vangodp
vangodp
 
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Como hago el tablero de coordenadas en mi juego de c++

Código C++:
Ver original
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <sstream>
  4. #include <limits>
  5. #include <windows.h>
  6.  
  7. using namespace std;
  8. const int TAM = 7;    // <_ ¡¡¡si necesitas un tablero mayor o menor cambialo desde aqui!!! Pero no ponga mayor de 24
  9.  
  10. void imprimir( char (*tablero)[TAM+1] );
  11.  
  12. int main () {
  13.     system( "MODE CON cols=80 lines=40" ); // Pone la ventana del tamaño solicitado.
  14.     bool salir = false;  // condicion del GAMELOOP
  15.     int y;               // coordenada y va guardar letra.  Ejemplo A1...Guarda A
  16.     int x;               // coordenada x va guardar numero. Ejemplo A1...Guarda 1
  17.  
  18.     char tY;
  19.     string disparo;
  20.    
  21.     char tablero [TAM][TAM + 1] = {0};
  22.    
  23.     //Inicializa el tablero
  24.     for ( int i = 0; i < TAM; i++ ) {
  25.         for ( int j = 0; j < TAM; j++ ) {
  26.             tablero[i][j] = '-';
  27.         }
  28.        
  29.     }
  30.  
  31.     imprimir ( tablero );
  32.    
  33.     //GAMELOOP
  34.     while( !salir ){
  35.         //***ENTRADA***
  36.         std::cout << "Elija un sector. Ejemplo A1, C5, B2... Si elijes 2 ceros saliras del programa." << endl;
  37.         cin >> disparo;
  38.         std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // quita \n del buffer
  39.        
  40.         sscanf ( disparo.c_str() ,"%c%d",&tY,&x);
  41.         y = int ( tY )-64;
  42.  
  43.         //***LÓGICA***
  44.         if (x == -1 && y == -1){
  45.             salir = true;
  46.         }
  47.         //funciona correcto pero es desnecesaria. podemos solucionar eso mas arriba y precindir de restar 1 valor a x/y.
  48.         x--; // El rango de la matriz es de x0 a xTAM y 'A' a char(TAM-65). Si elijo una coordenada mayor estoy escribiendo en memoria que no me toca. Eso corrije el problema para que no pasemos de TAM
  49.         y--; //lo mismo XD
  50.         if (x < 0 && y < 0){
  51.             salir = true;
  52.         }
  53.         if ( ( x >= 0 && y  >= 0) && ( x < TAM && y < TAM )  ){// si no elejimos un rango x,y correcto no se hace asignaciones.
  54.             tablero[y][x] = '\x9D';        
  55.         }else{
  56.             if (x < 0 && y < 0){
  57.                 salir = true;
  58.             }else{
  59.                 system("cls");
  60.                 //si las coordenadas superan los marjenes del tablero avisamos.
  61.                 std::cout << "Has entrado con coordenadas no validas.\n\nEntre nuevamente con las coordenadas. Las coordenadas deben ser maximo: " <<  char(TAM+64) << TAM << std::endl << std::endl;
  62.                 system("pause");
  63.             }
  64.         }
  65.        
  66.        
  67.         //***SALIDA***  Aqui imprimimos los cambios
  68.             imprimir( tablero );
  69.     }
  70.    
  71.     //imprimimos el adios... ¿Obvio no? XDD
  72.     system("cls");
  73.     cout << "Adios" << endl;
  74.     cin.ignore();
  75.     return 0;
  76.  
  77.    
  78.     cin.ignore();
  79.     return 0;
  80. }
  81.  
  82. void imprimir( char (*tablero)[TAM+1] ){
  83.     system("cls");
  84.     std::stringstream ss;
  85.     int anchoLinea = 0;
  86.     string linea;
  87.        
  88.     //imprime 1º linea
  89.     std::cout << "  \xBA";
  90.    
  91.     for ( int i = 0; i < TAM; i++ ) {
  92.         if ( i < 10 )
  93.             ss << "  " << i + 1;
  94.         else
  95.             ss << " " << i + 1;        
  96.  
  97.     }
  98.    
  99.     std::cout << ss.str();
  100.     anchoLinea = ss.str().length();
  101.     std::cout << " \xBA" << std::endl;
  102.    
  103.     //imprime 2º linea
  104.     ss.str (std::string("")); //limpia ss
  105.     std::cout << "\xCD\xCD\xCE";
  106.     std::cout.width ( anchoLinea + 2 );
  107.     std::cout.fill ( 205 );
  108.     std::cout << "\xB9" << std::endl;
  109.    
  110.  
  111.    
  112.     //Esto imprime el tablero y lineas del lado derecho del tablero
  113.     for ( int i = 0; i < TAM; i++ ) {
  114.        
  115.         std::cout << char( i+65 )  << " \xBA ";               //imprime informacion coordenada y lineas del lado izquierdo
  116.        
  117.         for ( int z = 0; z < TAM; z++ ) {
  118.             std::cout << " " << tablero[i][z] << " ";
  119.  
  120.         }
  121.        
  122.         if ( TAM < 10 )
  123.             std::cout << "\xBA" << std::endl << "  \xBA";
  124.         else
  125.             std::cout << " \xBA" << std::endl << "  \xBA";
  126.         std::cout.width ( anchoLinea+2 );
  127.         std::cout.fill ( ' ' );
  128.         std::cout << " \xBA" << std::endl;
  129.     }
  130.    
  131.     //imprime linea de abajo
  132.     std::cout << "\xCD\xCD\xCA";
  133.     std::cout.width ( anchoLinea + 2 );
  134.     std::cout.fill ( 205 );    
  135.     std::cout << "\xBC" << std::endl << std::endl;
  136. }

Si lo que quieres es poner todo eso dentro de tu código pues declara esas variables:

Código C++:
Ver original
  1. std::stringstream ss;
  2. int anchoLinea = 0;
  3. string linea;

Y pega eso despues de crear el mapa
Código C++:
Ver original
  1. //imprime 1º linea
  2.     std::cout << "  \xBA";
  3.    
  4.     for ( int i = 0; i < TAM; i++ ) {
  5.         if ( i < 10 )
  6.             ss << "  " << i + 1;
  7.         else
  8.             ss << " " << i + 1;        
  9.  
  10.     }
  11.    
  12.     std::cout << ss.str();
  13.     anchoLinea = ss.str().length();
  14.     std::cout << " \xBA" << std::endl;
  15.    
  16.     //imprime 2º linea
  17.     ss.str (std::string("")); //limpia ss
  18.     std::cout << "\xCD\xCD\xCE";
  19.     std::cout.width ( anchoLinea + 2 );
  20.     std::cout.fill ( 205 );
  21.     std::cout << "\xB9" << std::endl;
  22.    
  23.  
  24.    
  25.     //Esto imprime el tablero y lineas del lado derecho del tablero
  26.     for ( int i = 0; i < TAM; i++ ) {
  27.        
  28.         std::cout << char( i+65 )  << " \xBA ";               //imprime informacion coordenada y lineas del lado izquierdo
  29.        
  30.         for ( int z = 0; z < TAM; z++ ) {
  31.             std::cout << " " << tablero[i][z] << " ";
  32.  
  33.         }
  34.        
  35.         if ( TAM < 10 )
  36.             std::cout << "\xBA" << std::endl << "  \xBA";
  37.         else
  38.             std::cout << " \xBA" << std::endl << "  \xBA";
  39.         std::cout.width ( anchoLinea+2 );
  40.         std::cout.fill ( ' ' );
  41.         std::cout << " \xBA" << std::endl;
  42.     }
  43.    
  44.     //imprime linea de abajo
  45.     std::cout << "\xCD\xCD\xCA";
  46.     std::cout.width ( anchoLinea + 2 );
  47.     std::cout.fill ( 205 );    
  48.     std::cout << "\xBC" << std::endl << std::endl;

Importante es que necesitas una variable global llamada TAM que sera una constante en el caso de usar la funcion. Si vas a pegar el código dentro del tuyo sin la funcion, entonces puede ser local mismo. Pero mejor que sea siempre constante const int TAM = 12.

No te olvides los headers
Estos pones si o si XD
#include <iostream>
#include <cstdlib>
#include <sstream>

//esto es para limpiar el buffer despues de leer con cin. Siempre queda el enter metido. Si vas a modelar tu el source puedes poner otra cosa o usarlo. Lo que te venga mejor ;)
#include <limits>

Si necesitas poner este lo pones pero si puedes evitar XD
#include <windows.h>

Bueno.. me piro jeje. El source si les buscar debe tener bugs a montones. Lo hice corriendo y no lo mire muy bien pero en donde lo probe funciona.
Busca poner tu juego dentro de un bucle. No usas gotos como he visto por algunos sources. No digo tuyos.



PD esto es lo que me has pedido.
Código C++:
Ver original
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <sstream>
  4. using namespace std;
  5.  
  6. int main () {
  7.     system ( "MODE CON cols=80 lines=40" ); // Pone la ventana del tamaño solicitado.
  8.     const int TAM = 7;    // <_ ¡¡¡si necesitas un tablero mayor o menor cambialo desde aqui!!! Pero no ponga mayor de 24
  9.  
  10.     //Variables que necesitas
  11.     std::stringstream ss;
  12.     int anchoLinea = 0;
  13.     string linea;
  14.    
  15.     //TABLERO DE X TAM
  16.     char tablero [TAM][TAM + 1] = {0};
  17.    
  18.     //Inicializa el tablero conforme el tamaño
  19.     for ( int i = 0; i < TAM; i++ ) {
  20.         for ( int j = 0; j < TAM; j++ ) {
  21.             tablero[i][j] = '-';
  22.         }
  23.        
  24.     }
  25.    
  26.     //Lo que esta dentro de este if es lo que carga el mapa
  27.     if ( true ) {
  28.         //imprime 1º linea
  29.         std::cout << "  \xBA";
  30.        
  31.         for ( int i = 0; i < TAM; i++ ) {
  32.             if ( i < 10 )
  33.                 ss << "  " << i + 1;
  34.             else
  35.                 ss << " " << i + 1;
  36.                
  37.         }
  38.        
  39.         std::cout << ss.str();
  40.         anchoLinea = ss.str().length();
  41.         std::cout << " \xBA" << std::endl;
  42.        
  43.         //imprime 2º linea
  44.         ss.str ( std::string ( "" ) ); //limpia ss
  45.         std::cout << "\xCD\xCD\xCE";
  46.         std::cout.width ( anchoLinea + 2 );
  47.         std::cout.fill ( 205 );
  48.         std::cout << "\xB9" << std::endl;
  49.        
  50.        
  51.        
  52.         //Esto imprime el tablero y lineas del lado derecho del tablero
  53.         for ( int i = 0; i < TAM; i++ ) {
  54.        
  55.             std::cout << char ( i + 65 )  << " \xBA ";            //imprime informacion coordenada y lineas del lado izquierdo
  56.            
  57.             for ( int z = 0; z < TAM; z++ ) {
  58.                 std::cout << " " << tablero[i][z] << " ";
  59.                
  60.             }
  61.            
  62.             if ( TAM < 10 )
  63.                 std::cout << "\xBA" << std::endl << "  \xBA";
  64.             else
  65.                 std::cout << " \xBA" << std::endl << "  \xBA";
  66.                
  67.             std::cout.width ( anchoLinea + 2 );
  68.             std::cout.fill ( ' ' );
  69.             std::cout << " \xBA" << std::endl;
  70.         }
  71.        
  72.         //imprime linea de abajo
  73.         std::cout << "\xCD\xCD\xCA";
  74.         std::cout.width ( anchoLinea + 2 );
  75.         std::cout.fill ( 205 );
  76.         std::cout << "\xBC" << std::endl << std::endl;
  77.     }//FIN
  78.    
  79.     cin.ignore();
  80.     return 0;
  81. }

Última edición por vangodp; 05/12/2014 a las 23:01