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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
.pragma library
/**
* Check if the case on the grid belongs to the first column.
*/
function isFirstCol(index, cols) {
return index % cols == 0;
}
/**
* Check if the case on the grid belongs to the last column.
*/
function isLastCol(index, cols) {
return index % cols == cols - 1;
}
/**
* Check if the case on the grid belongs to the first row
*/
function isFirstRow(index, cols) {
return index < cols;
}
/**
* Check if the case on the grid belongs to the last row.
*/
function isLastRow(index, cols, rows) {
return cols * (rows - 1) <= index;
}
/**
* Get all the neighbors for a given position.
*/
function getNeighbors(index, cols, rows) {
var neighbors = [];
if (!isFirstCol(index, cols)) {
neighbors.push(index - 1)
}
if (!isLastCol(index, cols)) {
neighbors.push(index + 1)
}
if (!isFirstRow(index, cols)) {
neighbors.push(index - cols)
}
if (!isLastRow(index, cols, rows)) {
neighbors.push(index + cols)
}
return neighbors;
}
function getChainToRemove(index, datas, cols, rows, filter) {
var piecesToCheck = [];
var piecesToRemove = [];
/*
* filter wich keep only free places.
*/
function freePlaces(x) {
return datas.itemAt(x).getType() === "";
}
var piece = index;
while (piece !== undefined) {
/* if the case has already been marked, do not check it again.
*/
if (!datas.itemAt(piece).mark) {
datas.itemAt(piece).mark = true;
piecesToRemove.push(piece);
var neighbors = getNeighbors(piece, cols, rows);
if (neighbors.length !== 0) {
/*
* If the place has liberty, return empty list.
*/
if (neighbors.some(freePlaces)) {
return [];
}
/*
* Now update the check list.
*/
neighbors.filter(filter).forEach(function(x) {
piecesToCheck.push(x)
});
}
} else {
/*
* The piece may have been marked outside of this call.
* (We try to check chain in each direction, and return as soon as
* we find an empty place).
* If the piece is marked, but does not belongs to the piecesToRemove,
* we assume the piece is connected to a living chain, and
* subsequently this chain too.
*/
if (! piecesToRemove.some(function(x) { return x === piece})) {
return [];
}
}
piece = piecesToCheck.pop();
}
return piecesToRemove;
}
|