chess-legal-moves
Version:
Analyses a given chess game position in Fen notation to return legal moves and provides the next game position after a given move
549 lines (548 loc) • 15.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.RAYS = void 0;
var BitBoard_1 = require("../../BitBoard/BitBoard");
/*********************************
* *
* 8 56 57 58 59 60 61 62 63 *
* 7 48 49 50 51 52 53 54 55 *
* 6 40 41 42 43 44 45 46 47 *
* 5 32 33 34 35 36 37 38 39 *
* 4 24 25 26 27 28 29 30 31 *
* 3 16 17 18 19 20 21 22 23 *
* 2 08 09 10 11 12 13 14 15 *
* 1 00 01 02 03 04 05 06 07 *
* A B C D E F G H *
* *
********************************/
function generateFilePositions(fileIndex) {
var file = [];
for (var rankIndex = 0; rankIndex < 8; rankIndex++) {
file.push(rankIndex * 8 + fileIndex);
}
return file;
}
function generateRankPositions(rankIndex) {
var rank = [];
for (var fileIndex = 0; fileIndex < 8; fileIndex++) {
rank.push(rankIndex + fileIndex);
}
return rank;
}
exports.RAYS = {
NULL: new BitBoard_1.default(0, 0),
// @TODO use those FILES to generate other rays
A_FILE: BitBoard_1.default.fromPositions(generateFilePositions(0)),
B_FILE: BitBoard_1.default.fromPositions(generateFilePositions(1)),
C_FILE: BitBoard_1.default.fromPositions(generateFilePositions(2)),
D_FILE: BitBoard_1.default.fromPositions(generateFilePositions(3)),
E_FILE: BitBoard_1.default.fromPositions(generateFilePositions(4)),
F_FILE: BitBoard_1.default.fromPositions(generateFilePositions(5)),
G_FILE: BitBoard_1.default.fromPositions(generateFilePositions(6)),
H_FILE: BitBoard_1.default.fromPositions(generateFilePositions(7)),
// @TODO use those RANKS to generate other rays
ONE_RANK: BitBoard_1.default.fromPositions(generateRankPositions(0)),
TWO_RANK: BitBoard_1.default.fromPositions(generateRankPositions(1)),
THREE_RANK: BitBoard_1.default.fromPositions(generateRankPositions(2)),
FOUR_RANK: BitBoard_1.default.fromPositions(generateRankPositions(3)),
FIVE_RANK: BitBoard_1.default.fromPositions(generateRankPositions(4)),
SIX_RANK: BitBoard_1.default.fromPositions(generateRankPositions(5)),
SEVEN_RANK: BitBoard_1.default.fromPositions(generateRankPositions(6)),
EIGHT_RANK: BitBoard_1.default.fromPositions(generateRankPositions(7)),
// North
A2_A8: BitBoard_1.default.fromPositions([8, 16, 24, 32, 40, 48, 56]),
A3_A8: BitBoard_1.default.fromPositions([16, 24, 32, 40, 48, 56]),
A4_A8: BitBoard_1.default.fromPositions([24, 32, 40, 48, 56]),
A5_A8: BitBoard_1.default.fromPositions([32, 40, 48, 56]),
A6_A8: BitBoard_1.default.fromPositions([40, 48, 56]),
A7_A8: BitBoard_1.default.fromPositions([48, 56]),
A8: BitBoard_1.default.fromPos(56),
B2_B8: BitBoard_1.default.fromPositions([
8 + 1,
16 + 1,
24 + 1,
32 + 1,
40 + 1,
48 + 1,
56 + 1,
]),
C2_C8: BitBoard_1.default.fromPositions([
8 + 2,
16 + 2,
24 + 2,
32 + 2,
40 + 2,
48 + 2,
56 + 2,
]),
D2_D8: BitBoard_1.default.fromPositions([
8 + 3,
16 + 3,
24 + 3,
32 + 3,
40 + 3,
48 + 3,
56 + 3,
]),
E2_E8: BitBoard_1.default.fromPositions([
8 + 4,
16 + 4,
24 + 4,
32 + 4,
40 + 4,
48 + 4,
56 + 4,
]),
F2_F8: BitBoard_1.default.fromPositions([
8 + 5,
16 + 5,
24 + 5,
32 + 5,
40 + 5,
48 + 5,
56 + 5,
]),
G2_G8: BitBoard_1.default.fromPositions([
8 + 6,
16 + 6,
24 + 6,
32 + 6,
40 + 6,
48 + 6,
56 + 6,
]),
H2_H8: BitBoard_1.default.fromPositions([
8 + 7,
16 + 7,
24 + 7,
32 + 7,
40 + 7,
48 + 7,
56 + 7,
]),
H3_H8: BitBoard_1.default.fromPositions([
16 + 7,
24 + 7,
32 + 7,
40 + 7,
48 + 7,
56 + 7,
]),
H4_H8: BitBoard_1.default.fromPositions([24 + 7, 32 + 7, 40 + 7, 48 + 7, 56 + 7]),
H5_H8: BitBoard_1.default.fromPositions([32 + 7, 40 + 7, 48 + 7, 56 + 7]),
H6_H8: BitBoard_1.default.fromPositions([40 + 7, 48 + 7, 56 + 7]),
H7_H8: BitBoard_1.default.fromPositions([48 + 7, 56 + 7]),
H8: BitBoard_1.default.fromPos(63),
// South
H7_H1: BitBoard_1.default.fromPositions([55, 47, 39, 31, 23, 15, 7]),
H6_H1: BitBoard_1.default.fromPositions([47, 39, 31, 23, 15, 7]),
H5_H1: BitBoard_1.default.fromPositions([39, 31, 23, 15, 7]),
H4_H1: BitBoard_1.default.fromPositions([31, 23, 15, 7]),
H3_H1: BitBoard_1.default.fromPositions([23, 15, 7]),
H2_H1: BitBoard_1.default.fromPositions([15, 7]),
H1: BitBoard_1.default.fromPos(7),
G7_G1: BitBoard_1.default.fromPositions([
55 - 1,
47 - 1,
39 - 1,
31 - 1,
23 - 1,
15 - 1,
7 - 1,
]),
F7_F1: BitBoard_1.default.fromPositions([
55 - 2,
47 - 2,
39 - 2,
31 - 2,
23 - 2,
15 - 2,
7 - 2,
]),
E7_E1: BitBoard_1.default.fromPositions([
55 - 3,
47 - 3,
39 - 3,
31 - 3,
23 - 3,
15 - 3,
7 - 3,
]),
D7_D1: BitBoard_1.default.fromPositions([
55 - 4,
47 - 4,
39 - 4,
31 - 4,
23 - 4,
15 - 4,
7 - 4,
]),
C7_C1: BitBoard_1.default.fromPositions([
55 - 5,
47 - 5,
39 - 5,
31 - 5,
23 - 5,
15 - 5,
7 - 5,
]),
B7_B1: BitBoard_1.default.fromPositions([
55 - 6,
47 - 6,
39 - 6,
31 - 6,
23 - 6,
15 - 6,
7 - 6,
]),
A7_A1: BitBoard_1.default.fromPositions([
55 - 7,
47 - 7,
39 - 7,
31 - 7,
23 - 7,
15 - 7,
7 - 7,
]),
A6_A1: BitBoard_1.default.fromPositions([40, 32, 24, 16, 8, 0]),
A5_A1: BitBoard_1.default.fromPositions([32, 24, 16, 8, 0]),
A4_A1: BitBoard_1.default.fromPositions([24, 16, 8, 0]),
A3_A1: BitBoard_1.default.fromPositions([16, 8, 0]),
A2_A1: BitBoard_1.default.fromPositions([8, 0]),
A1: BitBoard_1.default.fromPos(0),
// East
B1_H1: BitBoard_1.default.fromPositions([1, 2, 3, 4, 5, 6, 7]),
C1_H1: BitBoard_1.default.fromPositions([2, 3, 4, 5, 6, 7]),
D1_H1: BitBoard_1.default.fromPositions([3, 4, 5, 6, 7]),
E1_H1: BitBoard_1.default.fromPositions([4, 5, 6, 7]),
F1_H1: BitBoard_1.default.fromPositions([5, 6, 7]),
G1_H1: BitBoard_1.default.fromPositions([6, 7]),
B2_H2: BitBoard_1.default.fromPositions([9, 10, 11, 12, 13, 14, 15]),
B3_H3: BitBoard_1.default.fromPositions([
1 + 8 * 2,
2 + 8 * 2,
3 + 8 * 2,
4 + 8 * 2,
5 + 8 * 2,
6 + 8 * 2,
7 + 8 * 2,
]),
B4_H4: BitBoard_1.default.fromPositions([
1 + 8 * 3,
2 + 8 * 3,
3 + 8 * 3,
4 + 8 * 3,
5 + 8 * 3,
6 + 8 * 3,
7 + 8 * 3,
]),
B5_H5: BitBoard_1.default.fromPositions([
1 + 8 * 4,
2 + 8 * 4,
3 + 8 * 4,
4 + 8 * 4,
5 + 8 * 4,
6 + 8 * 4,
7 + 8 * 4,
]),
B6_H6: BitBoard_1.default.fromPositions([
1 + 8 * 5,
2 + 8 * 5,
3 + 8 * 5,
4 + 8 * 5,
5 + 8 * 5,
6 + 8 * 5,
7 + 8 * 5,
]),
B7_H7: BitBoard_1.default.fromPositions([
1 + 8 * 6,
2 + 8 * 6,
3 + 8 * 6,
4 + 8 * 6,
5 + 8 * 6,
6 + 8 * 6,
7 + 8 * 6,
]),
B8_H8: BitBoard_1.default.fromPositions([
1 + 8 * 7,
2 + 8 * 7,
3 + 8 * 7,
4 + 8 * 7,
5 + 8 * 7,
6 + 8 * 7,
7 + 8 * 7,
]),
C8_H8: BitBoard_1.default.fromPositions([
2 + 8 * 7,
3 + 8 * 7,
4 + 8 * 7,
5 + 8 * 7,
6 + 8 * 7,
7 + 8 * 7,
]),
D8_H8: BitBoard_1.default.fromPositions([
3 + 8 * 7,
4 + 8 * 7,
5 + 8 * 7,
6 + 8 * 7,
7 + 8 * 7,
]),
E8_H8: BitBoard_1.default.fromPositions([4 + 8 * 7, 5 + 8 * 7, 6 + 8 * 7, 7 + 8 * 7]),
F8_H8: BitBoard_1.default.fromPositions([5 + 8 * 7, 6 + 8 * 7, 7 + 8 * 7]),
G8_H8: BitBoard_1.default.fromPositions([6 + 8 * 7, 7 + 8 * 7]),
// South
G1_A1: BitBoard_1.default.fromPositions([0, 1, 2, 3, 4, 5, 6]),
F1_A1: BitBoard_1.default.fromPositions([0, 1, 2, 3, 4, 5]),
E1_A1: BitBoard_1.default.fromPositions([0, 1, 2, 3, 4]),
D1_A1: BitBoard_1.default.fromPositions([0, 1, 2, 3]),
C1_A1: BitBoard_1.default.fromPositions([0, 1, 2]),
B1_A1: BitBoard_1.default.fromPositions([0, 1]),
G2_A2: BitBoard_1.default.fromPositions([
0 + 8 * 1,
1 + 8 * 1,
2 + 8 * 1,
3 + 8 * 1,
4 + 8 * 1,
5 + 8 * 1,
6 + 8 * 1,
]),
G3_A3: BitBoard_1.default.fromPositions([
0 + 8 * 2,
1 + 8 * 2,
2 + 8 * 2,
3 + 8 * 2,
4 + 8 * 2,
5 + 8 * 2,
6 + 8 * 2,
]),
G4_A4: BitBoard_1.default.fromPositions([
0 + 8 * 3,
1 + 8 * 3,
2 + 8 * 3,
3 + 8 * 3,
4 + 8 * 3,
5 + 8 * 3,
6 + 8 * 3,
]),
G5_A5: BitBoard_1.default.fromPositions([
0 + 8 * 4,
1 + 8 * 4,
2 + 8 * 4,
3 + 8 * 4,
4 + 8 * 4,
5 + 8 * 4,
6 + 8 * 4,
]),
G6_A6: BitBoard_1.default.fromPositions([
0 + 8 * 5,
1 + 8 * 5,
2 + 8 * 5,
3 + 8 * 5,
4 + 8 * 5,
5 + 8 * 5,
6 + 8 * 5,
]),
G7_A7: BitBoard_1.default.fromPositions([
0 + 8 * 6,
1 + 8 * 6,
2 + 8 * 6,
3 + 8 * 6,
4 + 8 * 6,
5 + 8 * 6,
6 + 8 * 6,
]),
G8_A8: BitBoard_1.default.fromPositions([
0 + 8 * 7,
1 + 8 * 7,
2 + 8 * 7,
3 + 8 * 7,
4 + 8 * 7,
5 + 8 * 7,
6 + 8 * 7,
]),
F8_A8: BitBoard_1.default.fromPositions([
0 + 8 * 7,
1 + 8 * 7,
2 + 8 * 7,
3 + 8 * 7,
4 + 8 * 7,
5 + 8 * 7,
]),
E8_A8: BitBoard_1.default.fromPositions([
0 + 8 * 7,
1 + 8 * 7,
2 + 8 * 7,
3 + 8 * 7,
4 + 8 * 7,
]),
D8_A8: BitBoard_1.default.fromPositions([0 + 8 * 7, 1 + 8 * 7, 2 + 8 * 7, 3 + 8 * 7]),
C8_A8: BitBoard_1.default.fromPositions([0 + 8 * 7, 1 + 8 * 7, 2 + 8 * 7]),
B8_A8: BitBoard_1.default.fromPositions([0 + 8 * 7, 1 + 8 * 7]),
// North-East
B2_H8: BitBoard_1.default.fromPositions([9, 18, 27, 36, 45, 54, 63]),
C2_H7: BitBoard_1.default.fromPositions([
18 - 1 * 8,
27 - 1 * 8,
36 - 1 * 8,
45 - 1 * 8,
54 - 1 * 8,
63 - 1 * 8,
]),
D2_H6: BitBoard_1.default.fromPositions([
27 - 2 * 8,
36 - 2 * 8,
45 - 2 * 8,
54 - 2 * 8,
63 - 2 * 8,
]),
E2_H5: BitBoard_1.default.fromPositions([
36 - 3 * 8,
45 - 3 * 8,
54 - 3 * 8,
63 - 3 * 8,
]),
F2_H4: BitBoard_1.default.fromPositions([45 - 4 * 8, 54 - 4 * 8, 63 - 4 * 8]),
G2_H3: BitBoard_1.default.fromPositions([54 - 5 * 8, 63 - 5 * 8]),
H2: BitBoard_1.default.fromPositions([63 - 6 * 8]),
B3_G8: BitBoard_1.default.fromPositions([
9 + 8 * 1,
18 + 8 * 1,
27 + 8 * 1,
36 + 8 * 1,
45 + 8 * 1,
54 + 8 * 1,
]),
B4_F8: BitBoard_1.default.fromPositions([
9 + 8 * 2,
18 + 8 * 2,
27 + 8 * 2,
36 + 8 * 2,
45 + 8 * 2,
]),
B5_E8: BitBoard_1.default.fromPositions([
9 + 8 * 3,
18 + 8 * 3,
27 + 8 * 3,
36 + 8 * 3,
]),
B6_D8: BitBoard_1.default.fromPositions([9 + 8 * 4, 18 + 8 * 4, 27 + 8 * 4]),
B7_C8: BitBoard_1.default.fromPositions([9 + 8 * 5, 18 + 8 * 5]),
B8: BitBoard_1.default.fromPositions([9 + 8 * 6]),
// North-West
G2_A8: BitBoard_1.default.fromPositions([14, 21, 28, 35, 42, 49, 56]),
F2_A7: BitBoard_1.default.fromPositions([
14 - 1,
21 - 1,
28 - 1,
35 - 1,
42 - 1,
49 - 1,
]),
E2_A6: BitBoard_1.default.fromPositions([14 - 2, 21 - 2, 28 - 2, 35 - 2, 42 - 2]),
D2_A5: BitBoard_1.default.fromPositions([14 - 3, 21 - 3, 28 - 3, 35 - 3]),
C2_A4: BitBoard_1.default.fromPositions([14 - 4, 21 - 4, 28 - 4]),
B2_A3: BitBoard_1.default.fromPositions([14 - 5, 21 - 5]),
A2: BitBoard_1.default.fromPositions([14 - 6]),
G3_B8: BitBoard_1.default.fromPositions([
14 + 8 * 1,
21 + 8 * 1,
28 + 8 * 1,
35 + 8 * 1,
42 + 8 * 1,
49 + 8 * 1,
]),
G4_C8: BitBoard_1.default.fromPositions([
14 + 8 * 2,
21 + 8 * 2,
28 + 8 * 2,
35 + 8 * 2,
42 + 8 * 2,
]),
G5_D8: BitBoard_1.default.fromPositions([
14 + 8 * 3,
21 + 8 * 3,
28 + 8 * 3,
35 + 8 * 3,
]),
G6_E8: BitBoard_1.default.fromPositions([14 + 8 * 4, 21 + 8 * 4, 28 + 8 * 4]),
G7_F8: BitBoard_1.default.fromPositions([14 + 8 * 5, 21 + 8 * 5]),
G8: BitBoard_1.default.fromPositions([14 + 8 * 6]),
// South-East
B7_H1: BitBoard_1.default.fromPositions([49, 42, 35, 28, 21, 14, 7]),
C7_H2: BitBoard_1.default.fromPositions([
49 + 1,
42 + 1,
35 + 1,
28 + 1,
21 + 1,
14 + 1,
]),
D7_H3: BitBoard_1.default.fromPositions([49 + 2, 42 + 2, 35 + 2, 28 + 2, 21 + 2]),
E7_H4: BitBoard_1.default.fromPositions([49 + 3, 42 + 3, 35 + 3, 28 + 3]),
F7_H5: BitBoard_1.default.fromPositions([49 + 4, 42 + 4, 35 + 4]),
G7_H6: BitBoard_1.default.fromPositions([49 + 5, 42 + 5]),
H7: BitBoard_1.default.fromPositions([49 + 6]),
B6_G1: BitBoard_1.default.fromPositions([
49 - 8 * 1,
42 - 8 * 1,
35 - 8 * 1,
28 - 8 * 1,
21 - 8 * 1,
14 - 8 * 1,
]),
B5_F1: BitBoard_1.default.fromPositions([
49 - 8 * 2,
42 - 8 * 2,
35 - 8 * 2,
28 - 8 * 2,
21 - 8 * 2,
]),
B4_E1: BitBoard_1.default.fromPositions([
49 - 8 * 3,
42 - 8 * 3,
35 - 8 * 3,
28 - 8 * 3,
]),
B3_D1: BitBoard_1.default.fromPositions([49 - 8 * 4, 42 - 8 * 4, 35 - 8 * 4]),
B2_C1: BitBoard_1.default.fromPositions([49 - 8 * 5, 42 - 8 * 5]),
B1: BitBoard_1.default.fromPositions([49 - 8 * 6]),
// South-West
G7_A1: BitBoard_1.default.fromPositions([54, 45, 36, 27, 18, 9, 0]),
F7_A2: BitBoard_1.default.fromPositions([
54 - 1,
45 - 1,
36 - 1,
27 - 1,
18 - 1,
9 - 1,
]),
E7_A3: BitBoard_1.default.fromPositions([54 - 2, 45 - 2, 36 - 2, 27 - 2, 18 - 2]),
D7_A4: BitBoard_1.default.fromPositions([54 - 3, 45 - 3, 36 - 3, 27 - 3]),
C7_A5: BitBoard_1.default.fromPositions([54 - 4, 45 - 4, 36 - 4]),
B7_A6: BitBoard_1.default.fromPositions([54 - 5, 45 - 5]),
A7: BitBoard_1.default.fromPositions([54 - 6]),
G6_B1: BitBoard_1.default.fromPositions([
54 - 8 * 1,
45 - 8 * 1,
36 - 8 * 1,
27 - 8 * 1,
18 - 8 * 1,
9 - 8 * 1,
]),
G5_C1: BitBoard_1.default.fromPositions([
54 - 8 * 2,
45 - 8 * 2,
36 - 8 * 2,
27 - 8 * 2,
18 - 8 * 2,
]),
G4_D1: BitBoard_1.default.fromPositions([
54 - 8 * 3,
45 - 8 * 3,
36 - 8 * 3,
27 - 8 * 3,
]),
G3_E1: BitBoard_1.default.fromPositions([54 - 8 * 4, 45 - 8 * 4, 36 - 8 * 4]),
G2_F1: BitBoard_1.default.fromPositions([54 - 8 * 5, 45 - 8 * 5]),
G1: BitBoard_1.default.fromPositions([54 - 8 * 6]),
};