Juego de Ajedrez en Visual C++

Por:ivancp, enviado 14 mar 2004

Dibujar las piezas

Buscando en la red pude encontrar una imagen con todas las piezas de ajedrez que vamos a necesitar. Si ustedes encuentran algún juego de imágenes mejorado pueden utilizarlo y seguir los mismos pasos.
Les recomiendo que utilicen la opción Imagen -> Configuración de cuadrícula, para que pueda aparecer una cuadricula de 60x60 que va a facilitarles la ubicación de cada imagen. Las imágenes las guardaremos en los recursos con el id IDB_PIEZAS, deben modificar las propiedades de la imagen para que pueda ser guardada con “color verdadero”.

ajedrez-16.jpg
Imagen 9: Imagen con las piezas de ajedrez

Si han podido notar, aun no creamos la matriz conde vamos a almacenar cada pieza de ajedrez, esta matriz no necesita ser muy compleja, solo necesitamos un arreglo de dos dimensiones de tipo entero.

Code: Seleccionar todo
  1. int m_pCeldas[8][8];

  2. CImageList m_imgPiezas;

  3.  



Cada pieza de ajedrez será identificada según su posición en la imagen, por ejemplo las posiciones 0 ,1 y 2 corresponden a las piezas: reina negra, reina blanca, y rey negro respectivamente (Ver imagen 9), para facilitarnos las cosas definiremos los siguientes valores:

Code: Seleccionar todo
  1. #define VACIO -1

  2. #define PEONB 11

  3. #define PEONN 10

  4. #define ALFILB 7

  5. #define ALFILN 6

  6. #define CABALLOB 9

  7. #define CABALLON 8

  8. #define REYB 1

  9. #define REYN 0

  10. #define REINAB 3

  11. #define REINAN 2

  12. #define TORREB 5

  13. #define TORREN 4


La terminación de cada definición anterior corresponde a la primera letra del color al que corresponde.

Para inicializar todos los valores en el arreglo m_pCeldas debemos crear una función que llamaremos InicializarTablero.

Code: Seleccionar todo
  1. // Situa todas las piezas en su lugar

  2. void CAjedrezView::InicializarTablero(void)

  3. {

  4.     //Inicializacion de celdas

  5.     for(int i = 0 ; i < 8 ;i++)

  6.         for(int j = 0 ; j < 8 ; j++)

  7.             m_pCeldas[i][j] = VACIO;

  8.  

  9.     m_pCeldas[0][0] = TORREN;

  10.     m_pCeldas[0][1] = CABALLON;

  11.     m_pCeldas[0][2] = ALFILN;

  12.     m_pCeldas[0][3] = REINAN;

  13.     m_pCeldas[0][4] = REYN;

  14.     m_pCeldas[0][5] = ALFILN;

  15.     m_pCeldas[0][6] = CABALLON;

  16.     m_pCeldas[0][7] = TORREN;

  17.  

  18.     m_pCeldas[7][0] = TORREB;

  19.     m_pCeldas[7][1] = CABALLOB;

  20.     m_pCeldas[7][2] = ALFILB;

  21.     m_pCeldas[7][3] = REINAB;

  22.     m_pCeldas[7][4] = REYB;

  23.     m_pCeldas[7][5] = ALFILB;

  24.     m_pCeldas[7][6] = CABALLOB;

  25.     m_pCeldas[7][7] = TORREB;

  26.  

  27.     m_pCeldas[1][0] = PEONN;

  28.     m_pCeldas[1][1] = PEONN;

  29.     m_pCeldas[1][2] = PEONN;

  30.     m_pCeldas[1][3] = PEONN;

  31.     m_pCeldas[1][4] = PEONN;

  32.     m_pCeldas[1][5] = PEONN;

  33.     m_pCeldas[1][6] = PEONN;

  34.     m_pCeldas[1][7] = PEONN;

  35.  

  36.     m_pCeldas[6][0] = PEONB;

  37.     m_pCeldas[6][1] = PEONB;

  38.     m_pCeldas[6][2] = PEONB;

  39.     m_pCeldas[6][3] = PEONB;

  40.     m_pCeldas[6][4] = PEONB;

  41.     m_pCeldas[6][5] = PEONB;

  42.     m_pCeldas[6][6] = PEONB;

  43.     m_pCeldas[6][7] = PEONB;

  44. }


