Fhernd icon

ajedrez.cpp

Fhernd | PRO | 11/27/18 03:05:40 PM UTC | 0 ⭐ | 1852 👁️ | Never ⏰ | []
Python |

9.1 KB

|

None

|

0 👍

/

0 👎

#include <iostream>
#include <graphics.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
 
using namespace std;
 
 
#define ROJO 1
#define VERDE 2
#define TRANSPARENTE 0
#define AMARILLA 9
#define BLANCA 10
 
#define TORRE 3
#define REY 4
#define CABALLO 5
#define PEON 6
#define REINA 7
 
#define DIMENSION_TABLERO 8
 
struct Celda {
    int x;
    int y;
    int tipo;
    int color;
};
 
Celda tablero[DIMENSION_TABLERO][DIMENSION_TABLERO];
 
const int VACIA = 0;
 
bool turnoUsuario = true;
bool fichaSeleccionada = false;
 
int xInicio;
int yInicio;
 
int xFin;
int yFin;
 
// Comprueba si es posible mover la ficha TORRE:
bool esPosibleMoverTorre(Celda ficha, int x, int y){
    bool movimientoPosible = false;
    
    cout << "OK" << endl;
    
    if (ficha.x > x && ficha.y == y){
        movimientoPosible = true;
    } else if (ficha.x == x && ficha.y < y){
        movimientoPosible = true;
    } else if (ficha.x < x && ficha.y == y){
        movimientoPosible = true;
    } else if (ficha.x == x && ficha.y > y){
        movimientoPosible = true;
    }
    
    cout << "PM: " << movimientoPosible << endl;
    
    if (movimientoPosible){
        if (ficha.x == 0 && ficha.y == 1){
            return (x == 0 && y == 0) || (x == 0 && y <= 4) || (x <= 2 && y == 1);
        } else if (ficha.x == 0 && ficha.y == 5){
            return (x == 0 && y >= 2) || (x == 0 && y == 6) || (x <= 7 && y == 5);
        } else {
            return false;
        }
    } else {
        return false;
    }
}
 
// Comprueba si es posible mover la ficha REY:
bool esPosibleMoverRey(Celda ficha, int x, int y){
    
    if (abs(ficha.x - x) == 1 && ficha.y == y){
        return true;
    }  else if (ficha.x == x && abs(ficha.y - y) == 1){
        return true;
    } else if (abs(ficha.x - x) == 1 && abs(ficha.y - y) == 1){
        return true;
    } else {
        return false;
    }
}
 
// Comprueba si es posible mover la ficha PEON:
bool esPosibleMoverPeon(Celda ficha, int x, int y){
    return ficha.x < x && abs(ficha.x - x) == 1 && ficha.y == y;
}
 
