12 static const uint8 SquareFrom64[64] = {
\r
13 A1, B1, C1, D1, E1, F1, G1, H1,
\r
14 A2, B2, C2, D2, E2, F2, G2, H2,
\r
15 A3, B3, C3, D3, E3, F3, G3, H3,
\r
16 A4, B4, C4, D4, E4, F4, G4, H4,
\r
17 A5, B5, C5, D5, E5, F5, G5, H5,
\r
18 A6, B6, C6, D6, E6, F6, G6, H6,
\r
19 A7, B7, C7, D7, E7, F7, G7, H7,
\r
20 A8, B8, C8, D8, E8, F8, G8, H8,
\r
25 static sint8 SquareTo64[SquareNb];
\r
31 void square_init() {
\r
35 for (sq = 0; sq < SquareNb; sq++) SquareTo64[sq] = -1;
\r
37 for (sq = 0; sq < 64; sq++) {
\r
38 SquareTo64[SquareFrom64[sq]] = sq;
\r
44 bool square_is_ok(int square) {
\r
46 if (square < 0 || square >= SquareNb) return false;
\r
48 if (SquareTo64[square] < 0) return false;
\r
55 int square_make(int file, int rank) {
\r
59 ASSERT(file>=0&&file<8);
\r
60 ASSERT(rank>=0&&rank<8);
\r
62 sq_64 = (rank << 3) | file;
\r
64 return square_from_64(sq_64);
\r
69 int square_file(int square) {
\r
73 ASSERT(square_is_ok(square));
\r
75 file = (square - 4) & 7;
\r
76 ASSERT(file==(square_to_64(square)&7));
\r
83 int square_rank(int square) {
\r
87 ASSERT(square_is_ok(square));
\r
89 rank = (square >> 4) - 2;
\r
90 ASSERT(rank==square_to_64(square)>>3);
\r
95 // square_side_rank()
\r
97 int square_side_rank(int square, int colour) {
\r
101 ASSERT(square_is_ok(square));
\r
102 ASSERT(colour_is_ok(colour));
\r
104 rank = square_rank(square);
\r
105 if (colour_is_black(colour)) rank = 7-rank;
\r
110 // square_from_64()
\r
112 int square_from_64(int square) {
\r
114 ASSERT(square>=0&&square<64);
\r
116 return SquareFrom64[square];
\r
121 int square_to_64(int square) {
\r
123 ASSERT(square_is_ok(square));
\r
125 return SquareTo64[square];
\r
128 // square_is_promote()
\r
130 bool square_is_promote(int square) {
\r
134 ASSERT(square_is_ok(square));
\r
136 rank = square_rank(square);
\r
138 return rank == Rank1 || rank == Rank8;
\r
141 // square_ep_dual()
\r
143 int square_ep_dual(int square) {
\r
145 ASSERT(square_is_ok(square));
\r
146 ASSERT(square_rank(square)>=2&&square_rank(square)<=5);
\r
148 return square ^ 16;
\r
153 int square_colour(int square) {
\r
155 ASSERT(square_is_ok(square));
\r
157 return (square ^ (square >> 4)) & 1;
\r
160 // file_from_char()
\r
162 int file_from_char(int c) {
\r
164 ASSERT(c>='a'&&c<='h');
\r
169 // rank_from_char()
\r
171 int rank_from_char(int c) {
\r
173 ASSERT(c>='1'&&c<='8');
\r
180 int file_to_char(int file) {
\r
182 ASSERT(file>=0&&file<8);
\r
189 int rank_to_char(int rank) {
\r
191 ASSERT(rank>=0&&rank<8);
\r
198 bool char_is_file(int c) {
\r
200 return c >= 'a' && c <= 'h';
\r
205 bool char_is_rank(int c) {
\r
207 return c >= '1' && c <= '8';
\r
210 // square_to_string()
\r
212 bool square_to_string(int square, char string[], int size) {
\r
214 ASSERT(square_is_ok(square));
\r
215 ASSERT(string!=NULL);
\r
218 if (size < 3) return false;
\r
220 string[0] = 'a' + square_file(square);
\r
221 string[1] = '1' + square_rank(square);
\r
227 // square_from_string()
\r
229 int square_from_string(const char string[]) {
\r
233 ASSERT(string!=NULL);
\r
235 if (string[0] < 'a' || string[0] > 'h') return SquareNone;
\r
236 if (string[1] < '1' || string[1] > '8') return SquareNone;
\r
237 if (string[2] != '\0') return SquareNone;
\r
239 file = file_from_char(string[0]);
\r
240 rank = rank_from_char(string[1]);
\r
242 return square_make(file,rank);
\r
245 // end of square.cpp
\r