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

[SOLUCIONADO] Como hago el tablero de coordenadas en mi juego de c++

Estas en el tema de Como hago el tablero de coordenadas en mi juego de c++ en el foro de C/C++ en Foros del Web. Hola, resulta que estoy haciendo un juego de batalla naval en c++ y me gustaría anexarle un tablero de la siguiente forma a mi juego: ...
  #1 (permalink)  
Antiguo 03/12/2014, 18:23
 
Fecha de Ingreso: diciembre-2014
Mensajes: 6
Antigüedad: 9 años, 4 meses
Puntos: 0
Pregunta Como hago el tablero de coordenadas en mi juego de c++

Hola, resulta que estoy haciendo un juego de batalla naval en c++ y me gustaría anexarle un tablero de la siguiente forma a mi juego:

http://www.mcihanozer.com/wp-content/uploads/fgs.png

mi tablero es igualito a este, solo le faltan las coordenadas de los números como se muestra la imagen. Alguien me ayudaría en como hacerla?

Gracias de antemano.
  #2 (permalink)  
Antiguo 03/12/2014, 21:20
Avatar de 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++

Compilalo y mire como funciona... trastealo para ver los cambios.
Al trabajar con esos tableros, les puedes embelleces con lineas y mas cosas segun la tabla asc2, y hasta colores si te propones.
Aprenda sobre gameloop ya que todo juego va sobre un gameloop
Suerte =)

Código C++:
Ver original
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4.  
  5. //funcion que imprime el mapa. Esta un poco turbinada pero es solo para que veas lo que puedes hacer aun que sea en asc2 XD
  6. void imprimir ( char (*tablero)[9] ) {
  7.     system("cls"); //borra tablero anterior
  8.    
  9.     //imprime informacion de coordenadas x y lineas de arriba del tablero
  10.     cout << "  \xBA x1 x2 x3 x4 x5 x6 x7 x8 \xBA" << endl;
  11.     cout << "\xCD\xCD\xCE";
  12.     for( int c = 0; c < 25; c++  ){
  13.         cout << "\xCD";
  14.     }
  15.     cout << "\xB9" << endl;
  16.    
  17.     //Esto imprime el tablero y lineas del lado derecho del tablero
  18.     for ( int i = 0; i < 8; i++ ) {
  19.         cout << "y" << i+1 << "\xBA ";               //imprime informacion coordenada y lineas del lado izquierdo
  20.         for ( int z = 0; z < 8; z++ ) {
  21.             cout << tablero[i][z] << "  ";
  22.         }
  23.         cout << "\xBA" <<endl << "  \xBA                         \xBA" << endl;//imprime lineas del lado derecho y izquierdo
  24.     }
  25.    
  26.     //imprime lineas de abajo del tablero y 2 espacios en el final
  27.     cout << "\xCD\xCD\xCA";
  28.     for( int c2 = 0; c2 < 25; c2++  ){
  29.         cout << "\xCD";
  30.     }
  31.     cout << "\xBC" << endl << endl;    
  32. }
  33.  
  34. int main () {
  35.     bool salir = false;  // condicion del GAMELOOP
  36.     int x;               // coordenada x
  37.     int y;               // coordenada y
  38.  
  39.     //tablero de 8 por 9. 9 por el '\0' de fin de linea "oculto". Le trato como 8 por 8. 8 Filas y 8 columnas
  40.     char tablero [8][9] = {
  41.         {"________"},
  42.         {"________"},
  43.         {"________"},
  44.         {"________"},
  45.         {"________"},
  46.         {"________"},
  47.         {"________"},
  48.         {"________"}
  49.        
  50.     };
  51.    
  52.     imprimir ( tablero );//cada vez que quiera imprimir mapa: LLamo la funcion imprimir y la paso la direccion de tablero.
  53.     //GAMELOOP
  54.     while( !salir ){
  55.         //***ENTRADA***   Aqui leemos datos
  56.         cout << "Elija una coordenada de X1 a x9" << endl;  
  57.         cin >> x;
  58.         cout << "Elija una coordenada de Y1 a y9" << endl;  
  59.         cin >> y;    
  60.    
  61.         //***LÓGICA***  Aqui hacemos calculos del juego segun lo que se recebio en la entrada
  62.         if (x == 0 || y == 0){
  63.             salir = true;
  64.         }
  65.         x--; // El rango de la matriz es de x0 a x7. Si elijo coordenada x8 quiero elejir x7 por que 7 es el limite de la matriz y no 8. x-- corrije este erro.
  66.         y--; //lo mismo XD
  67.         if ( x >= 0 && y  >= 0 || x <= 7 && y <= 7 )// si no elejimos un rango x,y correcto no se hace asignaciones.
  68.                 tablero[y][x] = '\x9D';
  69.        
  70.         //***SALIDA***  Aqui imprimimos los cambios
  71.             imprimir ( tablero );
  72.     }
  73.    
  74.     //imprimimos el adios... ¿Obvio no? XDD
  75.     system("cls");
  76.     cout << "Adios" << endl;
  77.     cin.ignore();
  78.     return 0;
  79. }