La variable m_imgPiezas es donde cargaremos las imágenes, utilizaremos las funciones de la clase CImageList para extraer imágenes individuales al momento de pintar. En el constructor de la clase CAjedrezView debemos inicializar las imágenes para tenerlas disponibles en todo momento.

Code: Seleccionar todo
  1. CAjedrezView::CAjedrezView()

  2. {

  3.     m_imgPiezas.Create(IDB_PIEZAS,TAMCELDA,0,RGB(255,0,255));

  4.  

  5.     InicializarTablero();

  6. }



Finalmente para que podamos ver cada pieza en el tablero tenemos que agregar las siguientes líneas a la función DibujarTablero:

Code: Seleccionar todo
  1. void CAjedrezView::DibujarTablero(CDC* pDC)

  2. {

  3.     ...

  4.  

  5.     for(int i = 0 ; i < CELDAS ; i++)

  6.     {

  7.         for(int j = 0 ; j < CELDAS ; j++)

  8.         {

  9.             ...

  10.  

  11.             if(m_pCeldas[i][j] >= 0)

  12.             {

  13.                 POINT p;

  14.                 p.x = rcCelda.left;

  15.                 p.y = rcCelda.top;

  16.                 SIZE s;

  17.                 s.cx = s.cy = 60;

  18.  

  19.                 m_imgPiezas.DrawEx( pDC, m_pCeldas[i][j],

  20.                     p,s,RGB(255,0,255),0,ILD_TRANSPARENT);

  21.             }

  22.  

  23.             ...

  24.         }

  25.     }

  26.     ...

  27. }



Luego de seguir todos estos pasos, al compilar se podrá observar las piezas inicializadas en su lugar tal como se muestra en la imagen 10.

ajedrez-17.jpg
Imagen 10: Tablero de ajedrez con sus piezas

Ahora solo falta modificar las propiedades de la ventana para que pueda tener un tamaño fijo también debemos modificar algunas propiedades más para evitar que al usuario pueda cambiar el tamaño de la ventana.

Para ello debemos ir a la clase CMainFrame a las funciones PreCreateWindow y OnCreate, y agregar las líneas siguientes:

Code: Seleccionar todo
  1. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

  2. {

  3.     if (CFrameWnd::OnCreate(lpCreateStruct) == -1)

  4.         return -1;

  5.  

  6.     //Asignar las dimensiones

  7.     MoveWindow(0,0,60*9,60*10,FALSE);

  8.     CenterWindow();

  9.    

  10.     if (!m_wndStatusBar.Create(this) ||

  11.         !m_wndStatusBar.SetIndicators(indicators,

  12.           sizeof(indicators)/sizeof(UINT)))

  13.     {

  14.         TRACE0("No se pudo crear la barra de estado ");

  15.         return -1;

  16.     }

  17.  

  18.     return 0;

  19. }


Si no lo han notado aun, también he borrado las líneas que corresponden a la creación de la barra de herramientas que no vamos a necesitar en adelante.

Al compilar nuestro proyecto en este punto podremos el siguiente resultado:
ajedrez-18.jpg
Imagen 11: Tablero del juego de ajedréz

Archivos Adjuntos

  • Ajedrez.zip 84,86 KiB
    Código fuente Ajedréz Visual C++ 2005

Otros Artículos en esta sección

  • Separador de controles para formularios MFC
    Es un control que nos permite mantener ordenado nuestros diálogos mediante lineas divisoras. No hay una variedad de controles para diálogos MFC, pero con esto puedes poner la diferencia.
    Por: ivancp, 2004-09-20
  • Graficador de Funciones 2D y 3D
    He aquí un programa que grafica todo tipo de funciones gracias a su interprete que utiliza un Analizador Léxico, Analizador Sintáctico, y un Analizador semántico.
    Por: Lizardo, 2004-03-14
  • Acceso a MySQL desde Visual C++
    El articulo muestra como utilizar MYSQL API para el acceso a bases de datos MySQL utilizando Visual C++ y MFC.
    Por: ivancp, 2004-03-14
¿Alguna duda? Sientete libre de hacer tus pruntas en nuestro:
foro de Visual C++ »