summaryrefslogtreecommitdiff
path: root/include/bitboard.h
blob: b1ddcf01d83000c0bca566712106840f6360743e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#ifndef BITBOARD_H
#define BITBOARD_H

#include "ints.h"
#include <stdbool.h>

typedef u64 bitboard_t;

enum {
  WHITE_KING,
  WHITE_QUEEN,
  WHITE_ROOK,
  WHITE_BISHOP,
  WHITE_KNIGHT,
  WHITE_PAWN,
  BLACK_KING,
  BLACK_QUEEN,
  BLACK_ROOK,
  BLACK_BISHOP,
  BLACK_KNIGHT,
  BLACK_PAWN,
  PIECE_TYPE_COUNT,
};

enum {
  WHITE_SHORT_CASTLE  =  1  <<  0,
  WHITE_LONG_CASTLE   =  1  <<  1,
  BLACK_SHORT_CASTLE  =  1  <<  2,
  BLACK_LONG_CASTLE   =  1  <<  3,
  CASTLE_COUNT = 4,
};

enum {
  WHITE_TURN,
  BLACK_TURN,
  TURN_COUNT,
};

#define BITMASK_RANK_1 255ULL
#define BITMASK_RANK_2 65280ULL
#define BITMASK_RANK_3 16711680ULL
#define BITMASK_RANK_4 4278190080ULL
#define BITMASK_RANK_5 1095216660480ULL
#define BITMASK_RANK_6 280375465082880ULL
#define BITMASK_RANK_7 71776119061217280ULL
#define BITMASK_RANK_8 18374686479671623680ULL
#define BITMASK_FILE_A 72340172838076673ULL
#define BITMASK_FILE_B 144680345676153346ULL
#define BITMASK_FILE_C 289360691352306692ULL
#define BITMASK_FILE_D 578721382704613384ULL
#define BITMASK_FILE_E 1157442765409226768ULL
#define BITMASK_FILE_F 2314885530818453536ULL
#define BITMASK_FILE_G 4629771061636907072ULL
#define BITMASK_FILE_H 9259542123273814144ULL

#define occupied_by(bitboard, index) (bitboard & ((bitboard_t)1 << index))

typedef struct {
  bitboard_t bitboards[PIECE_TYPE_COUNT];
  u8 castling;
  u8 turn;
  u8 passantable_file;
  u16 halfmove_clock;
  u16 fullmove_clock;
} position_t;

position_t position_starting();
void assert_valid_position(position_t position);
bool check_valid_position(position_t position);
#define whites(position) \
    position.bitboards[WHITE_KING] | \
    position.bitboards[WHITE_QUEEN] | \
    position.bitboards[WHITE_ROOK] | \
    position.bitboards[WHITE_BISHOP] | \
    position.bitboards[WHITE_KNIGHT] | \
    position.bitboards[WHITE_PAWN]

#define blacks(position) \
    position.bitboards[BLACK_KING] | \
    position.bitboards[BLACK_QUEEN] | \
    position.bitboards[BLACK_ROOK] | \
    position.bitboards[BLACK_BISHOP] | \
    position.bitboards[BLACK_KNIGHT] | \
    position.bitboards[BLACK_PAWN]


void print_position(position_t position);
void print_bitboard(bitboard_t bitboard);

#endif // BITBOARD_H