Si algun dia te das el salto a los 2d aqui tienes buenos tutoriales: http://www.losersjuegos.com.ar/referencia/articulos

Última edición por vangodp; 03/12/2014 a las 21:37
  #3 (permalink)  
Antiguo 05/12/2014, 13:01
 
Fecha de Ingreso: diciembre-2014
Mensajes: 6
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: Como hago el tablero de coordenadas en mi juego de c++

hola, pues estuve mirando tu código y no logro entender como fusionarlo con mi codigo :(

yo no estoy usando voids pero estoy construyendo al matriz de la siguiente forma en el main.

char jugador [ancho][alto];

for(int i=0; i < alto; i++)
{
for( int j=0; j < ancho; j++)
{
jugador[i][j]='-';
}

}


como haría para que puediese trazar esas coordenadas de la imagen?
  #4 (permalink)  
Antiguo 05/12/2014, 15:41
Avatar de 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++

ponga su código aqui y te lo adapto. ;)
  #5 (permalink)  
Antiguo 05/12/2014, 15:41
 
Fecha de Ingreso: diciembre-2014
Mensajes: 6
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: Como hago el tablero de coordenadas en mi juego de c++

Muchas gracias después de darle tantas vueltas lo he logrado implementar! te lo agradezco!!
  #6 (permalink)  
Antiguo 05/12/2014, 16:00
 
Fecha de Ingreso: diciembre-2014
Mensajes: 6
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: Como hago el tablero de coordenadas en mi juego de c++

Cita:
Iniciado por vangodp Ver Mensaje
ponga su código aqui y te lo adapto. ;)

disculpa, un ultimo favor xD podrías arreglar cuando el tamaño de la matriz es por ejemplo 15x15? es que se corre la matriz y esa no es la idea hehe aquí está el código que modifiqué.

#include <iostream>
#include <cstdlib>
using namespace std;







int main () {

char tablero [15][15];

for(int i=0; i < 15; i++)
{
for( int j=0; j < 15; j++)
{
tablero[i][j]='-';
}

}
cout<<" ";
for(int i=0; i < 15; i++)
{

cout <<" "<< " " << i+1;
}
cout<<"\n";




//Esto imprime el tablero y lineas del lado derecho del tablero
for ( int i = 0; i < 15; i++ ) {
cout << " " << i+1 << " "; //imprime informacion coordenada y lineas del lado izquierdo
for ( int z = 0; z < 15; z++ ) {
cout <<tablero[i][z] << " ";
}
cout << " " <<endl;//imprime lineas del lado derecho y izquierdo
}




cin.ignore();
return 0;
}
  #7 (permalink)  
Antiguo 05/12/2014, 22:38
Avatar de 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
  #8 (permalink)  
Antiguo 06/12/2014, 12:53
 
Fecha de Ingreso: diciembre-2014
Mensajes: 6
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: Como hago el tablero de coordenadas en mi juego de c++

wow me funcionó de maravilla, ahora si mi proyecto está completo, de verdad muchas gracias por la ayuda!!
  #9 (permalink)  
Antiguo 06/12/2014, 12:58
Avatar de 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++

De nada XD
Te dire una cosa... Eso es casi mas dificil que hacerlo de forma grafica con una libreria como miniwin por ejemplo o SFML XDD


Etiquetas: c++, matriz
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 05:19.