Aprender C: desarrollando un juego de ajedrez (II)

En el anterior post comenté que el tablero es un array de punteros a una variable de tipo pieza. En un principio pensé en crear una variable para cada pieza del juego, pero enseguida deseché la idea. ¿Qué valor me aporta una pieza por sí sola, sin estar situada en una casilla de un tablero? Un array de punteros me facilita la vida; si el puntero apunta a NULL entonces puedo considerar que la casilla está vacía. De lo contrario, si apunta a una variable de tipo pieza, sé que una pieza de ese tipo ocupa esa casilla, que es al final de cuentas lo que a mí me interesa. Además, de esta forma sólo necesito crear una variable por cada tipo de pieza y color; un único peón blanco, un único peón negro, un caballo blanco, etc. La declaración de variables e inicialización es como sigue:

tPiece  pb, pn, tb, tn, cb, cn, ab, an, rb, rn, reyb, reyn;

void initPieces() {
    
    pb.color = tb.color = cb.color= ab.color= rb.color= reyb.color=WHITE;
    pn.color= tn.color = cn.color= an.color= rn.color= reyn.color=BLACK;
    pb.rol= pn.rol=PAWN;
    tb.rol= tn.rol = ROOK;
    cb.rol= cn.rol=KNIGHT;
    ab.rol= an.rol=BISHOP;
    rb.rol= rn.rol=QUEEN;
    reyn.rol= reyb.rol= KING;
    
}

Estas variables y procedimiento yo los he incluído en ficheros aparte llamado pieces.h y pieces.c.

Las piezas están declaradas como variables globales; esto no es especialmente elegante, pero sí efectivo.

El tablero también debe ser iniciado al principio de la ejecución del programa, puesto que un puntero declarado pero no inicializado apunta a direcciones aleatorias de memoria – y aunque probablemente el sistema operativo no nos permitiría andar modificando contenido aleatorio de nuestra memoria, es una buena práctica inicializar los punteros.

void initBoard(tPiece* t[][8], int alto, int ancho) {

    int i,j;
    for( i = 0; i < ancho; i++ ) {
        for( j = 0; j < alto; j++ ) {
            t[i][j] = NULL;
        }
    }
    
}

Bien, pues con esto ya tenemos nuestro tablero y piezas listos para ser usados.

Advertisements
Aprender C: desarrollando un juego de ajedrez (II)

Aprendiendo C: desarrollando un juego de ajedrez

Como he decidido finalmente orientar mi carrera profesional a la industria del entretenimiento digital, y salí de la universidad con conocimientos de C muy bajos, he tomado la determinación de programar un juego de ajedrez en C para aprender (parte de) ese lenguaje.

Sin más dilación, hoy explicaré los tipos y estructuras de datos usadas.

Una pieza de ajedrez es un elemento del que (por el momento) nos interesa abstraer dos características: color y papel que juega. Mi declaración es la siguiente:

typedef struct {
   tColor color;
   tRol rol;
 } tPiece;

Tanto tColor como tRol son enumeraciones. En C una enumeración es un conjunto de elementos nombrados por el programador a los que el compilador asigna un valor en función de su orden. De esta manera,

typedef enum {WHITE, BLACK} tColor;
typedef enum {PAWN,ROOK, KNIGHT, BISHOP, QUEEN, KING} tRol;

A la hora de compilar, WHITE será sustituido por el valor 0, BLACK por 1. De igual modo, PAWN 0, ROOK 1, KNIGHT 2, etc.

Finalmente, el tablero es un array de 8×8. Ojo, es un array DE PUNTEROS a una variable de tipo tPiece:

tPiece* t[8][8];

Al por qué considero que debe ser un array de punteros, daré explicación en el siguiente post.

Aprendiendo C: desarrollando un juego de ajedrez