// Comprueba si es posible mover la ficha REINA:
bool esPosibleMoverReina(Celda ficha, int x, int y){
    if (ficha.x > x && ficha.y > y){
        return false;
    } else if (ficha.x > x && ficha.y == y){
        return true
    } else if ((abs(ficha.x - x) == 1 && abs(ficha.y - y) == 1) && ficha.x > x && ficha.y < y){ 
        return true
    } else if (ficha.x == x && ficha.y <= 7){
        return true;
    } else if ((x == 5 && y == 3) || (x == 6 && y == 4) || (x == 7 && y == 5)){ 
        return true;
    } else if (ficha.x <= 6 && ficha.y == y){
        return true;
    } else if ((x == 5 && y == 1) || (x == 6 && y == 0)){
        return true;
    } else if (ficha.x == x && (y >= 0 && y < ficha.y){
        return true;
    } else {
        return false;
    }
}
 
bool sePuedeRealizarMovimiento(Celda ficha, int x, int y){
    
    switch(ficha.tipo){
        case TORRE:
            return esPosibleMoverTorre(ficha, x, y);
            
        case REY:
            return esPosibleMoverRey(ficha, x, y);
            
        case PEON:
            return esPosibleMoverPeon(ficha, x, y);
            
        case REINA:
            return esPosibleMoverReina(ficha, x, y);
    }
    
    return false;
}
 
void click_handler(int x, int y)
{
    if ((x >= 120 && x <= 520) && (y >= 40 && y <= 440)){
        if(turnoUsuario){
            int posY = (x - 120) / 50;
            int posX = (y - 40) / 50;
            
            cout << "Pos X: " << posX << " Pos Y: " << posY << endl;
            
            if (tablero[posX][posY].tipo == VACIA && !fichaSeleccionada){
                return;
            } else if (tablero[posX][posY].color == AMARILLA || fichaSeleccionada) {
                if (!fichaSeleccionada){
                    fichaSeleccionada = true;
                    
                    xInicio = posX;
                    yInicio = posY;
                    
                    cout << tablero[posX][posY].tipo << endl;
                } else if (tablero[posX][posY].tipo == VACIA) {
                    
                    if (sePuedeRealizarMovimiento(tablero[xInicio][yInicio], posX, posY)){
                        turnoUsuario = false;
                        
                        
                        cout << "Yep" << endl;
                    } else {
                        fichaSeleccionada = false;
                        
                        cout << "Nop" << endl;
                    }
                }
            }
        }
    }
}
 
int main()
{
    initwindow(650, 500, "A");
    
    int dimension = 8;
    
    Celda celda;
    
    registermousehandler(WM_LBUTTONDOWN, click_handler);
    
    // Carga el tablero:
    for(int i = 0; i < DIMENSION_TABLERO; ++i){
        for(int j = 0; j < DIMENSION_TABLERO; ++j){
            celda.x = i;
            celda.y = j;
            
            if( ( i + j ) % 2 == 0 ){
                celda.color = ROJO;
            }
            else{
                celda.color = VERDE;
            }
            
            celda.tipo = VACIA;
            tablero[i][j] = celda;
        }
    }
    
    celda.x = 0;
    celda.y = 1;
    celda.color = AMARILLA;
    celda.tipo = TORRE;
    tablero[0][1] = celda;
    
    celda.x = 0;
    celda.y = 5;
    celda.color = AMARILLA;
    celda.tipo = TORRE;
    tablero[0][5] = celda;
    
    celda.x = 0;
    celda.y = 7;
    celda.color = AMARILLA;
    celda.tipo = REY;
    tablero[0][7] = celda;
    
    celda.x = 1;
    celda.y = 4;
    celda.color = BLANCA;
    celda.tipo = CABALLO;
    tablero[1][4] = celda;
    
    celda.x = 2;
    celda.y = 0;
    celda.color = AMARILLA;
    celda.tipo = PEON;
    tablero[2][0] = celda;
    
    celda.x = 2;
    celda.y = 3;
    celda.color = AMARILLA;
    celda.tipo = PEON;
    tablero[2][3] = celda;
    
    celda.x = 2;
    celda.y = 4;
    celda.color = AMARILLA;
    celda.tipo = PEON;
    tablero[2][4] = celda;
    
    celda.x = 3;
    celda.y = 1;
    celda.color = AMARILLA;
    celda.tipo = PEON;
    tablero[3][1] = celda;
    
    celda.x = 4;
    celda.y = 2;
    celda.color = AMARILLA;
    celda.tipo = REINA;
    tablero[4][2] = celda;
    
    celda.x = 4;
    celda.y = 4;
    celda.color = BLANCA;
    celda.tipo = REINA;
    tablero[4][4] = celda;
    
    celda.x = 6;
    celda.y = 0;
    celda.color = BLANCA;
    celda.tipo = PEON;
    tablero[6][0] = celda;
    
    celda.x = 6;
    celda.y = 1;
    celda.color = BLANCA;
    celda.tipo = PEON;
    tablero[6][1] = celda;
    
    celda.x = 6;
    celda.y = 2;
    celda.color = BLANCA;
    celda.tipo = PEON;
    tablero[6][2] = celda;
    
    celda.x = 7;
    celda.y = 2;
    celda.color = BLANCA;
    celda.tipo = REY;
    tablero[7][2] = celda;
    
    celda.x = 7;
    celda.y = 3;
    celda.color = BLANCA;
    celda.tipo = TORRE;
    tablero[7][3] = celda;
    
    int x;
    int y;
    int ancho = 50;
    int alto = 50;
    int color;
    
    y = 0;
    
    int i, j;
    
    rectangle( 120, 40, 120 + ( 50 * 8 ), 40 + ( 50 * 8 ));
    
    char columnas[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
    
    while(y < 210){
        
        if (i != 7){
            cleardevice();
        }
        
        for(i = 0 ; i < 8 ; i++ ) {
            for(j = 0 ; j < 8 ; j++ ) {
                
                if( ( i + j ) % 2 == 0 ){
                    setfillstyle(SOLID_FILL, RED);
                }
                else{
                    setfillstyle(SOLID_FILL, GREEN);
                }
                
                bar(120 + (j * alto), 40 + (i * ancho), 170 + (j * alto), 90 + (i * ancho));
            }
            
            char fila [10];
            sprintf(fila, "%d", (8 - i));
            outtextxy(95, 60 + (i * 50), fila);
            
            char columna [10];
            sprintf(columna, "%c", columnas[i]);
            outtextxy(140 + (i * 50), 450, columna);
        }
        
        setfillstyle(SOLID_FILL, YELLOW);
        // Torres amarillas:
        bar(180, 40, 185, 50);
        bar(193, 40, 198, 50);
        bar(205, 40, 210, 50);
        bar(120 + (1 * alto + 10), 40 + (0 * ancho + 10), 170 + (1 * alto - 10), 90 + (0 * ancho - 10));
        
        bar(380, 40, 385, 50);
        bar(393, 40, 398, 50);
        bar(405, 40, 410, 50);
        bar(120 + (5 * alto + 10), 40 + (0 * ancho + 10), 170 + (5 * alto - 10), 90 + (0 * ancho - 10));
        
        // Rey amarillo:
        setfillstyle(SOLID_FILL, YELLOW);
        setcolor(YELLOW);
        circle(135 + (7 * alto + 10), 55 + (0 * ancho + 10), 10);
        
        // Caballo blanco:
        setfillstyle(SOLID_FILL, WHITE);
        bar(355, 90, 360, 100);
        bar(120 + (4 * alto + 10), 40 + (1 * ancho + 10), 170 + (4 * alto - 10), 90 + (1 * ancho - 10));
        
        // Peones amarillos:
        setfillstyle(SOLID_FILL, YELLOW);
        bar(120 + (0 * alto + 10), 40 + (2 * ancho + 10), 170 + (0 * alto - 10), 90 + (2 * ancho - 10));
        bar(120 + (3 * alto + 10), 40 + (2 * ancho + 10), 170 + (3 * alto - 10), 90 + (2 * ancho - 10));
        bar(120 + (4 * alto + 10), 40 + (2 * ancho + 10), 170 + (4 * alto - 10), 90 + (2 * ancho - 10));
        bar(120 + (1 * alto + 10), 40 + (3 * ancho + 10), 170 + (1 * alto - 10), 90 + (3 * ancho - 10));
        
        // Reina amarilla:
        circle(110 + (2 * alto + 35), 50 + (4 * ancho), 10);
        bar(120 + (2 * alto + 10), 40 + (4 * ancho + 10), 170 + (2 * alto - 10), 90 + (4 * ancho - 10));
        
        // Reina blanca:
        setfillstyle(SOLID_FILL, WHITE);
        circle(210 + (2 * alto + 35), 50 + (4 * ancho), 10);
        bar(120 + (4 * alto + 10), 40 + (4 * ancho + 10), 170 + (4 * alto - 10), 90 + (4 * ancho - 10));
        
        // Peones blancos:
        bar(120 + (0 * alto + 10), 40 + (6 * ancho + 10), 170 + (0 * alto - 10), 90 + (6 * ancho - 10));
        bar(120 + (1 * alto + 10), 40 + (6 * ancho + 10), 170 + (1 * alto - 10), 90 + (6 * ancho - 10));
        bar(120 + (2 * alto + 10), 40 + (6 * ancho + 10), 170 + (2 * alto - 10), 90 + (6 * ancho - 10));
        
        // Rey blanco:
        setfillstyle(SOLID_FILL, WHITE);
        setcolor(WHITE);
        circle(135 + (2 * alto + 10), 53 + (7 * ancho + 10), 10);
        
        setfillstyle(SOLID_FILL, WHITE);
        rectangle(120, 40, 120 + (50 * 8), 40 + (50 * 8));
        
        bar(280, 390, 285, 400);
        bar(293, 390, 298, 400);
        bar(305, 390, 310, 400);
        bar(120 + (3 * alto + 10), 40 + (7 * ancho + 10), 170 + (3 * alto - 10), 90 + (7 * ancho - 10));
        
        y += 10;
    }
    
    y = 0;
    
    delay(300);
   
    getch();
    closegraph();
    return 0;
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