Passed
Push — master ( 74547d...add66c )
by Christofer
01:15
created

src/chess/Board.js   A

Size

Lines of Code 187

Duplication

Duplicated Lines 0
Ratio 0 %

Test Coverage

Coverage 88.68%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
nc 1
dl 0
loc 187
ccs 47
cts 53
cp 0.8868
rs 10
noi 3

1 Function

Rating   Name   Duplication   Size   Complexity  
A Board.js ➔ ??? 0 16 1
1
/**
2
 * A Chess board module
3
 * @module
4
 */
5
"use strict";
6
7
/**
8
 * Board class contains methods for setting up a chess board
9
 */
10
class Board {
11
    /**
12
     * Prepare board properties and init empty board
13
     */
14
    constructor() {
15 6
        this.board = {
16
            "A": [],
17
            "B": [],
18
            "C": [],
19
            "D": [],
20
            "E": [],
21
            "F": [],
22
            "G": [],
23
            "H": [],
24
        };
25
26 6
        this.rows = [null, "A", "B", "C", "D", "E", "F", "G", "H"];
27
28 6
        this.setUpEmptyTable();
29
    }
30
31
32
    /**
33
     * Set up empty board
34
     */
35
    setUpEmptyTable() {
36 6
        for (var key in this.board) {
0 ignored issues
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
37 48
            this.board[key] =
38
            [key, key + 1, key + 2, key + 3, key + 4, key + 5, key + 6, key + 7, key + 8];
39
        }
40
    }
41
42
43
    /**
44
     * get the full board
45
     *
46
     * @returns {object} - current board state
47
     */
48
    getBoard() {
49 1
        return this.board;
50
    }
51
52
    /**
53
     * Check if the is anything blocking the path between 2 squares
54
     *
55
     * @returns {mixed} - true if free or square Coo if false
56
     */
57
    checkRow(x, y, nx, ny) {
58 2
        const direction = x == nx ? "horisontal" : "vertical";
59
        let row, list, xNumber, nxNumber, i;
60
61 2
        if (direction === "horisontal") {
62 1
            row = this.board[x];
63
            // Slice array to get squares to check
64 2
            list = y < ny ? row.slice(y + 1, ny) : row.slice(ny + 1, y);
65
        } else {
66 1
            row = [];
67 1
            for (i = 1; i < this.rows.length; i++) {
68 8
                row.push(this.board[this.rows[i]][y]);
69
            }
70
            // get numeric value of x nx
71 1
            xNumber = this.rows.indexOf(x);
72 1
            nxNumber = this.rows.indexOf(nx);
73
74
            // Slice array to get squares to check
75 2
            list = xNumber < nxNumber ? row.slice(xNumber + 1, nxNumber) : row.slice(nxNumber + 1, xNumber);
76
        }
77
78
        // loop squares and check type
79 2
        for (i = 0; i < list.length; i++) {
80 4
            if (typeof list[i] !== "string") {
81 1
                return false;
82
            }
83
        }
84
85 1
        return true;
86
    }
87
88
    /**
89
     * Check if the is anything blocking the path between 2 squares
90
     *
91
     * @returns {bool} - true if free else false
92
     */
93
    checkDiagonal(x, y, nx, ny) {
94
        let xNumber, nxNumber, steps;
95 2
        steps = Math.abs(y - ny);
96 2
        xNumber = this.rows.indexOf(x)
97 2
        nxNumber = this.rows.indexOf(nx)
98
99 6
        if (xNumber < nxNumber && y < ny || xNumber > nxNumber && y > ny) {
100 2
            y = y > ny ? ny : y;
101 2
            xNumber = xNumber > nxNumber ? nxNumber : xNumber;
102 2
            for (let i = 1; i < steps; i++) {
103 2
                if (typeof this.board[this.rows[xNumber + i]][y + i] == "object") {
104 1
                    return false
105
                }
106
            }
107
        } else {
108 2
            y = y < ny ? ny : y;
109 2
            xNumber = xNumber > nxNumber ? nxNumber : xNumber;
110
            for (let i = 1; i < steps; i++) {
111 2
                if (typeof this.board[this.rows[xNumber + i]][y - i] == "object") {
112
                    return false
113
                }
114
            }
115
        }
116 1
        return true
117
    }
118
119
    /**
120
     * get a value for a specific square
121
     *
122
     * @returns {string}
123
     */
124
    getSquare(row, col) {
125 7
        return this.board[row][col];
126
    }
127
128
129
    /**
130
     * change the value of a square
131
     *
132
     * @returns {null}
133
     */
134
    updateSquare(row, col, value) {
135 4
        this.board[row][col] = value;
136
    }
137
138
139
    /**
140
     * Move a piece to another square
141
     * @param {int} - x, y, nx, ny
0 ignored issues
show
Documentation introduced by
The parameter - does not exist. Did you maybe forget to remove this comment?
Loading history...
142
     * old xy coordinates and new xy coordinates
143
     *
144
     */
145
    move(x, y, nx, ny) {
146 1
        const piece = this.getSquare(x, y);
147
148 1
        this.updateSquare(x, y, x + y);
149 1
        this.updateSquare(nx, ny, piece);
150
    }
151
152
153
    /**
154
     * Check that destination is no of the same color as mover
155
     * @return {bool}
156
     */
157
    checkDestination(turn, x, y) {
158
        const piece = this.getSquare(x, y);
159
160 2
        if (turn === piece.color) {
161
            return false;
162
        }
163
164
        return true;
165
    }
166
167
168
    /**
169
     * Asciify board
170
     *
171
     * @returns {String}
172
     */
173
    getAsciiBoard() {
174 1
        let ascii = "";
175
176 1
        for (var key in this.board) {
0 ignored issues
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
177 8
            for (let i = 0; i < this.board[key].length; i++) {
178 72
                if (typeof this.board[key][i] === "object") {
179
                    ascii += this.board[key][i].symbol + this.board[key][i].color[0] +  " | "
180
                } else {
181 72
                    ascii += this.board[key][i] +  " | ";
182
                }
183
            }
184 8
            ascii += "\n";
185
        }
186 1
        return ascii;
187
    }
188
}
189
190
191
module.exports = Board;
192